株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

GitとCI/CDに関する知識ゼロのSEが、GitLabのコンプライアンスフレームワーク機能をちょっとだけ試します

皆様こんにちは。SEの小池と申します。

GitLabは無料でも多くの機能を利用できますが、一部の便利機能は有償版 (Premium, Ultimate) でのみ利用できます。

そんな有償版限定の機能に、コンプライアンスフレームワークというものがあります。

これはザックリいうと、企業のコンプライアンスを遵守すべきプロジェクトであることを示すラベルと、コンプライアンス関連処理のCI/CDパイプラインを設定し、それらを企業のルートグループ配下のプロジェクトに適用させることで、企業のコンプライアンス対応を効率的に実現できる機能です。

今回は GitLabのコンプライアンスフレームワークについて概要を述べつつ、ちょっとだけ試してみます

本記事の対象の方

  • GitLabの有償版限定機能であるコンプライアンスフレームワーク (Compliance frameworks) をちょっとだけ使ってみたい方。

今回のブログのゴール

このブログのゴールはこちらです。


今回のゴール
  • コンプライアンスフレームワークの概要を理解する。
  • コンプライアンスフレームワークをちょっとだけ触ってみる。

このブログをお読みいただくにあたっての事前ご連絡事項

  • 本記事はSaaS版 (GitLab.com) の Enterprise Edition 15.10.0-pre における仕様をベースに記載しております。それ以外のエディションやバージョンではこの記事に記載の通りではない可能性がございます。
  • 本記事の操作説明と画面ショットはGitLabのローカライズを日本語にした状態で説明しております。それ以外の言語をご利用の方は適宜読み替えてください。
  • 本記事はGitやCI/CDに関する知識ゼロのSEによるなんちゃって記事です。GitLabのディープな使用法についてはGitLabの公式オンラインドキュメント (こちら) をご参照ください。

コンプライアンスフレームワークの概要

コンプライアンスフレームワークはルートグループに設定します。
このルートグループの配下にある、コンプライアンス要件の対象であるプロジェクトに対して、それを意味するラベルの設定 及び コンプライアンスパイプラインの設定 が可能な機能です。
参考:Compliance frameworks | GitLab

"コンプライアンスフレームワーク" という仰々しい機能名が付いているので、なんとなく敷居が高そうな雰囲気がする本機能ですが、要は以下の2点をルートグループで設定しておく機能です。

コンプライアンスフレームワークの機能の超概要

以下の2点をルートグループで設定しておく機能です。

  • 「会社規定のコンプライアンスを遵守するプロジェクトです」という意味のラベルを作成し、コンプライアンス要件の対象であるプロジェクトにそのラベル付与する。(Premium以上で利用可能)
  • 会社のコンプライアンスルールを実現するためのCI/CDパイプライン (コンプライアンスパイプライン) を設計・作成し、コンプライアンス要件の対象であるプロジェクトに適用する。 (Ultimate以上で利用可能)

これ以上文字で書いてもうまく説明できる自信がないので、実際の画面と図で説明いたします。

まず、コンプライアンスフレームワークは、ルートグループに設定します。
サブグループやプロジェクトには設定できません。

下図はUltimate利用時におけるコンプライアンスフレームワークの設定画面です。

コンプライアンスフレームワークのラベルを設定すると、コンプライアンスフレームワークが適用されたプロジェクトは、以下のような表示となります。
(コンプライアンスフレームワークのラベルを付与する機能は、Premium以上で利用可能です。)

もう一つの機能であるコンプライアンスパイプラインは、雑に言うとルートグループ配下のプロジェクトで適用されるCI/CDパイプラインです。
(コンプライアンスパイプラインの設定は、Ultimate以上で利用可能です。)

コンプライアンスパイプラインの設定には事前準備が必要です。

事前にコンプライアンスパイプラインで利用するymlファイルを任意のプロジェクトに作成しておき、それを ymlファイル名@ymlファイルがあるプロジェクトへのパス で指定するする必要があります。

コンプライアンスパイプラインで利用するymlファイルの書き方は、通常のGitLabのCI/CDパイプラインで使用するファイル .gitlab-ci.yml ファイルと同じ書式です。

作成したコンプライアンスフレームワークは、そのままだとどのプロジェクトにも適用されません。

適用するには、そのプロジェクトのオーナーが [設定] > [一般] から手動で設定するか、このコンプライアンスフレームワークをルートグループの "デフォルト" に設定する必要があります。
"デフォルト" に設定すると、それ以降このルートグループに新規作成 または インポートされるプロジェクトには自動的にコンプライアンスフレームワークが適用されます。

