# CircleCIでのDevice Protection

CircleCIのジョブはLinuxエグゼキューター上で実行されるため、Device Protectionは他のLinuxマシンと同じ方法でインストールします。CircleCI固有なのはインストール先です。常駐するセルフホストランナーに一度だけインストールするか、Dockerエグゼキューターおよびmachineエグゼキューターでは各ジョブ内でインストールします。

トークンとインストール形態については、まず[Linux向けDevice Protectionのインストール](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux)をお読みください。以下のジョブレベルのスニペットではコンテナ形態を使用しています。詳しくは[コンテナでのDevice Protection](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/device-protection-in-containers)で説明しています。

## Dockerエグゼキューターとmachineエグゼキューター

Device Protectionのトークンを、`AIKIDO_TOKEN`という名前でプロジェクトの環境変数またはコンテキストに追加します。次に、再利用可能なコマンドを定義し、各ジョブの最初に実行します。

{% code title=".circleci/config.yml" overflow="wrap" %}
```yaml
version: 2.1

commands:
  start-device-protection:
    steps:
      - run:
          name: Start Device Protection
          command: |
            curl -fsSL https://github.com/AikidoSec/safe-chain/raw/refs/heads/main/install-scripts/install-endpoint-linux.sh \
              | sudo AIKIDO_TOKEN="$AIKIDO_TOKEN" sh -s -- --container
            sudo aikido-endpoint-protection-start --wait-for-healthy
            echo 'for f in /etc/profile.d/aikido-*.sh; do . "$f"; done' >> "$BASH_ENV"

jobs:
  build:
    docker:
      - image: cimg/node:lts
    steps:
      - checkout
      - start-device-protection
      - run: npm ci

workflows:
  build:
    jobs:
      - build
```
{% endcode %}

* **トークンは`sudo`の後に渡します。** `sudo`はそれ以外の環境変数を引き継ぎません。`sudo`なしでrootとして実行されるイメージでは、両方の`sudo`プレフィックスを削除してください。
* **`$BASH_ENV`の行は、以降のすべてのステップに適用されます。** CircleCIは各`run`ステップの開始時にこのファイルを読み込みます。
* **ランナーはVMですが、`--container`を使用します。** ジョブはランナーを再起動できず、コンテナモードでは再起動が不要です。エージェントを明示的に起動しているのもそのためです。[インストール形態の選択](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux#choose-the-install-flavor)を参照してください。

## セルフホストランナー

ランナーホストに`--headless`を指定してエージェントをインストールし、再起動します。[Linux向けDevice Protectionのインストール](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/install-device-protection-for-linux#choose-the-install-flavor)を参照してください。

## 動作確認

{% code title=".circleci/config.yml" overflow="wrap" %}
```yaml
      - run:
          name: Verify Device Protection
          command: curl -sS -o /dev/null -w "%{http_code}\n" --max-time 15 https://registry.npmjs.org/safe-chain-test/-/safe-chain-test-0.0.1-security.tgz
```
{% endcode %}

`403`は、エージェントがマルウェアのテストパッケージをブロックしたことを意味します。`200`は、ダウンロードがエージェントを経由しなかったことを意味します。

## トラブルシューティング

| 問題                                                    | 対処法                                                                                                          |
| ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `Token is required`                                        | ジョブから変数が参照できません。ジョブが正しいコンテキストを使用しているか確認してください。フォークからのプルリクエストには、デフォルトで変数が渡されません |
| `Root privileges required`                                 | インストールコマンドと起動コマンドの先頭に`sudo`を付けてください                                                          |
| テストパッケージが`200`を返す、または`SELF_SIGNED_CERT_IN_CHAIN` | そのステップがbashで実行されていないため、`$BASH_ENV`が読み込まれていません。そのステップで`/etc/profile.d/aikido-*.sh`を読み込んでください      |
