博客 / 詳情

返回

極狐GitLab CI/CD 變量黑魔法之自定義變量

極狐GitLab CI/CD 變量是指一系列的環境變量,用來幫助我們控制 CI/CD Job 或 Pipeline 的行為,存儲一些可以複用的信息,避免在 .gitlab-ci.yml 中形成硬編碼。

極狐GitLab CI/CD 變量分為預定義變量(predefined CI/CD variables) 和 自定義變量(custom variable) 兩部分。今天我們來學習自定義變量這部分。

自定義變量

自定義變量,顧名思義就是需要用户自己定義,先定義,後使用的環境變量。

自定義環境變量有三個級別:

  • 極狐GitLab 實例級別(這個需要有管理員權限才能使用)
  • 羣組(Group)級別
  • 倉庫(Project)級別

不同級別的環境變量限制了其使用生效範圍,實例級別的環境變量對整個實例下面的所有倉庫都有效,羣組級別的對整個羣組下面的倉庫有效,倉庫級別的只對此倉庫有效。常用的是羣組級別和倉庫級別的。下面分別介紹並進行演示。

羣組(Group)級別

首先,創建一個羣組(Group)級別的環境變量:Group --> Settings --> CI/CD --> Variables --> Add variable,寫入對應的 key 和 value 即可,如下圖

圖片

上述操作創建了一個 key 為 GROUP_VARS,value 為 JiHu-GitLab 的羣組(Group)級別的環境變量。

在當前羣組(Group)的任意一個倉庫(Project)下面用極狐GitLab CI 功能測試一下,將下述內容寫入 .gitlab-ci.yml 文件

image: busybox:latest

stages:          
  - test

build:
  stage: test
  script:
    - echo "Group Variable is GROUP_VARS and value is $GROUP_VARS"

觸發 CI/CD Pipeline 之後,查看構建結果

圖片

可以看到 GROUP_VARS 在羣組(Group)的 CI/CD 環境變量中定義了,所以會輸出正常的值,如果環境變量沒有定義,會出現什麼結果呢?

將下述內容寫入 .gitlab-ci.yml 文件

image: busybox:latest

stages:          
  - test

build:
  stage: test
  script:
    - echo "Group Variable is GROUP_VARS and value is $GROUP_VARS"
    - echo "Group Variable is NON_GROUP_VARS and value is $NON_GROUP_VARS"

其中 GROUP_VARS 是提前定義了的環境變量,而 NON_GROUP_VARS 是沒有經過定義的環境變量。

觸發 CI/CD Pipeline 之後,查看構建結果

圖片

可以看到 NON_GROUP_VARS 沒有提前定義,而且也不是預定義變量,所以值為空。

上述 Demo 是在定義羣組(Group)環境變量的羣組(Group)內的任意倉庫中實現的.説明羣組(Group)級別的自定義環境變量對當前羣組下面的所有倉庫(Project)均有效。

倉庫(Project)級別

倉庫(Project)級別的環境變量有三種創建方式

  • 通過倉庫(Project)內的 .gitlab-ci.yml 文件
  • 通過倉庫(Project)的 Settings,這個和羣組(Group)的創建類似
  • 通過 API 來創建

下面分別展示三種情況下的自定義環境變量的定義和使用。

使用 .gitlab-ci.yml 創建

在 .gitlab-ci.yml 文件中使用自定義變量,需要通過關鍵字 variables 先定義環境變量。variables 關鍵字可以出現在 .gitlab-ci.yml 文件內容的最頂端,這種情況下,自定義變量對當前整個 Pipeline 全局有效,也即意味着所有 Stage,Job 均可以使用;variables 關鍵字也可以出現在單個 Job 中,此時,自定義環境變量只對當前 Job 有效。測試如下:

variables:
  PROJECT_TEST_VAR: "project_global_var"

image: busybox:latest

stages:          
  - test
  - test1

job:
  stage: test
  variables:
    JOB_TEST_VAR: "job_test_var"
  script:
    - echo "Global Project Variable is PROJECT_TEST_VAR and value is $PROJECT_TEST_VAR"
    - echo "Job Variable is JOB_TEST_VAR and value is $JOB_TEST_VAR"

job1:
  stage: test
  script:
    - echo "Global Project Variable is PROJECT_TEST_VAR and value is $PROJECT_TEST_VAR"
    - echo "Job Variable is JOB_TEST_VAR and value is $JOB_TEST_VAR"

上述代碼定義了一個全局的自定義環境變量:PROJECT_TEST_VAR,值為 project_global_var;定義了一個 Job 級別的環境變量:JOB_TEST_VAR,值為 job_test_var。job 的輸出如下

圖片

可以看到:全局環境變量 PROJECT_TEST_VAR 在 job 中可見可用;job 級別的環境變量 JOB_TEST_VAR 僅在 job 中可見可用,因為是在 job 中定義的。

job1 的輸出如下

圖片

可以看到:全局環境變量 PROJECT_TEST_VAR 在 job1 中可見可用,job 級別的環境變量 JOB_TEST_VAR 在 job1 中不可見不可用,因為是在 job 中定義的,生效範圍僅僅是 job 級別的。

結論:全局的環境變量對於所有 job 可見可用,但是 job 級別的環境變量只對當前 job 可用可見,在其他 job 是不可見不可用的。

通過倉庫的 Settings 創建

