###### tags: `gitlab` `CI/CD`
[toc]
<!-- :::danger
.gitlab-ci.yml 已發生重大更新,請以分支中的 .gitlab-ci.yml 內容參考
::: -->
# Gitlab CI/CD Trigger 筆記
- 本篇中的範例以 Release 為前提而設計。與一般開發的不同的是,開發部屬的間隔可能30分鐘到數小時不等,而 Release 可能會是一周或一個 sprint,而兩者的 CI 腳本也有可能不同
## 發動端 (source)
- .gitlab-ci.yml
```=yml
ci-cd:step1:
stage: release
image: docker
variables:
PARENT_PIPELINE_ID: $CI_PIPELINE_ID
script:
- echo hi firends
- echo hi friends >> hi_firends.txt
artifacts:
untracked: false
when: on_success
expire_in: "1m"
paths:
- ${CI_PROJECT_DIR}/hi_firends.txt
rules:
- if: $CI_COMMIT_REF_NAME =~ /[Rr]elease.*/
when: manual
ci-cd:step2:
stage: release
trigger:
project: path/to/tagret/repo
strategy: depend
branch: $CI_COMMIT_REF_NAME
variables:
PARENT_PIPELINE_ID: $CI_PIPELINE_ID
UPSTREAM_PROJECT_ID: $CI_PROJECT_ID
UPSTREAM_JOB_ID: $CI_JOB_ID
UPSTREAM_REF: $CI_COMMIT_REF_NAME
needs:
- ci-cd-test:step1
```
- 說明
- 這邊設定了兩個 Job,`ci-cd:step1` 就是用來執行一般的 CI/CD 操作,`ci-cd:step2` 是一個 trigger Job,當出現 `trigger` 這個 keyword 時,[有些 keyword 就無法使用](https://docs.gitlab.com/ee/ci/yaml/?query=trigger#trigger)
- project: 指定 target 來讓這個 trigger 觸發
- strategy: 當設定為 depend 時,則上游流水線會「相依」下游流水線的工作執行結果;換句話說,就是下游成功,上游才會標記為成功 [ref.](https://docs.gitlab.com/ee/ci/yaml/?query=trigger#triggerstrategy)
- branch: 指定 target 分支名稱
## 觸發端 (target)
- .gitlab-ci.yml
```=yml
release:step1:
stage: release
image: docker
script:
- 'curl --location --output artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "http://serveer.hotst/api/v4/projects/$UPSTREAM_PROJECT_ID/jobs/$UPSTREAM_JOB_ID/artifacts"'
- unzip artifacts.zip
rules:
- if: $CI_COMMIT_REF_NAME =~ /[Rr]elease.*/ && $CI_PIPELINE_SOURCE == "pipeline"
```
- 說明
- `release:step1` 為一般 CI/CD Job,假如要使此 Job 在特定條件下才被 trigger 觸發,以此範例說明:
- 當分支或 tag 名稱符合 `[Rr]elease.*` 正規表示式
- 且 `$CI_PIPELINE_SOURCE` 為 `pipeline` 參考 [rules examples](https://docs.gitlab.com/ee/ci/jobs/job_control.html), [CI_PIPELINE_SOURCE](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)
- `$CI_PIPELINE_SOURCE` 有 `trigger` & `pipeline` 兩種,[詳細說明](https://docs.gitlab.com/ee/ci/triggers/index.html#configure-cicd-jobs-to-run-in-triggered-pipelines)
- 任何定義在上游 Job 中的變數,預設都會轉送到下游來,如下游有同名變數,會被上游的覆蓋 [ref.](https://docs.gitlab.com/ee/ci/yaml/?query=trigger#triggerforward)
-
## 參考
- [Day26 - GitLab CI 啟動其它專案啟動流水線或動態產出新的流水線,談觸發 trigger](https://ithelp.ithome.com.tw/articles/10251909)
- [Specify when jobs run with rules](https://docs.gitlab.com/ee/ci/jobs/job_control.html#specify-when-jobs-run-with-rules)
- [predefined variables: CI_PIPELINE_SOURCE](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)
- [Configure CI/CD jobs to run in triggered pipelines](https://docs.gitlab.com/ee/ci/triggers/index.html#configure-cicd-jobs-to-run-in-triggered-pipelines)
- [needs:pipeline:job](https://docs.gitlab.com/ee/ci/yaml/?query=trigger#needspipelinejob)
- [Downstream pipelines](https://docs.gitlab.com/ee/ci/pipelines/downstream_pipelines.html?tab=Multi-project+pipeline)
- Trigger
- [Trigger a multi-project pipeline by using the API](https://docs.gitlab.com/ee/ci/pipelines/downstream_pipelines.html)
- [Trigger pipelines by using the API](https://docs.gitlab.com/ee/ci/triggers/#use-curl)
- [GitLab CI/CD job token](https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html)
- [Pipeline trigger tokens API](https://docs.gitlab.com/ee/api/pipeline_triggers.html#trigger-a-pipeline-with-a-token)
- [Youtube - Multi-project pipelines](https://www.youtube.com/watch?v=g_PIwBM1J84&ab_channel=GitLabUnfiltered)
- [Passing gitlab artifacts from pipeline to pipeline](https://medium.com/trendyol-tech/passing-gitlab-artifacts-to-pipeline-to-pipeline-feb9e887525a)
-
- curl
- [Linux Curl Command 指令與基本操作入門教學](https://blog.techbridge.cc/2019/02/01/linux-curl-command-tutorial/)
- Split long commands
- [Format scripts and job logs](https://docs.gitlab.com/ee/ci/yaml/script.html#split-long-commands)
- reuse the script of job
- [extends](https://docs.gitlab.com/ee/ci/yaml/#extends)
- [Optimize GitLab CI/CD configuration files](https://docs.gitlab.com/ee/ci/yaml/yaml_optimization.html#use-extends-to-reuse-configuration-sections)
- runner
- [Configuring runners](https://docs.gitlab.com/ee/ci/runners/configure_runners.html)
- [Day21 - GitLab CI 選擇指定的 runner 來承接工作,談標籤 tags](https://ithelp.ithome.com.tw/articles/10249674?sc=iThomeR)
- [Advanced configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html)
- [Docker Machine Executor autoscale configuration](https://docs.gitlab.com/runner/configuration/autoscale.html#how-concurrent-limit-and-idlecount-generate-the-upper-limit-of-running-machines)
- Artifacts
- [Job Artifacts API](https://docs.gitlab.com/ee/api/job_artifacts.html)
- [GitLab CI/CD artifacts reports types](https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html)
- API - self-managed
- [Pipeline trigger tokens API (FREE)](http://192.168.100.202/help/api/pipeline_triggers.md)
- [The scope of runners (FREE)](http://192.168.100.202/help/ci/runners/runners_scope)
- [GitLab CI/CD job token (FREE)](http://192.168.100.202/help/ci/jobs/ci_job_token.md)
- [`.gitlab-ci.yml` keyword reference (FREE)](http://192.168.100.202/help/ci/yaml/index)
- [https://medium.com/@wasd2030980/gitlab-ci-cd-%E4%B9%8B-needs-077d5b284f06](https://medium.com/@wasd2030980/gitlab-ci-cd-%E4%B9%8B-needs-077d5b284f06)
## 採坑
- 使用 API 觸發 trigger 時,當使用的 TOKEN 為 `$CI_JOB_TOKEN`,`$CI_PIPELINE_SOURCE` 的值為 `pipeline`,如果是使用 Trigger Token,值則是 `trigger`
- [`The requested URL returned error: 400` when triggering a pipeline](https://docs.gitlab.com/ee/ci/triggers/#the-requested-url-returned-error-400-when-triggering-a-pipeline)
## 附件
<!-- -  -->
- 
<!-- -  -->
- 
<!-- -  -->
- 