天天看點

【CI/CD】docker結合gitlab-runner自動釋出

最近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

【CI/CD】docker結合gitlab-runner自動釋出
【CI/CD】docker結合gitlab-runner自動釋出

會有很多步驟的選項,一路next安裝。安裝完畢,右鍵可以看到出現了git相關的指令

【CI/CD】docker結合gitlab-runner自動釋出

三 第二步:在gitlab建立項目,并上傳本地代碼

我使用的是公司的gitlab倉庫,是安裝好的,是以不需要安裝了。建立gitlab項目

git上傳本地代碼流程參考:

https://blog.csdn.net/qq_37674858/article/details/80829340

上傳成功後如下

【CI/CD】docker結合gitlab-runner自動釋出

四 安裝gitlab-runner,并注冊。參照上一篇文章

https://blog.csdn.net/w8998036/article/details/108532734

五 編寫yml檔案指令

點選CI/CD configration,會建立yml指令檔案,可以編寫簡單的語句測試下runner是否有效

【CI/CD】docker結合gitlab-runner自動釋出
【CI/CD】docker結合gitlab-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的執行資訊

【CI/CD】docker結合gitlab-runner自動釋出
【CI/CD】docker結合gitlab-runner自動釋出
【CI/CD】docker結合gitlab-runner自動釋出

然後在runner的機器/etc/gitlab-runner可以看到輸出的log檔案

【CI/CD】docker結合gitlab-runner自動釋出

如此則說明runner運作成功了!

六 打包項目,docker建立鏡像并釋出

在第五步runner建立成功後,會在runner伺服器下載下傳項目的代碼,位址在/etc/gitlab-runner/builds/Q_zurexD/0/Hadoop/idap

【CI/CD】docker結合gitlab-runner自動釋出

我的項目是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包的

【CI/CD】docker結合gitlab-runner自動釋出

編寫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
           

通路頁面

【CI/CD】docker結合gitlab-runner自動釋出

整個第六步需要結合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檔案

【CI/CD】docker結合gitlab-runner自動釋出
【CI/CD】docker結合gitlab-runner自動釋出

要啟動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
           
【CI/CD】docker結合gitlab-runner自動釋出

通路harbor,使用admin/Harbor12345登入

【CI/CD】docker結合gitlab-runner自動釋出
【CI/CD】docker結合gitlab-runner自動釋出

鏡像導入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時可能報錯

【CI/CD】docker結合gitlab-runner自動釋出

添加網站信任,修改"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的項目已經上傳

繼續閱讀