GitLab CI/CD - ハンズオンラボ: ジョブポリシーパターン

このハンズオンガイドでは、rules キーワードを使った CI/CD ジョブの操作について解説します。

所要時間の目安: 25〜30分

目標

ジョブポリシーパターンを使用すると、rules キーワードを使ってジョブをいつ・どのように実行するかをパイプラインが制御できます。このラボでは、rules を使ったジョブの作成方法を学びます。これらの rules がパイプラインに与える影響を確認し、パイプラインの rules と変数を組み合わせて使用する方法を学びます。

同様の結果を達成できる only および except キーワードは、現在積極的に開発されておらず推奨されていません。詳細については、こちらをクリックしてください。

タスク A: rules を使ったジョブの作成

  1. 前のラボで作成した CICD Demo プロジェクトを開きます。

  2. .gitlab-ci.yml ファイルをクリックして内容を確認します。Edit > Edit single file をクリックします。

  3. 設定ファイルを整理するために、environment echoesenvironment variables ジョブを削除します。また、variables キーワードと関連する変数も削除します。これらの手順を完了すると、以下の .gitlab-ci.yml ファイルになります:

    stages:
      - test
      - build
    
    test job:
      stage: test
      script:
        - echo "I am a unit test!"
    
    build job:
      stage: build
      script:
        - echo "I am a build image!"
    
  4. ファイルの末尾に、以下のコードスニペットを貼り付けます:

    deploy review:
      stage: review
      script:
        - echo "Do your average deploy here"
      rules:
        - if: '$CI_COMMIT_REF_NAME == "main"'
          when: never
        - if: '$CI_COMMIT_TAG'
          when: never
        - when: always
      environment:
        name: review/$CI_COMMIT_REF_NAME
    
    deploy release:
      stage: deploy
      script:
        - echo "Deploy to a production environment"
      rules:
        - if: '$CI_COMMIT_TAG =~ /^v.*/'
          when: manual
      environment:
        name: production
    
    deploy staging:
      stage: deploy
      script:
        - echo "Deploy to a staging environment"
      rules:
        - if: '$CI_COMMIT_REF_NAME == "main"'
          when: always
        - when: never
      environment:
        name: staging
    
  5. .gitlab-ci.yml の上部にある stages セクションに、reviewdeploy ステージを追加します。

  6. 完成後、.gitlab-ci.yml ファイルは以下のようになります:

    stages:
      - test
      - build
      - review
      - deploy
    
    test job:
      stage: test
      script:
        - echo "I am a unit test!"
    
    build job:
      stage: build
      script:
        - echo "I am a build image!"
    
    deploy review:
      stage: review
      script:
        - echo "Do your average deploy here"
      rules:
        - if: '$CI_COMMIT_REF_NAME == "main"'
          when: never
        - if: '$CI_COMMIT_TAG'
          when: never
        - when: always
      environment:
        name: review/$CI_COMMIT_REF_NAME
    
    deploy release:
      stage: deploy
      script:
        - echo "Deploy to a production environment"
      rules:
        - if: '$CI_COMMIT_TAG =~ /^v.*/'
          when: manual
      environment:
        name: production
    
    
    deploy staging:
      stage: deploy
      script:
        - echo "Deploy to a staging environment"
      rules:
        - if: '$CI_COMMIT_REF_NAME == "main"'
          when: always
        - when: never
      environment:
        name: staging
    
  7. Commit message フィールドに Add CI structure job definitions と入力し、Target Branchmain に設定されていることを確認して、Commit changes をクリックします。

  8. 左側のナビゲーションペインで Build > Pipelines をクリックし、最新のパイプライン実行の横にあるステータスアイコンをクリックします。

  9. ウィジェットをクリックして、パイプラインがどの環境にコードをデプロイしているかを確認します。左のサイドバーで Operate > Environments をクリックして、作成された環境を確認します。

    各ジョブに定義された rules に基づいて、3つのジョブのうち deploy staging だけが実行されていることがわかります。

  10. オプション: 異なるブランチやタグを使ってパイプラインのトリガーを実験してみてください。deploy releasedeploy reviewdeploy staging ジョブを実行する異なるパイプラインを起動できますか?

    ヒント: 関連する .gitlab-ci.yml ジョブ定義の rules キーワードを確認してください。

解答例

タスク B1: deploy review ジョブの実行

  1. deploy reviewrules セクションで指定されたルールを確認します。このジョブは A) ブランチ名($CI_COMMIT_REF_NAME で表される)が main と等しくない、かつ B) ブランチにタグが付いていない($CI_COMMIT_TAG で表される)場合にのみ実行されます。

    if キーワードで単独で使用される変数は、その変数に何らかの値が関連付けられているかどうかを確認します。他のプログラミング言語では偽とみなされる False などの値を含む、どのような値があっても true です。値がない場合、ステートメントは false です。値として空白を持つ変数も false とみなされます。

  2. Code > Branches をクリックして新しいブランチを作成します。

  3. New branch ボタンをクリックします。

  4. branch name セクションに Dev と入力し、Create branch をクリックします。

  5. Build > Pipelines をクリックします。

  6. Run Pipeline ボタンをクリックします。

  7. Run for branch name or tag の下で、Dev が選択されていることを確認します。

  8. Run Pipeline ボタンをクリックします。

deploy review ジョブのみが実行されます。

タスク B2: deploy release ジョブの実行

  1. .gitlab-ci.yml ファイルを開き、deploy release の rules セクションで指定されたルールを確認します。このジョブは A) ブランチ名($CI_COMMIT_REF_NAME で表される)が main と等しくない、かつ B) ブランチに v の文字で始まるタグが付いている($CI_COMMIT_TAG =~ /^v.*/ で表される)場合にのみ実行されます。

  2. このジョブを実行するためにタグを作成する必要があります。タグを作成するには、Code > Tags をクリックします。

  3. New tag ボタンをクリックします。

  4. Tag name セクションに v1.0 と入力します。

  5. Create from オプションを Dev に変更します。

  6. Create tag ボタンをクリックします。

  7. Build > Pipelines をクリックします。

  8. Run Pipeline ボタンをクリックします。

  9. Run for branch name or tag の下で、v1.0 が選択されていることを確認します。

  10. Run Pipeline ボタンをクリックします。

  11. deploy release ジョブのみが利用可能になります。ジョブは手動に設定されているため、明示的に開始するまで実行されません。ジョブの横にある矢印をクリックしてジョブを開始します。

タスク B3: deploy staging ジョブの実行

  1. .gitlab-ci.yml ファイルを開き、deploy stagingrules セクションで指定されたルールを確認します。このジョブは A) ブランチ名($CI_COMMIT_REF_NAME で表される)が main と等しい場合にのみ実行されます。

  2. 左上のコーナーで Dev と表示されているボタンをクリックし、オプションを main に変更します。

  3. Build > Pipelines をクリックします。

  4. Run Pipeline ボタンをクリックします。

  5. Run for branch name or tag の下で、main が選択されていることを確認します。

  6. Run Pipeline ボタンをクリックします。

deploy staging ジョブのみが実行されます。

ラボガイドの完了

このラボ演習が完了しました。このコースの他のラボガイドも参照できます。

ご意見・ご提案?

GitLab CI/CD のハンズオンガイド に変更を加えたい場合は、マージリクエストで変更内容を提出してください!