物聯網架構成長之路(47)-利用GitLab實現CI持續整合
0.前言
前段時間,考慮到要練習部署一套CI/CD的系統。一開始考慮到Jenkins,隨著這兩天的瞭解,發現最新版的GitLab已經提供有CI/CD集成了。所以本次部落格,乾脆一步到位,直接用GitLab裡面的CI/CD模組。Jenkins可能需要更高階的應用場合。經過測試GitLab自帶的功能完全符合我的需求。
1. 安裝GitLab和GitLab-CI(gitlab-runner)
英語比較好的,可以直接看官方文件。https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose https://docs.gitlab.com/ee/ci/quick_start/README.html
1 version: '3' 2 services: 3 gitlab: 4 image: twang2218/gitlab-ce-zh:latest 5 #image: gitlab/gitlab-ce:rc 6 restart: always 7 hostname: '172.16.23.203' 8 environment: 9 GITLAB_OMNIBUS_CONFIG: | 10 external_url 'http://172.16.23.203:8929' 11 gitlab_rails["time_zone"] = "Asia/Shanghai" 12 ports: 13 - 8929:8929 14 - 1080:80 15 - 1443:443 16 - 1022:22 17 volumes: 18 - /root/workspace/docker/gitlab/1/config:/etc/gitlab 19 - /root/workspace/docker/gitlab/1/logs:/var/log/gitlab 20 - /root/workspace/docker/gitlab/1/data:/var/opt/gitlab 21 gitlab-runner: 22 image: gitlab/gitlab-runner:latest 23 restart: always 24 volumes: 25 - /root/workspace/docker/gitlab/2/config:/etc/gitlab-runner 26 - /var/run/docker.sock:/var/run/docker.sock
執行docker-compose up -d 就執行起來,幾點需要說明的
1. gitlab的image,可以選擇中文版或者英文版
2. hostname 這裡指定本機IP地址
3. gitlab環境變數,external_url表示提供訪問的IP和埠,時區配置上海
4. 埠對映,預設是80埠,由於我上面配置了8929,所以對映8929到Host主機
5. volumes 配置持久化資料
6. 這裡的/var/run/docker.sock 要對映到主機,因為會用到主機的一些資源,同時還會在docker裡面安裝docker
下面是執行效果,第一次執行會比較久,因為要拉取映象和初始化GitLab
2. 登入使用GitLab
首次登入,設定密碼。 登入預設使用者名稱是root
利用模版,新建一個Spring專案
利用IDE,或者其他工具,或者直接在GitLab修改程式碼
3. 配置CI/CD,把機器(gitlab-runner)註冊到GitLab中
可以在專案配置CI/CD機器,也可以在個人所有專案下配置,也可以由管理員配置所有專案下CI/CD機器。原理和流程都是一樣的,只是比Jenkins更加細粒度控制而已。
進入gitlab-runner的Docker,執行初始化命令 gitlab-ci-multi-runner register,完整命令如下:
1 sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
需要錄入的資訊,安裝上圖進行,填寫,後續還可以修改。
如果需要修改,可以修改之前volumes配置的路徑下, config/config.toml
1 concurrent = 1 2 check_interval = 0 3 4 [session_server] 5 session_timeout = 1800 6 7 [[runners]] 8 name = "myRunner" 9 url = "http://172.16.23.203:8929/" 10 token = "96beefdaa54832b0c8369ffa3811c9" 11 executor = "docker" 12 [runners.custom_build_dir] 13 [runners.docker] 14 tls_verify = false 15 image = "docker:latest" 16 privileged = true 17 disable_entrypoint_overwrite = false 18 oom_kill_disable = false 19 disable_cache = false 20 volumes = ["/cache", "/root/.m2:/root/.m2", "/var/run/docker.sock:/var/run/docker.sock"] 21 shm_size = 0 22 [runners.cache] 23 [runners.cache.s3] 24 [runners.cache.gcs]
上面這個是配置檔案,裡面有幾個注意點
1. privileged 這裡要配置 true,因為要在docker裡面安裝docker
2. /root/.m2 這個是配置maven的倉庫使用宿主主機的快取,這樣就不用每次CI都要下載依賴
3. /var/run/docker.sock 這個也要配置,在構建dockerfile的時候會用到
還有一個需要配置的就是,這個Runner需要設定tag,這個是標識Runner的名稱。在.gitlab-ci.yml中會用到
4. 配置CI/CD
預設GitLab是啟用該功能的,根目錄配置新增 .gitlab-ci.yml 檔案,然後每次git push,都會觸發CI持續整合。當然可以在yml配置,在主線master觸發。
來個簡單的配置,測試一下
1 image: maven:3-jdk-8 2 cache: 3 paths: 4 - .m2/repository 5 test: 6 stage: test 7 script: 8 - mvn package 9 tags: 10 - tag
上面這個配置,寫到.gitlab-ci.yml然後提交到repo,我們提交該檔案到gitlab對應專案上去。
1 git add .gitlab-ci.yml 2 git commit -m "Add .gitlab-ci.yml" 3 git push origin master
如果嫌慢,pom.xml 可以換個阿里源
1 <repository> 2 <id>maven-ali</id> 3 <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 4 <releases> 5 <enabled>true</enabled> 6 </releases> 7 <snapshots> 8 <enabled>true</enabled> 9 <updatePolicy>always</updatePolicy> 10 <checksumPolicy>fail</checksumPolicy> 11 </snapshots> 12 </repository>
一提交,就會觸發自動構建
可以看到整個構建過程,如果出現錯誤,也是到這個日誌裡面排查問題。
5. 測試、打包、釋出
這一步,我們實現一個簡單的測試、打包、釋出
5.1 增加 Dockerfile
1 FROM openjdk:8-jdk-alpine 2 VOLUME /tmp 3 COPY target/demo-0.0.1-SNAPSHOT.jar app.jar 4 ENV PORT 5000 5 EXPOSE $PORT 6 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]
5.2 修改 .gitlab-ci.yml
1 image: maven:3-jdk-8 2 3 variables: 4 DOCKER_TAG: test/demo-spring:0.1 5 6 cache: 7 paths: 8 - .m2/repository 9 10 stages: 11 - test 12 - package 13 - deploy 14 15 test: 16 stage: test 17 tags: 18 - tag 19 script: 20 - mvn test 21 22 package: 23 stage: package 24 tags: 25 - tag 26 script: 27 - mvn clean package -Dmaven.test.skip=true 28 artifacts: 29 paths: 30 - target/*.jar 31 32 deploy: 33 image: docker:latest 34 stage: deploy 35 services: 36 - docker:dind 37 tags: 38 - tag 39 script: 40 - docker version 41 - docker build -t $DOCKER_TAG . 42 - docker rm -f test || true 43 - docker run -d --name test -p 5000:5000 $DOCKER_TAG
那個artifacts.paths 配置,提交target目錄下的檔案到下一個流水線,因為不同流水線,由於是基於Docker,所以每一步都是隔離的。同時,上傳的附件還可以在構建成功後,在流水線pipelines介面進行下載。每一步的image都是可以指定的,那個tags也是可以指定的。可以提交到不同的機器進行構建。
上面一共就三步流程,先test(測試),然後package(打包編譯),最後deploy(釋出測試)。前兩個比較好理解,就是maven的基本命令。最後那個deploy就是利用docker裡面的docker來進行打包成docker,然後執行起來,作為測試釋出。
更新程式碼.gitlab-ci.yml,然後提交,觸發持續整合。
檢視構建日誌
檢視宿主機映象和執行狀態
檢視瀏覽器,已經發布到測試環境了
5.3 釘釘通知
1 image: maven:3-jdk-8 2 3 variables: 4 DOCKER_TAG: test/demo-spring:0.1 5 6 cache: 7 paths: 8 - .m2/repository 9 10 stages: 11 - test 12 - package 13 - deploy 14 - notify 15 16 test: 17 stage: test 18 tags: 19 - tag 20 script: 21 - mvn test 22 23 package: 24 stage: package 25 tags: 26 - tag 27 script: 28 - mvn clean package -Dmaven.test.skip=true 29 artifacts: 30 paths: 31 - target/*.jar 32 33 deploy: 34 image: docker:latest 35 stage: deploy 36 services: 37 - docker:dind 38 tags: 39 - tag 40 script: 41 - docker version 42 - docker build -t $DOCKER_TAG . 43 - docker rm -f test || true 44 - docker run -d --name test -p 5000:5000 $DOCKER_TAG 45 46 notify: 47 image: appropriate/curl:latest 48 stage: notify 49 tags: 50 - tag 51 script: "curl 'https://oapi.dingtalk.com/robot/send?access_token=d6c15304c1***************************************' -H 'Content-Type: application/json' -d '{\"msgtype\": \"text\", \"text\": {\"content\": \"功能已更新部署至測試環境\"}}' "
有了這個通知,就可以做很多事情了,寫個指令碼,封裝成一個Docker 映象,可以傳送釘釘,傳送郵件,可以對接到第三方系統等。
更多高階應用,如整合之前瞭解的Harbor,Rancher。使整個系統更加強大,更加智慧化。
參考資料
https://cloud.tencent.com/developer/article/1010595
https://www.cnblogs.com/Sinte-Beuve/p/11582511.html
https://my.oschina.net/u/2303182/blog/3072694/
https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose
https://docs.gitlab.com/ee/ci/quick_start/README.html
本文地址:https://www.cnblogs.com/wunaozai/p/11865362.html
本系列目錄: https://www.cnblogs.com/wunaozai/p/8067577.html
個人主頁:https://www.wunaozai.com/
volum