上次教到如何使用 environment 去自動設置我們環境那些,今天我們要教 CI/CD 中的 when,通常在自動化佈署上線流程,並不會一路像前幾次一樣,先佈署到測試機,再佈署 demo 機,最後佈署到正式機,我們在佈署正式機的時候,通常會做一個防呆,比如說做成一個指令集,或者是按鈕等等,以避免出嚴重大錯
when 是可以幫助我們在自動化佈署時,可以定義那些工作,是可以不要這麼早,就有所動作,等到我們比較確定的時候,比如說我們按下按鈕,這個工作才會開始運作,所以也可以讓我們做個半自動化,而不是全自動化
when 這個 script 在 Gitlab CI/CD 底下提供了一些語法,以下是在 Gitlab 官網所到的,在文章的最地下,會提供相關網址
在我個人比較常使用的是 manual 這個語法,他可以在工作前,提供一個按鈕,讓我們手動按下去,才執行工作,有如以下範例
image: mcr.microsoft.com/dotnet/sdk:6.0
stages:
- deploy
deploy:
stage: deploy
when: manual
script:
- echo 'deploy service'
接下來我們開始使用這個 when 語法,在我們 deploy-to-production 這個工作加上 when 這個語法,讓我們正式機不要這麼快馬上上線
image: mcr.microsoft.com/dotnet/sdk:6.0
stages:
- deploy
.deploy:
tags:
- shell
variables:
SERVER_NAME: ""
SERVER_PRIVATE_KEY: ""
SERVER_USER_NAME: ""
SERVER_URL: ""
SERVER_PORT: ""
SERVER_ENV: ""
before_script:
- eval $(ssh-agent -s)
- ssh-add <(echo "$SERVER_PRIVATE_KEY")
- echo $DOCKER_REGISTRY_PASSWORD | docker login -u $DOCKER_REGISTRY_USERNAME --password-stdin
script:
- ssh -o StrictHostKeyChecking=no $SERVER_USER_NAME@$SERVER_URL "
mkdir -p ~/DotNetCoreWebApiCiAndCdCourse"
- scp -o StrictHostKeyChecking=no ./docker-compose.yml $SERVER_USER_NAME@$SERVER_URL:~/DotNetCoreWebApiCiAndCdCourse
- ssh -o StrictHostKeyChecking=no $SERVER_USER_NAME@$SERVER_URL "
export COMPOSE_PROJECT_NAME=$SERVER_ENV
export SERVER_ENV=$SERVER_ENV
export SERVER_PORT=$SERVER_PORT
cd ~/DotNetCoreWebApiCiAndCdCourse &&
docker compose up --build -d"
environment:
name: $SERVER_NAME
url: http://$SERVER_URL:$SERVER_PORT
deploy-to-development:
stage: deploy
tags:
- shell
variables:
SERVER_NAME: DotNetCoreWebApiCiAndCdCourse development environment
SERVER_PRIVATE_KEY: $DEV_SERVER_PRIVATE_KEY
SERVER_USER_NAME: $DEV_SERVER_USER_NAME
SERVER_URL: $DEV_SERVER_URL
SERVER_PORT: 8080
SERVER_ENV: development
extends: .deploy
deploy-to-staging:
stage: deploy
tags:
- shell
variables:
SERVER_NAME: DotNetCoreWebApiCiAndCdCourse staging environment
SERVER_PRIVATE_KEY: $DEV_SERVER_PRIVATE_KEY
SERVER_USER_NAME: $DEV_SERVER_USER_NAME
SERVER_URL: $DEV_SERVER_URL
SERVER_PORT: 8081
SERVER_ENV: staging
extends: .deploy
needs:
- deploy-to-development
deploy-to-production:
stage: deploy
tags:
- shell
variables:
SERVER_NAME: DotNetCoreWebApiCiAndCdCourse production environment
SERVER_PRIVATE_KEY: $DEV_SERVER_PRIVATE_KEY
SERVER_USER_NAME: $DEV_SERVER_USER_NAME
SERVER_URL: $DEV_SERVER_URL
SERVER_PORT: 80
SERVER_ENV: production
extends: .deploy
when: manual
needs:
- deploy-to-staging
再來我們將我們的這個 CI/CD 腳本,上傳到 gitlab 讓我們觀察的運作,可以看到在前面 deploy-to-develop 及 deploy-to-staging 這兩個工作都已經成功佈署上去,而在 deploy-to-production 這個工作產生一個按鈕,等待我們按下去
再來我們將這顆按鈕按下去,就可以看到 deploy-to-production 這個工作就會開始運作了