---
# System prepended metadata

title: GitLab CI/CD 筆記
tags: [cicd, gitlab, devops]

---

# GitLab CI/CD 筆記

###### tags: `gitlab`, `cicd`, `devops`

## 參考文件
- GitLab CI/CD 官方文件 https://docs.gitlab.com/ee/ci/README.html
- GitLab CI 設定檔格式 官方文件 https://docs.gitlab.com/ee/ci/yaml/README.html

要先建立 runner 才能執行 pipeline

## 建立 runner
WIP

## 建立 pipeline
在專案根目錄下新增檔案 `.gitlab-ci.yml`
以下範例為 React.js 專案範例

```yaml=
# 指定執行環境，可從 docker hub 搜尋所需 image
image: node:12

# (非必填) 設定各 job 欲保留檔案快取(全域設定)
# &global_cache: 替此區塊命名為 `global_cache`，可在其他區塊做引入繼承使用
cache: &global_cache
  # 快取比對用職 key，如果 key 有異動則重新上傳
  # 可以使用純字串、GitLab CI 內建變數或者檔案(如下方)
  key:
    files:
      - package-lock.json
  # 欲快取之檔案
  paths:
    - .npm
    - node_modules
  # 快取策略，`pull` 即上傳；`push` 即下載，預設為 `pull-push` (下載快取後執行 job 完畢再上傳新的快取)
  policy: pull

# (非必填) 指定要執行的階段 (每個 job 可以定義 `stage`)
# 可用值: `build`, `test`, `deploy`
# 預設行為是 `build` => `test` => `deploy` 每個階段執行完畢且成功才會進行到下階段
stages:
  - build
  - test

# 只要不是 GitLab 所指定 keyword，皆認定為自定義 job
# 自定義 job, 名為 `run-install`
run-install:
  stage: build
  # 欲執行指令，輸入 bash 指令
  script:
    - npm ci --cache .npm --prefer-offline
  cache:
    # 繼承 `global_cache`
    <<: *global_cache
    # 覆蓋全域快取設定，策略修改為 `push`
    policy: push


# 自定義 job, 名為 `run-all-test`
run-all-test:
  stage: test
  script:
    - npm test -- --ci --reporters=default --reporters=jest-junit --coverage --watchAll=false
  # 設定 code coverage parse regex
  coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/
  # 存留檔案，預設為無期限(與快取不同於此檔案可永久存留，快取只存留於每次 pipeline)
  artifacts:
    # 設定何時存留檔案，`always` 不論 job 結果如何皆保留；`on_success` job 執行成功才保留；`on_failure` job 執行失敗才保留
    when: always
    # 報告類型設定，單元測試等等，詳見 GitLab 官網
    reports:
      junit:
        - junit.xml
```

GitLab 有提供線上編輯器供即時修改或檢查格式 (修改等同推一個 commit)

選單位置
![gitlab-ci-editor-menu](https://i.imgur.com/lgSVUF1.png)

![gitlab-ci-editor-interface](https://i.imgur.com/lfz1gJm.png)

辨識 jobs 結果
![gitlab-ci-editor-visualize](https://i.imgur.com/ZYgg4PH.png)

lint 無誤畫面
![gitlab-ci-editor-lint-success](https://i.imgur.com/6RMCVTu.png)

lint 有誤畫面
![gitlab-ci-editor-lint-failed](https://i.imgur.com/oKvDbPG.png)

設定完成後，預設會在 default branch 以及 MR (merge request) 執行 pipeline，
可另外設定 MR 要限制 pipeline 執行成功時才能合併