なお、コンプライアンスフレームワークを "デフォルト" にする or しないを問わず、作成した時点で既に存在しているプロジェクトには自動適用されません。
既に存在するプロジェクトにコンプライアンスフレームワークを適用したい場合は手動で適用する必要があります。

ラベルと違い、コンプライアンスパイプラインが適用されているかどうかは目視でわかる箇所はありません。

実際にCI/CDパイプラインを動かしてみて、 .gitlab-ci.yml に設定したジョブが作成・実行されないことや、.gitlab-ci.yml に書いていないジョブが生成・実行されることに気が付いて、ようやく適用されていることが分かります。

この「プロジェクトにコンプライアンスパイプラインが設定されているかを目視で確認しにくい」点については、GitLab Docsにも言及されているとおり、コンプライアンスフレームワークの管理者と開発メンバー間で十分なコミュニケーションを取り、コンプライアンスフレームワークの内容と対象プロジェクトにいて共通の認識を持つ必要があります。
「コンプライアンスパイプラインが適用されているか否かを目視確認できる方法を実装してほしい」と、安易に希望するのは筆者だけなのか・・・。
参考:Compliance frameworks - Effect on labeled projects | GitLab

以上がコンプライアンスフレームワークの概要でした。

コンプライアンスフレームワークを試すためのシナリオ

コンプライアンスフレームワークを試すための簡単なシナリオを用意しました。

GitLab.comを利用する企業Aは、ルートグループに存在する全プロジェクトに対して以下のご要件をお持ちであると仮定します。

