長話短說 經過長時間實操驗證,,終于完成基于Gitlab的CI/CD實踐,本次實踐的坑位很多,, 實操過程盡量接近最佳實踐(不做hack, 不做騷操作),,記錄下來加深理解。
P1:Gitlab CI/CD原理和Gitlab Runner安裝(這里使用shell執(zhí)行器) P2:基于Docker-compose的Gitlab CI/CD 實踐:
Gitlab CI/CD部署準備
Gitlab CI/CD提供配置界面(項目菜單欄-設置-CI/CD),可指定 將要使用何種形式的Runner 配置Runner要用到環(huán)境變量
本次手動設置特定Gitlab Runner: Runner安裝完畢,,注冊Runner(與Gitlab Projects實例建立綁定關系) 注冊時要關注的兩個配置:
注冊過程和結果請參考下圖: Gitlab CI/CD實踐
Gitlab-CI Pipeline構建ReceiverAPP,、webAPP鏡像(附帶本次git:tag)并推送到hub.docker.com; Gitlab-CD docker-compose拉取遠端nginx,、ReceiveAPP,、webapp鏡像,啟動容器,。
以上Gitlab Pipeline定義build->build_image->deploy3個任務,某些任務還包括不同分支Job,寫.gitlab-ci.yml 的過程就是將以上執(zhí)行動作腳本化,。 stages: - build - build_image - deploy
variables: # CI_DEBUG_TRACE: 'true' deploy_path: '/home/xxxx/eqidmanager' # CI變量,,用于配置部署目錄
before_script: - 'docker info'
build: stage: build script: - 'for d in $(ls src);do echo $d;prog=$(pwd)/src/$d/$d.csproj; dotnet build $prog; done' tags: - another-tag
build_image:EqidManager: stage: build_image script: - dotnet publish src/EqidManager/EqidManager.csproj -c release -o ../../container/app/publish/ - docker build --pull -t $CI_REGISTRY_USER/eqidmanager:$CI_COMMIT_REF_NAME container/app - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - docker push $CI_REGISTRY_USER/eqidmanager:$CI_COMMIT_REF_NAME tags: - another-tag only: #Pipeline Job構建策略,代碼倉庫打tag會執(zhí)行該任務,, 支持正則 - tags
build_image:EqidReceiver: stage: build_image script: - dotnet publish src/EqidReceiver/EqidReceiver.csproj -c release -o ../../container/receiver/publish - docker build -t $CI_REGISTRY_USER/eqidreceiver:$CI_COMMIT_REF_NAME container/receiver - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD - docker push $CI_REGISTRY_USER/eqidreceiver:$CI_COMMIT_REF_NAME tags: - my-tag only: - tags
deploy:staging: stage: deploy script: - cd $deploy_path - export TAG=$CI_COMMIT_REF_NAME # 引入本次CI的git:tag名稱,,覆蓋.env文件默認配置 - 'docker-compose -f docker-compose.yml -f docker-compose.prod.yml build' - 'docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d' tags: - my-tag
deploy:prod: stage: deploy script: - # TODO 需要寫腳本登陸到Prod機器上 - export TAG=$CI_COMMIT_REF_NAME - cd $deploy_path - 'docker-compose -f docker-compose.yml -f docker-compose.prod.yml build' - 'docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d' tags: - my-tag when: manual 這里有些知識點、坑位需要指出: 第8行:預先定義的環(huán)境變量,,該變量定義gitlab CD的部署目錄 第16行: 對src開發(fā)目錄下兩個程序執(zhí)行dotnet build命令 第17行:tags定義具備該tags的Runner可以執(zhí)行該任務,,注意這里的tags必須是字符串數組 第23-26行:構建鏡像并推送到鏡像倉庫的過程,用到兩類CI變量 - 密鑰變量CI_REGISTRY_USER,、CI_REGISTRY_PASSWORD,,可在Gitlab-CI界面配置 - 預定義變量CI_COMMIT_REF_NAME,該變量標記構建項目的git:branch或git:tag名稱,,用于生成Image:Tag
第29行:only定義此Job只在產生git:tag時被觸發(fā),與上面我們使用CI-COMMIT_REF_NAME 變量相呼應 第47行:Gialab-CI pipeline每個Job會重新拉取git源碼執(zhí)行Job任務(可登錄到Gitlab Runner工作目錄下觀察Runner執(zhí)行過程),,CD時需要選擇合適目錄,,這是deploy_staging上使用deploy_path CI變量的原因 第48行:注入本次Gitlab-CI git:tag名稱,實際上是覆蓋了.env同名環(huán)境變量 第49行:若存在docker-compose.yml、docker-compose.override.yml 兩個文件,,docker-compose命令會自動merge這2個文件(使用docker-compose config命令查看merge之后的結果),。 第64行:前置任務未出錯,會自動執(zhí)行后繼任務,;而when指令定義該任務需要界面上手動執(zhí)行 在Gitlab Runner服務器的{deploy_path}路徑下建立了如下部署文件:
------.env 文件---- TAG=master # 該TAG變量會在Pipeline:deploy_staging任務中被覆蓋,形成基于git:tag的imageName:tag docker_host=172.16.1.1 COMPOSE_PROJECT_NAME=EqidManager DOCKER_REGISTRY=*** Project打上git:tag之后,,觸發(fā)Gitlab Runner CI/CD Pipeline: 跳轉到部署目錄->應用本次git:tag->執(zhí)行docker-compose命令拉取指定tag鏡像并啟動容器,。 That'all, 本次應用Gitlab Runner(shell執(zhí)行器)實踐CI/CD, Gitlab菜單界面有所有構建構成的日志(便于排查構建問題);另外上文對于關鍵知識均附帶傳送門,,可進一步對比研究,。 + https://www.cnblogs.com/JulianHuang/p/10919346.html + https://docs./runner/register/index.html + https://docs./runner/executors/README.html |
|