GitLab
本チュートリアルでは、Shisho Cloud 上のワークフローを GitLab リポジトリにインポートしたのち、リポジトリ内のワークフローと Shisho Cloud 上のワークフローを同期する仕組みを GitLab の CI/CD を用いて構築します。
本チュートリアルは、以下の 4 ステップからなります:
- Shisho Cloud 上のワークフローを格納した GitLab プロジェクトを作成する
- Shisho Cloud において、特定プロジェクトの CI/CD からのアクセスを許可する
- GitLab において、ワークフローを Shisho Cloud にデプロイする CI/CD のジョブを作成する
- GitLab において、リポジトリ内と Shisho Cloud 上のワークフローの差分をチェックする GitLab CI/CD のジョブを作成する
3. のステップによって、リポジトリ内のワークフローの変更が即座に Shisho Cloud に反映されるようになります。 また 4. のステップによって、Shisho Cloud の Web インターフェースから直接ワークフローを編集した場合に、その変更に対応するマージリクエストが作成されるようになります。 これらのセットアップによって、GitLab リポジトリと Shisho Cloud 上のワークフローが常に同期されるようになります。
GitLab CI/CD から Shisho Cloud にアクセスするために「Shisho Cloud のアクセストークンを GitLab CI/CD にシークレットとして登録する」というような操作の必要はありません。その代わりに、CI/CD のジョブに対して GitLab が発行する OIDC トークンの情報に基づき、Shisho Cloud がジョブに短命の認証情報を発行します。
ワークフローを格納した GitLab プロジェクトを作成する
Shisho Cloud 上の全ての検査ルールを Git でバージョン管理するために、まずは既に Shisho Cloud 上にあるワークフローをエクスポートして、リポジトリに取り込みましょう。
まず GitLab で新規プロジェクトを作成し、リポジトリをクローンしてください。クローンしたディレクトリへ Shisho Cloud 上のワークフローをエクスポートするには、次のコマンドを実行します。ただし、コマンド中の $SHISHO_CLOUD_ORG_ID はお使いの Shisho Cloud 組織の ID に置換してください。
shishoctl workflow export --structured --org $SHISHO_CLOUD_ORG_ID --path .
エクスポートが完了したら、作成されたファイルをコミットして GitLab にプッシュしてください。
特定プロジェクトの CI/CD から Shisho Cloud 組織へのアクセスを許可する
続いて、GitLab CI/CD から Shisho Cloud にログインできるよう、Shisho Cloud 側の設定をしていきます。まず Shisho Cloud のボット作成画面を開き、「ボット」を作成します。ボットとは Shisho Cloud 組織へのアクセス権限を持つ主体であり、GitLab のジョブはボットとして Shisho Cloud にログインすることになります。

ボットを作成したら、ボット名をクリックすると信頼条件の設定画面に遷移します。

「プロバイダー」 は 「GitLab CI/CD」 を選択すると、GitLab の信頼条件が入力できるようになります。