【企業Aのご要件】
今後、GitLab.comのルートグループ配下に 新規作成 または インポートされる全プロジェクトに対して、以下を適用する。
  • コンプライアンス対象であることを示すラベルを付与する。
  • コンプライアンス関連処理を実行するコンプライアンスパイプラインを作成する。

  • コンプライアンスパイプラインの要件は以下の通り。
  • コンプライアンス関連処理はステージ test で実行する。
  • コンプライアンス関連処理のジョブ名は compliance-job-A とする。
  • コンプライアンス関連処理は常時、強制実行させる。
  • 各プロジェクトにあるファイル .gitlab-ci.ymlinclude する。

  • 既に存在するプロジェクトには、手動でコンプライアンスフレームワークを適用する。

    上記のご要件の他、筆者のご都合主義により以下の前提があると勝手に仮定します。

    【前提】
    既存 及び 今後作成されるすべてのプロジェクトのリポジトリに、.gitlab-ci.yml が必ず存在する。

    これらのご要件を満たすように、次章でコンプライアンスフレームワークを作成してまいります。
    開発経験のない筆者が適当に考えた架空のご要件と前提なので、開発現場の方からすると「ありえねぇよ!」なご要件だったらホントすみません。

    コンプライアンスフレームワークの設定

    前章のシナリオを実装していきます。

    設定STEP1:コンプライアンスパイプライン用の .yml ファイルを作成する

    まず、ご要件の内、赤字の部分を作成していきます。

    【企業Aのご要件】
    今後、GitLab.comのルートグループ配下に 新規作成 または インポートされる全プロジェクトに対して、以下を適用する。
  • コンプライアンス対象であることを示すラベルを付与する。
  • コンプライアンス関連処理を実行するコンプライアンスパイプラインを作成する。

  • コンプライアンスパイプラインの要件は以下の通り。
  • コンプライアンス関連処理はステージ test で実行する。
  • コンプライアンス関連処理のジョブ名は compliance-job-A とする。
  • コンプライアンス関連処理は常時、強制実行させる。
  • 各プロジェクトにあるファイル .gitlab-ci.ymlinclude する。

  • 既に存在するプロジェクトには、手動でコンプライアンスフレームワークを適用する。

    概要の章でも述べた通り、コンプライアンスパイプラインは、事前にそのパイプラインの設計を書いた yml ファイルを作成しておく必要があります。
    この yml ファイルのファイル名 及び 作成するグループやプロジェクト名は任意です。

    今回は例として、企業Aのルートグループの直下にプロジェクト compliance-pj を作成し、このプロジェクトのリポジトリにコンプライアンスパイプライン用ymlファイルを作成していきます。

    企業Aのルートグループ直下に作成したプロジェクト compliance-pj のトップ画面で、下図赤枠の [+] > [新規ファイル] をクリックします。

    コンプライアンスパイプラインに使うymlファイル名を指定します。
    ここでは例として、.compliance-pipelines.yml とします。

    コンプライアンスパイプラインに使うymlファイルの書き方は、.gitlab-ci.yml と同様です。
    企業Aの下記のご要件を満たすようにジョブを設定し、ファイルを保存します。

    • コンプライアンス関連処理はステージ test で実行する。
    • コンプライアンス関連処理のジョブ名は compliance-job-A とする。
    • コンプライアンス関連処理は常時、強制実行させる。
    • 各プロジェクトにあるファイル .gitlab-ci.ymlinclude する。

    なお、このブログではコンプライアンス関連処理の内容を簡略化 (echoに) しております。
    4点目のご要件については下記のGitLab Docsのサンプルを引用しております。
    参考:Compliance frameworks - Example configuration | GitLab

    compliance-job-A:
      stage: test
      when: always # 前のステージのジョブが失敗しても、このコンプライアンスパイプラインは実行します。
      script:
        - echo "ここに企業Aのコンプライアンス処理を入れます。"
    
    # 各プロジェクトのリポジトリに .gitlab-ci.yml を inculde する処理。
    include:
      - project: '$CI_PROJECT_PATH' # 変数の値は、パイプラインが実行される各プロジェクトのパスです。
        file: '$CI_CONFIG_PATH' # CI/CDパイプラインのymlファイルパス。通常は .gitlab-ci.yml です。
        ref: '$CI_COMMIT_SHA' # コミットリビジョン。定義しないとMRパイプラインは常にuse default branchを使用します。
        rules:
          - if: $CI_PROJECT_PATH != "ssg6/compliance-pj" # このプロジェクト以外のときのみincludeを実行する条件。
    

    以上でコンプライアンスパイプライン用の .yml ファイルを作成する手順は完了です。
    続いてルートグループの [設定] からコンプライアンスフレームワークを設定します。

    設定STEP2:ルートグループにコンプライアンスフレームワークを設定する

    続いて下記の赤字のご要件を設定していきます。

    【企業Aのご要件】
    今後、GitLab.comのルートグループ配下に 新規作成 または インポートされる全プロジェクトに対して、以下を適用する。
  • コンプライアンス対象であることを示すラベルを付与する。
  • コンプライアンス関連処理を実行するコンプライアンスパイプラインを作成する。

  • コンプライアンスパイプラインの要件は以下の通り。
  • コンプライアンス関連処理はステージ test で実行する。
  • コンプライアンス関連処理のジョブ名は compliance-job-A とする。
  • コンプライアンス関連処理は常時、強制実行させる。
  • 各プロジェクトにあるファイル .gitlab-ci.ymlinclude する。

  • 既に存在するプロジェクトには、手動でコンプライアンスフレームワークを適用する。

    GitLab.comの企業Aのルートグループに、Owner権限を持つユーザーでアクセスし、[設定] > [一般] > [コンプライアンスフレームワーク] を展開します。

    [フレームワークを追加] をクリックします。

    ご要件を満たす設定をしていきます。
    まずはラベルの設定です。下図赤枠部分でラベル名と色を指定します。

    次に、コンプライアンスパイプラインを ymlファイル名@ymlファイルがあるプロジェクトへのパス の形式で指定します。
    このブログの場合は、前章のSTEP1で作成したプロジェクト compliance-pj のファイル .compliance-pipelines.yml を指定しますので、以下のように設定します。
    .compliance-pipelines.yml@<企業Aのルートグループ名>/compliance-pj

    なお、指定方法が間違っていたり、ファイル名・グループ名・プロジェクト名が間違っていると、下図の通り "設定が見つかりません" と表示されます。

    説明欄にこのコンプライアンスフレームワークの説明を記載し、[フレームワークを追加] をクリックします。

    このコンプライアンスフレームワークをデフォルトに設定します。
    (デフォルトに設定すると、これ以降このルートグループ配下に作成される新規プロジェクト 及び インポートされたプロジェクトに、このフレームワークが自動で適用されます。)
    作成されたコンプライアンスフレームワークの右側にある点3つのアイコンをクリックし、[Set default] をクリックします。

    正常に更新された旨のメッセージが表示されることを確認します。

    以上でルートグループにコンプライアンスフレームワークを設定する手順は完了です。
    これ以降、このルートグループに新規作成される もしくは インポートされるプロジェクトには自動的にこのコンプライアンスフレームワークが適用されます。

    設定STEP3:既存のプロジェクトにコンプライアンスフレームワークを適用する

    下記の赤字の通り、企業Aは既存プロジェクトにもコンプライアンスフレームワークを適用するご要件をお持ちです。

    コンプライアンスフレームワークは、作った時点より前に存在するプロジェクトには自動適用されません。
    企業Aのご要件では既存プロジェクトにもコンプライアンスフレームワークを適用する必要があるので、手動で適用していきます。

    【企業Aのご要件】
    今後、GitLab.comのルートグループ配下に 新規作成 または インポートされる全プロジェクトに対して、以下を適用する。
  • コンプライアンス対象であることを示すラベルを付与する。
  • コンプライアンス関連処理を実行するコンプライアンスパイプラインを作成する。

  • コンプライアンスパイプラインの要件は以下の通り。
  • コンプライアンス関連処理はステージ test で実行する。
  • コンプライアンス関連処理のジョブ名は compliance-job-A とする。
  • コンプライアンス関連処理は常時、強制実行させる。
  • 各プロジェクトにあるファイル .gitlab-ci.ymlinclude する。

  • 既に存在するプロジェクトには、手動でコンプライアンスフレームワークを適用する。

    適用対象のプロジェクトにOwner権限を持つユーザーでアクセスし、[設定] > [一般] > [コンプライアンスフレームワーク] を開きます。

    プルダウンから今回作成したコンプライアンスフレームワークを選択し、[変更を保存] をクリックします。

    これで既存プロジェクトへのコンプライアンスフレームワークの適用は完了です。
    もし既存のプロジェクトが複数ある場合は、同様の手順を繰り返します。

    以上で企業Aのご要望を満たすコンプライアンスフレームワークの作成と適用は完了です。

    設定後の確認

    最後に、企業Aのルートグループ配下にテスト用のプロジェクトを1個作成し、コンプライアンスフレームワークが自動で適用されることを確認します。

    早速テスト用のプロジェクト samplePJ01 をルートグループ直下に作成しました。
    まず、コンプライアンスフレームワークが適用され、ラベルが付与されていることが目視でわかります。

    テスト用プロジェクトのにファイル.gitlab-ci.ymlを以下の内容で作成します。

    sample_buildjob1:
      stage: build
      script:
        - echo "プロジェクトの .gitlab-ci.yml のジョブ sample_buildjob1 です。"
    
    sample_testjob1:
      stage: test
      script:
        - echo "プロジェクトの .gitlab-ci.yml のジョブ sample_testjob1 です。"
    
    sample_testjob2:
      stage: test
      script:
        - echo "プロジェクトの .gitlab-ci.yml のジョブ sample_testjob2 です。"
    
    sample_deployjob1:
      stage: deploy
      script:
        - echo "プロジェクトの .gitlab-ci.yml のジョブ sample_deployjob1 です。"
    

    上記のファイル .gitlab-ci.yml を作成後、テスト用プロジェクトでCI/CDパイプラインを実行させると・・・。
    前述した.gitlab-ci.ymlに記載していたジョブの他に、コンプライアンスフレームワークで定義したコンプライアンスパイプライのジョブcompliance-job-Aが作成・実行されています。
    コンプライアンスパイプラインで定義したCI/CDパイプラインが適用されていることと、プロジェクトのリポジトリにある.gitlab-ci.ymlがincludeされていること (企業Aのご要件) が確認できました。

    コンプライアンスフレームワークの設定 及び 確認は以上となります。

    最後に

    この度はGitもCI/CDもよくわかっていないど素人SEによるGitLab検証ブログをお読みいただき、誠にありがとうございます。
    このブログの目標は以下のとおりでしたが、皆さまはいかがでしたでしょうか。


    今回のゴール
    • コンプライアンスフレームワークの概要を理解する。
    • コンプライアンスフレームワークをちょっとだけ触ってみる。

    このブログを書くにあたり、はじめてコンプライアンスフレームワークを試したのですが、本当に簡単に実装・設定できました。
    自社内にコンプライアンスルールがあり、それをGitLabのCI/CDパイプラインで処理できそうなら、是非本機能のご利用をご検討ください。

    この記事がGitLabを触り始めた方の一助となれば幸いにございます。


    GitLabに関するお問い合わせは、以下のフォームからお願い致します。
    GitLab製品 お問い合わせ

    今までのGitLabの検証ブログはこちらです。
    GitLab カテゴリーの記事一覧 - ネットワールド らぼ

    GitLab操作デモ動画 (基本編) を作ってみました。(音声の録音は自宅でiPhoneのボイスメモ使うという超低クオリティですが…。)
    つたない内容ではありますが、ご興味がおありでしたら是非ご視聴いただければと存じます。


    www.youtube.com