2017-05-31 76 views
2

有沒有辦法配置多個特定命名環境(特別是,test,stageprod)?使用GitLab CI多個命名環境的相同步驟CI

在他們的文檔(https://docs.gitlab.com/ce/ci/environments.html)中他們討論了動態創建的環境,但它們都是基於提交的。

我的生成步驟相同爲所有這些,節省換出毛坯:

deploy_to_test: 
    environment: 
     name: test 
     url: ${CI_ENVIRONMENT_SLUG}.mydomain.com 
    scripts: 
     - deploy ${CI_ENVIRONMENT_SLUG} 

deploy_to_stage: 
    environment: 
     name: stage 
     url: ${CI_ENVIRONMENT_SLUG}.mydomain.com 
    scripts: 
     - deploy ${CI_ENVIRONMENT_SLUG} 

deploy_to_prod: 
    environment: 
     name: prod 
     url: ${CI_ENVIRONMENT_SLUG}.mydomain.com 
    scripts: 
     - deploy ${CI_ENVIRONMENT_SLUG} 

有什麼辦法來壓縮下來到一個指令集?例如:

deploy: 
    environment: 
     url: ${CI_ENVIRONMENT_SLUG}.mydomain.com 
    scripts: 
     - deploy ${CI_ENVIRONMENT_SLUG} 

回答

3

是的,您可以使用anchors。如果我正確地遵循文檔,您將使用隱藏的密鑰.XX重寫它,然後將其與<<: *X一起應用。

例如這個來定義鍵:

.job_template: &deploy_definition 
    environment: 
     url: ${CI_ENVIRONMENT_SLUG}.mydomain.com 
    scripts: 
     - deploy ${CI_ENVIRONMENT_SLUG} 

然後所有塊可以使用writen <<: *job_template。我假設environment會將該名稱與預定義的URL合併。

YAML有一個名爲「錨」一個方便的功能,它可以讓你輕鬆地複製在您的文檔內容:從上面的鏈接

deploy_to_test: 
    <<: *job_definition 
    environment: 
     name: test 

deploy_to_stage: 
    <<: *job_definition 
    environment: 
     name: stage 

deploy_to_prod: 
    <<: *job_definition 
    environment: 
     name: prod 

完整的文檔部分。錨可以用來複制/繼承屬性,並且是與隱藏鍵一起使用以提供作業模板的完美示例。

以下示例使用錨和地圖合併。它會創建兩個作業,TEST1和TEST2,將繼承.job_template的參數,每個都具有定義自己的自定義腳本:

.job_template: &job_definition # Hidden key that defines an anchor named 'job_definition' 
    image: ruby:2.1 
    services: 
    - postgres 
    - redis 

test1: 
    <<: *job_definition   # Merge the contents of the 'job_definition' alias 
    script: 
    - test1 project 

test2: 
    <<: *job_definition   # Merge the contents of the 'job_definition' alias 
    script: 
    - test2 project 

&套在錨(job_definition)的名稱,< <手段「將給定的哈希合併到當前的哈希中「,並且*包含指定的錨點(再次是job_definition)。擴展版本是這樣的:

.job_template: 
    image: ruby:2.1 
    services: 
    - postgres 
    - redis 

test1: 
    image: ruby:2.1 
    services: 
    - postgres 
    - redis 
    script: 
    - test1 project 

test2: 
    image: ruby:2.1 
    services: 
    - postgres 
    - redis 
    script: 
    - test2 project 
+2

完美。謝謝。 – samanime

2

除了答案提供什麼,我想補充另一個類似的方式來實現那種同樣的事情,但它更靈活,而不是使用模板,然後在一個階段合併它。

你可以做的是創建一個隱藏鍵,但是這種格式,例如,,

.login: &login | 
    cmd1 
    cmd2 
    cmd3 
    ... 

然後你就可以使用 '*',星號,喜歡它適用於不同的階段:

deploy: 
    stage: deploy 
    script: 
    - ... 
    - *login 
    - ... 

bake: 
    stage: bake 
    script: 
    - ... 
    - *login 
    - ... 

其結果將是等效於:

deploy: 
    stage: deploy 
    script: 
    - ... 
    - cmd1 
    - cmd2 
    - cmd3 
    - ... 

bake: 
    stage: bake 
    script: 
    - ... 
    - cmd1 
    - cmd2 
    - cmd3 
    - ... 

基於以下資源: https://gitlab.com/gitlab-org/gitlab-ce/issues/19677#note_13008199

至於模板實現,它是「合併」。憑藉我自己的經驗,如果在合併模板後追加更多腳本,模板腳本將被覆蓋。並且您無法一次應用多個模板。只有最後一個模板腳本將被執行。例如:

.tmp1: &tmp1 
    script: 
    - a 
    - b 

.tmp2: &tmp2 
    script: 
    - c 
    - d 

job1: 
    <<: *tmp1 
    <<: *tmp2 
    stage: xxx 

job2: 
    <<: *tmp2 
    stage: yyy 
    script: 
    - e 
    - f 

等價的結果將是:

job1: 
    stage: xxx 
    script: 
    - c 
    - d 

job2: 
    stage: yyy 
    script: 
    - e 
    - f 

如果不能確定語法的正確性,只需複製並粘貼您的.gitlab.yml文件內容爲「CI林特」驗證。該按鈕位於管道的選項卡中。