這一點和前面羣組(Group)的使用一樣,先創建變量:Project --> Settings --> CI/CD --> Variables --> Add Variable,添加 key 為 PROJECT_VARS,value 為 JiHu-GitLab-Project 的環境變量。使用下述代碼進行測試:

image: busybox:latest

stages:          
  - test

job:
  stage: test
  variables:
    JOB_TEST_VAR: "job_test_var"
  script:
    - echo "Project Variable is PROJECT_VARS and value is $PROJECT_VARS"

job1:
  stage: test
  script:
    - echo "Project Variable is PROJECT_VARS and value is $PROJECT_VARS"

查看構建結果

圖片

可以看到兩個 job 的輸出結果是一樣。

結論:通過倉庫(Project) Settings 創建的環境變量對當前倉庫(Project)中所有 Pipeline 所包含的 job 均可見可用。

通過 API 創建

極狐GitLab 提供豐富的 API 用來對環境變量的增、刪、改、查進行操作。創建變量的 API 方法如下:

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
     "https://gitlab.cn/api/v4/projects/1/variables" --form "key=NEW_VARIABLE" --form "value=new value"

指定極狐GitLab token 及極狐GitLab 地址:https://gitlab.cn,然後將需要創建的變量以 --form 的形式傳入,執行上述命令後,得到如下返回信息

{
  "variable_type":"env_var",
  "key":"xiaomage",
  "value":"Evangelist",
  "protected":false,
  "masked":false,
  "environment_scope":"*"
}

上述信息表明 key 為 xiaomage,value 為 Evangelist 的變量已經創建成功。可以用下面的 API 繼續查看當前倉庫(Project)裏面的現有環境變量

[
  {
    "variable_type":"env_var",
    "key":"PROJECT_VARS",
    "value":"JiHu-GitLab-Project",
    "protected":false,
    "masked":false,
    "environment_scope":"*"
  },
  {
    "variable_type":"env_var",
    "key":"xiaomage",
    "value":"Evangelist",
    "protected":false,
    "masked":false,
    "environment_scope":"*"
  }
]

可以看到當前倉庫(Project)有兩個變量 PROJECT_VARS、xiaomage。其中 PROJECT_VARS 是通過倉庫(Project)Settings 創建的。而 xiaomage 就是用上述 API 創建的。

在倉庫(Project)的 CI/CD Variables 下面也可以看到名為 xiaomage 的變量。

圖片

大招時刻

相信大家也看到了,極狐GitLab 的環境變量定義手段非常豐富,當然使用也就非常靈活了。下面講幾種大家關心而且常用的環境變量使用小魔法。

變量的覆蓋(Override)

自定義的變量是可以在 Pipeline 運行的時候被覆蓋的,諸如上述名為 xiaomage,值為 Evangelist 的環境變量。可以在手動運行 Pipeline 的時候覆蓋其原來的值。

方法為:Project --> Pipelines --> Run Pipeline,在出現的界面中,修改環境變量的值

圖片

然後點擊 Run Pipeline,查看構建結果

圖片

可以看到值已經從 Evangelist 變成了 JiHu-Evangelist 了 。

變量的遮掩(Mask)

經過遮掩(Mask)的變量,其值在 Pipeline logs 中是不會顯示的,這種方法對於將敏感信息存儲為環境變量的場景比較常用。如果敏感信息在 Pipeline log 中輸出,很容易造成敏感信息的泄漏。

遮掩(Mask)一個變量的方法很簡單:倉庫(Project) --> CI/CD --> Variables --> Add variable,在出現的選項中勾選 Mask variable

圖片

在 Pipeline 的構建 log 中,可以看到值顯示 MASKED,而不是真實的值。

圖片

變量的傳遞

DevOps Pipeline 中經常遇到的一個問題就是,變量在不同 Job 間的傳遞。其實上面極狐GitLab CI/CD 變量的不同定義方法就能滿足變量在不同 Job 間的使用。但是極狐GitLab 還有一種能夠完成環境變量在不同 Job 間的傳遞。使用方法如下:

  • 在前面的 Job 中,將環境變量存儲在 .env 文件中
  • 用 artifacts:reports:dotenv 關鍵字將 .env 文件標記為製品
  • 在後續的 Job 中使用關鍵字 dependencies 或 needs 來使用傳遞過來的環境變量。

測試代碼如下

image: busybox:latest

stages:          
  - build
  - deploy

build:
  stage: build
  script:
    - echo "NAME=xiaomage" >> build.env
    - echo "TITLE=JiHu-Evangelist" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  script:
    - echo "$NAME"  
    - echo "$TITLE"  
  dependencies:

可以查看構建結果

圖片

當然,也可以用使用 needs 關鍵字來完成變量的傳遞

image: busybox:latest

stages:          
  - build
  - deploy

build:
  stage: build
  script:
    - echo "NAME=xiaomage" >> build.env
    - echo "TITLE=JiHu-Evangelist" >> build.env
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  script:
    - echo "$NAME"  
    - echo "$TITLE"  
  needs:
    - job: build
      artifacts: true

構建結果是一樣的

圖片

寫在最後

極狐GitLab CI/CD 中對於環境變量的定義、使用都是非常靈活的,功能非常強大,而且每個迭代的版本都有新功能推出。能滿足多種場景下的 CI/CD Pipeline 構建。歡迎大家體驗、使用!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.