# CIからすべてのリリースやデプロイをスキャンする

リリースやデプロイのたびに、GitHub Actions、Vercel、GitLab、Bitbucket、CircleCI、またはデプロイスクリプトから、サイトのPulseまたはDeepスキャンを実行します。

このページは、サイトをビルドして公開する担当者向けです。担当者があなたでない場合は、このリンクを送ってください。

リリーススキャンは、サイトを配信している場所で実行されます。サイトのPulse（またはDeep）スキャンを開始し、結果を待って報告します。スキャンで選んだ重大度以上の問題が見つかった場合は、公開を停止します。公開中のサイトは、どちらの場合も稼働し続けます。各リリーススキャンは、毎月のスキャン枠を1回使います。Lockpickで開始したスキャンと同じ上限と所有権の確認が適用されるので、公開の頻度を数えておいてください。

## 設定する

1. Lockpickでサイトを開き、**設定**を選んでから、**リリーススキャンを設定**を選びます。
2. **CIキー**を作成します。Lockpickはキーを一度だけ表示するため、すぐにコピーしてください。
3. CIのシークレットに `LOCKPICK_CI_KEY` という名前で保存します。
4. リリーススキャンのページで、サイトの配信元に応じた設定を開き、リポジトリにコピーしてください。すでにサイトの情報が入力されています。

> **Careful**
>
> キーはCIのシークレットストアに保管し、リポジトリ内のファイルには決して保存しないでください。キーを持つ人は誰でもサイトのスキャンを開始でき、そのスキャンは枠を使用します。

## 実行場所

| 配信元                       | スキャンのタイミング             | キーの保存先                             |
| ------------------------- | ---------------------- | ---------------------------------- |
| GitHub Actions            | リリースを公開したとき、または手動で     | リポジトリのシークレット `LOCKPICK_CI_KEY`     |
| Vercel                    | 本番デプロイのあと、または手動で       | リポジトリのシークレット `LOCKPICK_CI_KEY`     |
| GitLab CI                 | タグの場合、他のステージのあと、または手動で | マスク付きCI/CD変数 `LOCKPICK_CI_KEY`     |
| Bitbucket Pipelines       | バージョンタグの場合、または手動で      | 保護されたリポジトリ変数 `LOCKPICK_CI_KEY`     |
| CircleCI                  | バージョンタグの場合             | プロジェクトの環境変数 `LOCKPICK_CI_KEY`      |
| Fly.io、Railway、Render、その他 | デプロイスクリプトまたはCIジョブの最後   | シークレットから取得した環境変数 `LOCKPICK_CI_KEY` |

### GitHub Actions

リリーススキャンのページにある2つのコマンドを使って、アクションを `.github/actions/lockpick-scan/` にコピーし、次にワークフローを追加します。リリースを公開するか、**Actions**タブからワークフローを実行すると、スキャンが開始されます。ジョブのサマリーに結果が表示されます。

### Vercel

Vercelのプロジェクトが GitHub のリポジトリに接続されていると、Vercelは各デプロイについてGitHubに通知します。Vercelのワークフローはそれらのイベントを待ち受け、**本番**デプロイのあとにスキャンします。プレビューはスキャンしません。このワークフローにもアクションをリポジトリにコピーしておく必要があります。また、Vercelはこれらのイベントを、デフォルトブランチのワークフローにのみ送ります。

本番デプロイのたびに枠のスキャンを1回使うため、本番へのデプロイが月に数回程度の場合にのみ、この方法を選んでください。それ以外の場合は、リリースごとにスキャンしてください。

### GitLab、Bitbucket、CircleCI、デプロイスクリプト

これらは、Node 20以降で同じスキャンスクリプトを実行します。セットアップでは、Lockpickからスクリプトをダウンロードし、`LOCKPICK_SITE_ID`、`LOCKPICK_SCAN`、`LOCKPICK_FAIL_ON`、`LOCKPICK_API_URL` を設定します。キーは `LOCKPICK_CI_KEY` から読み込まれます。スクリプトはジョブのログにサマリーを出力し、スキャンが失敗した場合は終了コード1で終了します。そのため、パイプラインはそこで停止します。これは単独のスクリプトの仕様です。CLIでは、問題の閾値を示すために終了コード8を使います。[比較表](/ja/docs/cli/ci#cli-and-release-scan-script-exit-codes)を参照してください。

Fly.ioにはデプロイの通知機能がなく、RailwayとRenderのデプロイは通常CIジョブまたはスクリプトから実行されるため、デプロイコマンドの後にスクリプトを追加してください（例: `fly deploy` や `railway up`）。

すでにLockpick CLIを使っている場合は、`lockpick pulse <site> --fail-on high` もCIキーで動作します。その場合のキーは `LOCKPICK_KEY` に設定します。Pulseのみを実行します。

## CIキーでできること

CIキーは1つのサイトにのみ使えます。Pulseを開始でき、許可されていればDeepスキャンを開始でき、それらのスキャンを読み取れます。ほかのサイトを見たり、サイトを追加したり、Lockpickの内容を変更したりすることはできません。

CIキーは、使用の有無にかかわらず、作成時に選んだ日（30日、90日、180日、365日）に期限切れになります。リリーススキャンのページには、各キーが最後に使われた日時と、期限切れになる日時が表示されます。そこでキーを取り消すと、そのキーを使うすべてのパイプラインが直ちに停止します。キーを作成した人がサイトへのアクセス権を失った場合も、キーは機能しなくなります。

## リリースからのDeepスキャン

CIでDeepを使うためにキーを作成するときに**Deep も**にチェックを入れ、次に**このキーで開始されるサイトのDeepスキャンを承認します**にチェックを入れてください。このチェックは、そのキーで開始される、そのサイトのDeepスキャンを承認することになります。そのため、CIがスキャンごとにあなたの承認を待つことはありません。それでも、すべてのDeepスキャンには次のものが必要です。

* プランにDeepが含まれており、枠に残りがあること。
* [サイトの所有を証明](/ja/docs/protect/prove-you-own-your-site)する記録。スキャン開始時点でも公開されている必要があります。

次に、GitHubワークフローで `scan: deep` を設定してください（手動で実行する場合は**deep**を選びます）。それ以外の場所では `LOCKPICK_SCAN=deep` を設定してください。

## ジョブが失敗するとき

ジョブが失敗するのは、次の場合です。

* 未解決の検出事項が `fail-on` 以上の重大度にある場合（既定は `high`。`critical`、`medium`、`low`、`none` から選べます）。
* スキャンが失敗した、キャンセルされた、または制限時間を過ぎても実行中だった場合（スキャンはLockpickで実行を続けます）。
* Lockpickがスキャンを開始できなかった場合。たとえば、今月のスキャンが残っていない、Deepが許可されていない、所有権が証明されていない、またはキーの期限が切れている場合です。ジョブには理由と対処法が表示されます。

サマリーには、成績、重大度別の未解決の検出事項、そしてスキャンへのリンクが表示されます。各検出事項には修正方法が含まれています。検出事項の詳細がログにコピーされることは決してありません。すべてを確認できなかったスキャンは、確認できた範囲で評価され、サマリーには一部の領域が不明であることが示されます。

同じパイプラインをもう一度実行すると、新しくスキャンを開始する代わりに、既存のスキャンを再利用します。これは GitHub Actions、GitLab CI、Bitbucket Pipelines、CircleCI で動作します。Vercelのデプロイは、そのイベントが何回届いても一度だけスキャンされます。

リリーススキャンに合格しても、セキュリティの認証にはなりません。Lockpickが評価できなかった範囲は、合格ではなく不明として扱われます。