# GitHub ActionsでのDevice Protection

GitHub ActionsのジョブはLinuxランナー上で実行されるため、Device Protectionは他のLinuxマシンと同じ方法でインストールします。GitHub Actions固有なのはインストール先です。存続し続けるセルフホストランナーに一度だけインストールするか、ジョブ終了後に破棄されるホステッドランナーではジョブごとにインストールします。

トークンとインストールフレーバーについては、まず[Install Device Protection for Linux](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 in Containers](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/device-protection-in-containers)で説明しています。

## GitHubホステッドランナー

Device Protectionのトークンを`AIKIDO_TOKEN`という名前のシークレットとして追加し、パッケージをインストールするステップより前にエージェントを起動します。

{% code title=".github/workflows/build.yml" overflow="wrap" %}
```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Start Device Protection
        env:
          AIKIDO_TOKEN: ${{ secrets.AIKIDO_TOKEN }}
        run: |
          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

      - uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          for f in /etc/profile.d/aikido-*.sh; do . "$f"; done
          npm ci
```
{% endcode %}

* **トークンは`sudo`の後に渡してください。** `sudo`はそれ以外の環境変数を破棄します。
* **パッケージをインストールするすべてのステップで`/etc/profile.d/aikido-*.sh`を読み込んでください。** 各ステップは新しいシェルで実行されるため、これらの設定がないとダウンロードはエージェントを経由しません。
* **ランナーはVMですが、`--container`を使用します。** ジョブからランナーを再起動することはできず、コンテナモードでは再起動が不要です。エージェントを明示的に起動するのもそのためです。[Choose the install flavor](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)を参照してください。

読み込みの行を省略するには、すべてのステップをログインシェルで実行します。ログインシェルは`/etc/profile.d/`を自動的に読み込みます。

{% code title=".github/workflows/build.yml" overflow="wrap" %}
```yaml
defaults:
  run:
    shell: bash --login -eo pipefail {0}
```
{% endcode %}

## ジョブコンテナ

`container:`を指定したジョブはrootとして実行されるため、`sudo`なしで同じステップを使用します。イメージには`curl`が必要です。イメージにエージェントがすでにインストールされている場合は、インストールを省略して起動のみを行います。[Job containers in GitHub Actions](https://help.aikidogov.us/docs/docs-ja/aikido-device-protection/deploying-aikido-endpoint/device-protection-mdm-guides/linux/device-protection-in-containers#job-containers-in-github-actions)を参照してください。

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

ランナーホストに`--headless`を指定してエージェントをインストールし、再起動します。[Install Device Protection for Linux](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=".github/workflows/build.yml" overflow="wrap" %}
```yaml
      - name: Verify Device Protection
        run: |
          for f in /etc/profile.d/aikido-*.sh; do . "$f"; done
          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`                      | シークレットがインストールに渡っていません。`env`でマッピングし、`sudo`の後に渡してください。フォークからのプルリクエストにはシークレットが渡されません |
| `Root privileges required`                                 | インストールコマンドと起動コマンドの先頭に`sudo`を付けてください                                                          |
| テストパッケージが`200`を返す、または`SELF_SIGNED_CERT_IN_CHAIN` | ステップで`/etc/profile.d/aikido-*.sh`が読み込まれていません                                        |
