Gitlab CI/CD 之 when

前言

上次教到如何使用 environment 去自動設置我們環境那些,今天我們要教 CI/CD 中的 when,通常在自動化佈署上線流程,並不會一路像前幾次一樣,先佈署到測試機,再佈署 demo 機,最後佈署到正式機,我們在佈署正式機的時候,通常會做一個防呆,比如說做成一個指令集,或者是按鈕等等,以避免出嚴重大錯

when 作用

when 是可以幫助我們在自動化佈署時,可以定義那些工作,是可以不要這麼早,就有所動作,等到我們比較確定的時候,比如說我們按下按鈕,這個工作才會開始運作,所以也可以讓我們做個半自動化,而不是全自動化

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 這個工作就會開始運作了

相關文獻

留言

此網誌的熱門文章

Gitlab CI/CD 之 Group Runner

Docker 之如何安裝 Docker 容器

Docker 之初體驗