OPAのテストをCircleCIに乗せる

OPAのPolicyをテストする方法について前回は紹介しました!

kenfdev.hateblo.jp

OPAのバイナリさえあれば opa test コマンドで簡単にテストが実行できます。

ということでOPAのPolicyをCIに乗せて継続的にPolicyのテストができるようにしてみます。

どんなCIでもできますが、今回はCircleCIで試してみたのでその方法を共有します。

リポジトリの準備

Policyを書いたRegoファイルは 前回 のものをそのまま使います。

ファイルの構成は以下のとおり。これがGitHubリポジトリに置いてあることを前提にします。

.
├── iam.rego
└── iam_test.rego

ここに .circleci/config.yml を作ります。

mkdir .circleci

# エディタで編集
vim .circleci/config.yml

YAMLの中身は↓

version: 2
jobs:
  build:
    docker:
      - image: circleci/buildpack-deps:jessie

    steps:
      - checkout
      - run:
          name: Setup Environment Variables and Version file
          command: |
            echo 'export OPA_VERSION="0.10.6"' >> $BASH_ENV
            echo "${OPA_VERSION}" > _opa_version_
      - restore_cache:
          keys:
            - opa-cache-{{ checksum "_opa_version_" }}
      - run:
          name: Download OPA
          command: |
            if [ ! -f .bin/opa ]; then
              mkdir .bin
              wget -O .bin/opa https://github.com/open-policy-agent/opa/releases/download/v${OPA_VERSION}/opa_linux_amd64
              sudo chmod +x .bin/opa
            fi
      - run:
          name: Test Policies
          command: .bin/opa test .
      - save_cache:
          key: opa-cache-{{ checksum "_opa_version_" }}
          paths:
            - .bin

これで概ね準備完了です!

書いてる内容はちょっと多いのですがやってることは下の通り。

  • リポジトリのチェックアウト
  • ダウンロードするOPAのバージョンを環境変数に設定
  • OPAバイナリのキャッシュがあれば復元する
  • キャッシュが無ければダウンロードして実行権限与える
  • Policyを opa test でテストする
  • 次から再利用できるようにOPAバイナリをキャッシュしておく

このYAMLリポジトリにPushします。

CircleCIを設定

以下の公式ドキュメントにもありますが、CircleCIに対象となるリポジトリを追加します。

circleci.com

下の画面に表示されている「Start building」をクリックすることでCIが走ります!

f:id:kenev:20190409220122p:plain

正常にCIが走ればテストも通るはずなので、下のように成功画面になります。

f:id:kenev:20190412225659p:plain

では、わざとテストが失敗するように下のように iam_test.rego を編集しましょう!

f:id:kenev:20190409220846p:plain

新しいbranchで変更し、pushしてからPRを作ってみます。

pushした時点でCIが走るのでPRをGitHub上で作るころには失敗して、下のような画面になっているはずです!

f:id:kenev:20190409221622p:plain

このように、CIに乗せて継続的にPolicyのテストも実行していくことができます。

テスト好きにはたまらないですね!僕はテスト大好きなのでワクワクしてしまいます。

今回のコードは以下リポジトリに置いてますので、参考になればと思います!

github.com

おまけ

バッジもREADMEに載せてちょっと今風にしてみました!

CircleCIでプロジェクトの Settings に行って、Status Badgesに移動します。

すると、README.mdとかに貼り付けられるCircleCIのステータスバッジが下図のように記載されています。

f:id:kenev:20190412201757p:plain

これを貼り付ければ、下のようにCIの状況が表示されるバッジを載せることができます!

f:id:kenev:20190412202440p:plain

こういう取り組みも地味にモチベーションに繋がったりするので大事にしたいです。