最近team内對k8s,docker比較感興趣,想了解CI/CD相關的内容,我争取了該任務,做了些相關的工作,研究了大概一個禮拜,初步完成了從gitlab代碼送出用docker自動釋出版本的工作(還未涉及k8s),在此記錄
一 涉及到的軟體版本
版本 | 介紹 | |
docker | 19.03.8 | 不知道的不用往下看了 |
git | 2.28.0 windows | 分布式版本控制系統 |
gitlab | 12.5.5 | 一個用于倉庫管理系統的開源項目,使用Git作為代碼管理工具 |
gitlab-runner | 12.8.0 | gitlab提供的持續內建工具 |
harbor | v2.1.0-rc2 | 一個用于存儲和分發Docker鏡像的企業級Registry伺服器 |
伺服器環境是centos7
二 第一步:本地安裝git
下載下傳位址https://git-scm.com/download/win
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5YjM4MzN1QTM2ETOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
會有很多步驟的選項,一路next安裝。安裝完畢,右鍵可以看到出現了git相關的指令
三 第二步:在gitlab建立項目,并上傳本地代碼
我使用的是公司的gitlab倉庫,是安裝好的,是以不需要安裝了。建立gitlab項目
git上傳本地代碼流程參考:
https://blog.csdn.net/qq_37674858/article/details/80829340
上傳成功後如下
四 安裝gitlab-runner,并注冊。參照上一篇文章
https://blog.csdn.net/w8998036/article/details/108532734
五 編寫yml檔案指令
點選CI/CD configration,會建立yml指令檔案,可以編寫簡單的語句測試下runner是否有效
#定義過程
stages:
- build //可自定義
- test
#定義job
init5:
stage: build //定義job的執行階段
tags: //重要,這個标簽是指定本job使用哪個标簽的runner來執行,可以為空,為空則沒有标簽的runner會執行
- idat
script: //shell腳本,這裡到時會用來build java項目,并且用docker打包鏡像
- echo 'init ok' > /etc/gitlab-runner/b.log
- pwd
testcase:
stage: test
tags:
- idat
script:
- echo 'test ok' > /etc/gitlab-runner/c.log
修改之後儲存yml,去檢視CI/CD界面,可以看到新的pipeline建立了,點進去可以檢視到job的執行資訊
然後在runner的機器/etc/gitlab-runner可以看到輸出的log檔案
如此則說明runner運作成功了!
六 打包項目,docker建立鏡像并釋出
在第五步runner建立成功後,會在runner伺服器下載下傳項目的代碼,位址在/etc/gitlab-runner/builds/Q_zurexD/0/Hadoop/idap
我的項目是javaweb項目,可以用java的jar指令打包,因為jar指令隻是對檔案進行打包,沒有編譯,是以在送出代碼的時候需要将WebContent/WEB-INF/下的class檔案送出,打包時進去WebContent目錄,使用下面的指令打成war包,打成war放到tomcat的webapp下面
jar -cvf /root/javaweb/apache-tomcat-8.5.42/webapps/idat.war ./*
接下去用docker打包鏡像并釋出
首先把java需要的環境jdk,tomcat放到指定目錄/root/javaweb,結合上面的的war包,tomcat下面是有war包的
編寫Dockerfile
#建立作業系統環境
FROM centos
#自定義描述
MAINTAINER 682556
#建立容器目錄
RUN mkdir -p /opt
#将本地java環境打入容器
ADD java-1.8.0-openjdk-1.8.0.232.b09-0.el8_0.x86_64 /opt/jdk
#将本地tomcat(含war包)環境打入容器
ADD apache-tomcat-8.5.42 /opt/tomcat
#設定java,tomcat環境
ENV JAVA_HOME /opt/jdk
ENV CATALINA_HOME /opt/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#綁定端口。這裡端口自定義,且需要在tomcat server.xml檔案中也改成相同端口,切記
EXPOSE 8099
#釋放目錄,這步不一定要用。我在做的時候,在執行/opt/tomcat/bin/catalina.sh指令時,顯示權限不夠,是以在這釋放目錄
RUN chmod -R 777 /opt
#啟動tomcat
CMD ["/opt/tomcat/bin/catalina.sh","run"]
docker打包鏡像
docker build -t idat2 .
docker啟動鏡像
docker run -d -p 8099:8099 --name idat2 idat2:latest
通路頁面
整個第六步需要結合gitlab-runner自動釋出,那麼将上面的步驟寫入yml,就可以實作自動釋出
stages:
- build
- image
- run
buildwar:
stage: build
tags:
- idat
only
- master
script:
- echo 'build start'
- pwd
- cd WebContent
- rm -f /root/javaweb/apache-tomcat-8.5.42/webapps/idat.war
- jar -cvf /root/javaweb/apache-tomcat-8.5.42/webapps/idat.war ./*
- echo 'build end'
buildimage:
stage: image
tags:
- idat
script:
- echo 'image start'
- cd /root/javaweb
- docker build -t idat2 .
runapp:
stage: run
tags:
- idat
script:
- docker run -d -p 8099:8099 --name idat2 idat2:latest
自動釋出完成!
七 鏡像導入私有倉庫
官方的registry倉庫沒有權限控制,可以使用Harbor倉庫
Harbor的安裝比較簡單,下載下傳位址https://github.com/goharbor/harbor/releases
下載下傳後直接解壓,修改/root/harbor/harbor.yml檔案
要啟動harbor還需要docker-compose的支援,按照下面指令安裝
curl -L https://github.com/docker/compose/releases/download/1.27.0/run.sh > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
安裝完成之後,啟動harbor,要等幾分鐘
./install.sh
通路harbor,使用admin/Harbor12345登入
鏡像導入harbor指令
docker login -u admin -p Harbor12345 10.38.150.64:8090
docker tag idat2:latest 10.38.150.64:8090/library/idat2:latest
docker push 10.38.150.64:8090/library/idat2:latest
docker login harbor時可能報錯
添加網站信任,修改"insecure-registries"屬性,将harbor位址添加進去
vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://dockerhub.azk8s.cn", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com/", "https://registry.docker-cn.com"],
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"insecure-registries": ["127.0.0.1/8","10.38.150.64:8090"],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/var/lib/docker"
}
重新開機docker服務,重新登入harbor成功
systemctl restart docker
檢視harbor,idat2的項目已經上傳