# GitLab CI/CD での Device Protection

GitLab CI/CD ジョブは Linux ランナーで実行されるため、Device Protection は他の Linux マシンと同じ方法でインストールされます。GitLab 特有なのはインストール先です。常駐する shell executor のホストに 1 回だけ行うか、Docker および Kubernetes executor では各ジョブ内で行います。

まず [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) トークンとインストール方式についてお読みください。以下のジョブレベルのスニペットでは container 方式を使用しており、これは [コンテナ内の 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 および Kubernetes の executor

これは GitLab.com のホストされたランナーにも当てはまります。Device Protection トークンを、次の名前のマスクされた CI/CD 変数として追加してください `AIKIDO_TOKEN`、その後、エージェントを起動します `before_script`:

{% code title=".gitlab-ci.yml" overflow="wrap" %}

```yaml
default:
  before_script:
    - curl -fsSL https://github.com/AikidoSec/safe-chain/raw/refs/heads/main/install-scripts/install-endpoint-linux.sh | sh -s -- --container
    - aikido-endpoint-protection-start --wait-for-healthy
    - for f in /etc/profile.d/aikido-*.sh; do . "$f"; done

install:
  image: node:20-bookworm
  script:
    - npm ci
```

{% endcode %}

* **`before_script` はシェルを共有します `script`**、そのため読み込まれた設定がコマンドに反映されます。独自の `before_script` ものを使うジョブでは、デフォルトのものが置き換えられるため、そこでも 3 行を繰り返してください。
* **ジョブは root として実行する必要があり、イメージには `curl`.**

## Shell executor

runner ホストにエージェントを `--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=".gitlab-ci.yml" overflow="wrap" %}

```yaml
verify-device-protection:
  image: node:20-bookworm
  script:
    - 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` は、ダウンロードがエージェントを回避したことを意味します。

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

| 問題                                                | 修正                                                      |
| ------------------------------------------------- | ------------------------------------------------------- |
| `トークンが必要です`                                       | ジョブはその変数を参照できません。保護された変数は保護されたブランチとタグにのみ届きます            |
| `root 権限が必要です`                                    | イメージは non-root ユーザーとして実行されます。root として実行されるイメージを使用してください |
| テストパッケージが返す `200`、または `SELF_SIGNED_CERT_IN_CHAIN` | ジョブが上書きします `before_script`。そこに 3 行を追加してください             |
