GitLab CI/CD における高度な設定

version 2.3以降

1. CI/CD Job Token の代りにProject Access Token を利用する

GitLab のTierがFree の場合など、 CI/CD Job Token でアーティファクトにアクセスできない際に、Project Access Token を生成して利用する方法を説明します。下図に示すように、解析対象となるリポジトリのサイドメニューで、Settings -> Access Tokens と選択して、Project Access Token の管理画面に入ります。

次に、下図のように、Token name にわかりやすい任意の文字列を入力し、”Select scopes” は、”read_api” を選択して “Create Project Access Token” をクリックしてトークン列を生成します。

次の画面で、生成されたトークン列をコピーします(下図のように、トークン列が表示されているテキストボックスの右にクリップボードにコピーするためのアイコンがあります)。

yamlスクリプト内部にアクセストークンをそのまま記述することは、セキュリティの観点からお薦めいたしません。代わりに、GitLab の環境変数の設定機能を用いて、トークン情報を隠蔽しましょう。GitLab CI/CDの環境変数は、リポジトリのサイドメニューのSettings -> CI/CD で展開されるVariables の項目から設定可能です。下図では、PAT_SIDERSCAN という環境変数で、先程得られたトークン列を隠蔽している例です。その環境変数のProtectedフラグはx(無効)にしてください。詳しくは、GitLab のマニュアルを参照下さい。

Project Access Token を使う場合は、 .gitlab-ci.yml における、wget の行

'wget --header "JOB-TOKEN: ${CI_JOB_TOKEN}" "${CI_SERVER_URL}/api/v4/projects/${CI_PROJECT_ID}/jobs/artifacts/${CI_COMMIT_REF_NAME}/raw/output.radump?job=scan-job" -O output.radump || true'

"JOB-TOKEN: ${CI_JOB_TOKEN}" を "PRIVATE-TOKEN: ${PAT_SIDERSCAN}" と変更してください。ここでPAT_SIDERSCAN は、生成したProject Access Token のトークン列を隠蔽した環境変数です。

 

2. 解析結果(アーティファクト) の保存期間を変更する

GitLabにおける、アーティファクトの既定の保存期間は30日です。延長したい場合には設定ファイル .gitlab-ci.ymlexpire_in に所望の日数を記入してください。以下は90日に延長した一例です。

  artifacts:
    paths:
      - output.radump
      - scan_result/*
    expire_in: 90 days # 解析結果を保存したい日数を指定

 

3. CI/CD のタイムアウト時間を延長する

Sider Scan は、初回の解析はリポジトリ全体のソースコードを解析します。初回の解析時間は、レポジトリのサイズや重複コードの数に依存しますが、1時間以上かかることもあります。その場合は CI/CD のタイムアウト時間の延長設定をお願いいたします。設定方法はこちらのGitLab のマニュアルを参照下さい。2回目以降の解析に関しては、前回の解析内容を取得して、前回解析時から変更のあったファイルのみ分析しますので、短時間で完了します。

4. 特定のランナーでSider Scan を実行する

ランナーとは、GitLab CI/CD において様々なjobを実際に実行するリソースです。Sider Scan も、我々の手順書通りに設定すると、GitLab ランナーから呼び出されて実行されます。

ランナーには複数の実行形態があり、Docker, Kubernetes, VirtualBox, Parallels executorといった仮想環境を利用するものや、SSH、Shell executorといった、Runnerが動いているLinux環境でそのままjobを実行するものもあります。GitLab の管理者が複数のプロジェクトで共通で使用できるランナーを用意してくれていることもあります。ここでは、Sider Scan を特定のランナーで実行するための設定方法を説明します。

以下は、GitLab 向け導入ガイド でも説明した .gitlab-ci.yml のサンプルコードの冒頭の行を抜粋したものですが、6行目と7行目が新たに追加されています。この行が使用するランナーを指定するためのものです。

stages:
  - scan

scan-job:
  stage: scan
 tags:
   - sider-scan # 使用するランナーのタグ名
  image: sider/sider_scan_runner:latest

7行目には、Sider Scan を実行するために利用可能なランナーのタグ名を記載します。(上記コードはsider-scan というタグ名のランナーを使っている例です)。利用可能なランナーのタグ名は、GitLab プロジェクト画面でSettings -> CI/CD をクリックすると表示されるCI/CD Settings 画面で、”Runners” のExpand ボタンをクリックすると確認できます。

 

5. Sider Scan のGitLab CI 上での同時実行回数を抑制する

Sider Scan は、ソースコードにおける重複を検出し、独自のアルゴリズムで修正漏れ等を検出します。解析の処理時間の改善には常に取り組んでいますが、特にリポジトリの初回解析では全てのソースコードが解析対象となるため、リポジトリのサイズによっては1時間以上かかることもあります。

GitLab では、CI/CD で利用される処理は、ソースコード管理のGit 本体が稼働しているサーバーとは分けて構築することを奨励されていますが、GitLab CI/CD がGitLab 本体と同一のサーバーで運用されているケースもあります。また、CI/CDの処理が別のサーバーで行われていたとしても、Sider Scan が同時に実行される数を抑制したいケースはあります。

ここでは、GitLab 全体で同時に動作するSider Scan の数を抑制する方法について説明します。

5-1. Shard-Runner の登録

Admin 権限を持つ方のみ設定可能です。Webのトップバーメニューの”Admin”から、”Runners” を選び、Runner の管理画面に入ります。

“Register an instance runner” をクリックし、新しいShared-Runner を登録します。

5-2. Shared-Runner の設定

Run untagged Jobs のチェックを外し、”Tags” にわかりやすい任意の文字列を入力します。ここでは、siderscan-tag とします。

5-3. 同時実行数の設定

設定したRunner で最大何個同時に実行出来るかの設定ファイルは、

/etc/gitlab-runner/config.toml にあります。このファイルをエディタ等で開き、同時実行数を1にする場合は、
concurrent = 1
と記載します(GitLab をインストール後、特に変更していければ、concurrent には1が設定されています)

toml ファイルの詳細に関してはこちらのGitLab の資料も参照下さい。

以上で、GitLab CI/CD 全体で動作するSider Scan を1つに抑制できます。同時にSider Scan を使用するJob が走った場合は、後に登録されたJob が単純に待たされます。