信頼条件とは、GitLab のジョブが当該ボットとして Shisho Cloud にログインするために、ジョブが満たすべき条件です。ワークフローが格納されている GitLab プロジェクトのパスを記入すると、当該プロジェクトに属するジョブが、先ほど作成したボットとして Shisho Cloud にログインできるようになります。
信頼条件は GitLab の場合、プロジェクトパスの一致が条件となります。プロジェクトのパスは GitLab プロジェクトを特定する URL のグループ名から始まりプロジェクト名で終わるパスのことを指します。
ブラウザで GitLab のプロジェクトページを開くと URL が以下の形式となります:
https://gitlab.com/[グループ名]/[プロジェクト名]
サブグループを含む場合はサブグループ名が間に入ります:
https://gitlab.com/[グループ名]/[サブグループ01]/[サブグループ02]/ ... /[プロジェクト名]
これらのグループ名から始まりプロジェクト名で終わるパスの部分がプロジェクトパスに当たります:
[グループ名]/[サブグループ01]/[サブグループ02]/ ... /[プロジェクト名]
例えば、以下のプロジェクトページの URL があるとすると、太文字の部分がプロジェクトパスとなります。
- https://gitlab.com/my-group/my-project
- https://gitlab.com/my-group/my-subgroup01/my-project
- https://gitlab.com/my-group/my-subgroup01/my-subgroup02/my-project
GitLab ではグループ、サブグループ、プロジェクトの名前とは異なる文字列を URL のパスとして設定することが可能です。必ず GitLab プロジェクトの URL に使われているパスを確認してください。
ブラウザでプロジェクト配下の他のページを開いた場合(リポジトリのページなど)その別のページの情報もパスに含まるのでご注意ください。
記入が完了したら、「保存」ボタンをクリックしてください。
ボットや、GitHub Actions・カスタム OIDC IdP を含む他の認証方法についての一般的な説明は、ボット / 認証 を参照してください。
ワークフローを Shisho Cloud にデプロイする GitLab CI/CD ジョブを作成する
次のステップとして、ワークフローを Shisho Cloud にデプロイす る GitLab CI/CD ジョブを作成しましょう。リポジトリ内に、以下のようなファイルを作成してください。
include:
- local: /.gitlab/jobs/shishocloud-workflows-deploy.yml
shishocloud-workflows-deploy-job:
variables:
# FIXME: お使いの Shisho Cloud 組織の ID に置換してください
SHISHOCLOUD_ORG: flatt-security
# FIXME: 入力すべき BOT_ID の値は信頼条件の設定画面に記載されています
SHISHOCLOUD_BOT_ID: BTXXXXXXXXXXXXXXXXXXXXXXXXXX
id_tokens:
# Shisho Cloud にログインするために必要な権限
ID_TOKEN:
aud: https://gitlab.com
script:
# Install shishoctl
- SHISHOCTL_URL="https://shisho.dev/releases/shishoctl-0.15.0-x86_64-unknown-linux-gnu"
- curl -L $SHISHOCTL_URL -o /usr/local/bin/shishoctl
- chmod +x /usr/local/bin/shishoctl
# Sign in (as bot)
- shishoctl auth signin:bot
--bot ${SHISHOCLOUD_BOT_ID}
--expires-in-minutes 60
<<< ${ID_TOKEN}
# Deploy workflows
- shishoctl workflow apply --org "${SHISHOCLOUD_ORG}" --path .
コード中の FIXME と記載された箇所を適切に書き換えてください。なお、入力すべき bot の値は、先ほど作成した信頼条件の設定画面下部に記載されています。

以上のようにしてファイルを作成したら、コミットして GitLab にプッシュしてください。
ここまでの設定により、main ブランチにプッシュされるたびにリポジトリ内のワークフローが Shisho Cloud にデプロイされるようになります。GitLab のプロジェクトページから「ビルド」>「パイプライン」を開き、ジョブが正常に実行されたことを確認しましょう。
リポジトリ内と Shisho Cloud 上のワークフローの差分をチェックする GitLab CI/CD ジョブを作成する
これまでのセットアップによって、デフォルトブランチにプッシュされるたびにワークフローが Shisho Cloud にデプロイされるようになりました。しかし Shisho Cloud の Web インターフェースから直接ワークフローを編集した場合、リポジトリ内のワークフローと Shisho Cloud 上のワークフローとの間に差分が生じてしまいます。GitLab リポジトリで管理しているワークフローと Shisho Cloud 上で実際に実行されているワークフローが同一である状態を維持するためには、この 2 つの差分を定期的にチェックする必要があります。
shishoctl workflow pull コマンドは、Shisho Cloud 上のワークフローをローカルに取り込むコマンドです。このコマンドを利用して、Shisho Cloud 上のワークフローとリポジトリ内のワークフローとの間に差分がある場合に自動でマージリクエストを作成するジョブを作成していきます。
GitLab CI/CD のジョブ内でブランチをプッシュするためには、プッシュする権限があるプロジェクトのアクセストークンをまず作成する必要があります。GitLab のプロジェクトページから「設定」>「アクセストークン」を開き、「新しいトークンを追加」をクリックしてください。

「プロジェクトのアクセストークンの追加」のページを開きますと以下の内容を入力してください:
| トークン名: | Access token |
| 有効期限: | 任意 |
| ロールを選択: | Developer |
| スコープを選択: | write_repository のみ選択 |

「プロジェクトのアクセストークンを作成」をクリックすると、作成されたトークンが表示されます。作成されたトークンをコピーしてください。
次に、CI/CD のジョブからトークンをアクセスできるように CI/CD で利用できる変数として設定する必要があります。GitLab のプロジェクトページから「設定」> 「CI/CD」を開き、「変数」を展開したら「変数を追加」をクリックしてください。

「変数を追加」を開きますと以下の内容を入力してください:
| タイプ: | 変数 |
| 環境: | すべて |
| Visibility: | マスク |
| フラグ: | 全て選択 |