GitLabのEnvironmentを使いこなせ！(.gitlab-ci.ymlで使う編)

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

本エントリーは、Qiita Adventカレンダー 2021 GitLab の記事です。

# 0. はじめに

2021年12月03日の`Qiita Adventカレンダー 2021 GitLa`に以下の記事を書きました。

GitLabのEnvironmentを使いこなせ！(Environmentってなに？編) - Qiita 
https://qiita.com/ynott/items/79d567ecb0cfbce722a8

GitLabの機能にあるEnvironment機能を解説しました。

本エントリーは、.gitlab-ci.ymlの書き方を解説します。

# 1. いきなり本題

以下のように書きます！
重要なのは`environment`の部分です。

```yaml:.gitlab-ci.yml
stages:
  - deploy
  - stop

deploy_staging:
  stage: deploy
  script:
    - echo "Deploy to staging server" # <--- デプロイするスクリプトを書きます
  environment:
    name: staging # <--- (2)
    url: https://staging.example.com # <--- (3)
    on_stop: stop_staging # <--- (4)
  only:
    - main

stop_staging: <--- (4)
  stage: deploy
  script:
    - echo "Stop deployed" # <--- デプロイを削除するスクリプトを書きます
  when: manual
  environment:
    name: staging
    action: stop
```

これを実行すると、以下のようにGitLabの「Deployment」＞「環境」①に「staging」という名前(2)で環境が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/f8f14d38-d7c0-2b5c-ae24-29da53f4ad24.png)

上の図で③の部分にある「Open」のリンクは、(3)で示したURLが設定されます。
④の部分は「停止」ボタンを押すと(4)で示したジョブが実行されます。

# 2. deploy_stagingの解説

deploy_stagingでは、scriptにデプロイするスクリプトを書きます。
dockerならばdocker run、Kubernetesならkubectl apply、ec2をterraformでデプロイしてもOKです。
environment.nameにこのデプロイの環境名を記載します。
environment.urlにこのデプロイで参照されるURLを記載します。このURLは「Open」のリンクに自動的に適用されます。

# 3. stop_stagingの解説

stop_stagingでは、scriptに削除するスクリプトを書きます。
パイプライン内で実行ないように`when: manual`をつけます。
environment:nameにこのデプロイを削除したい環境名を記載します。
environment:actionに`stop`とだけ書いておきます。

# 4. 環境を自動停止したい

一定の時間が経ったら、自動的に環境を停止できます。
`auto_stop_in: 1 week`を入れておきます。

```yaml
review_app:
  script: deploy-review-app
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    on_stop: stop_review_app
    auto_stop_in: 1 week
```

参考URL: [Stop an environment after a certain time period](https://docs.gitlab.com/ee/ci/environments/#stop-an-environment-after-a-certain-time-period)

# 5. リンクのURLがデプロイ中に決まる場合

これは、例えばリンクのURLにブランチ名などが入っている場合です。

http://<ブランチ名>.example.jp/ といったURLにする場合、 `<ブランチ名>`部分は任意なのでenvironment:urlで指定することができません。
この場合、environment:urlの指定を変数にして、その変数をscript内で宣言し、.envファイルに書き出します。
書き出した.envファイルを`artifacts:reports:dotenv`で指定します。

```yaml
deploy_staging:
  stage: deploy
  script:
    - echo "Deploy to staging"
    - DYNAMIC_ENVIRONMENT_URL="https://$CI_COMMIT_REF_SLUG.example.jp" # <--- environment:urlに指定したいURLを変数定義
    - echo "DYNAMIC_ENVIRONMENT_URL=$DYNAMIC_ENVIRONMENT_URL" >> test.env # <--- 変数定義した内容を.dotenvファイル書き出す
  artifacts:
    reports:
      dotenv: test.env # <--- .dotenvファイルを保存する
  environment:
    name: review/$CI_COMMIT_REF_SLUG
    url: $DYNAMIC_ENVIRONMENT_URL # <--- .dotenvファイル内で指定した変数を記載
    on_stop: stop_review
```

# 6. まとめ

地味に便利な機能だと思うのですが、紹介している記事が少なかったので書いてみました。

# 7. 参考

日本語情報:
[環境とデプロイメント | GitLab](https://gitlab-docs.creationline.com/ee/ci/environments/)

GitLab Document
[Environments and deployments | GitLab](https://docs.gitlab.com/ee/ci/environments/)

[GitLabとKubernetesで作る、自動で起動・停止できるブランチ別環境 - JX通信社エンジニアブログ](https://tech.jxpress.net/entry/dynamic-environment-with-k8s-and-gitlab)

[Travis CIからGitLab CIに移行した — Commerce Hack](https://tech.degica.com/ja/2019/05/21/gitlab-ci/)