CircleCIのAPIで環境変数を更新する

CircleCIのAPIを使います。環境変数を更新します。Contextの環境変数とプロジェクトごとの環境変数、両方とも更新できます。
2022.10.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CircleCIの環境変数を定期的に更新する運用をしているリポジトリがあります。 手動ポチポチしていましたが、もっと効率よく更新するために、CircleCIのAPIを使って自動化してみました。

おすすめの方

  • CircleCI APIを使いたい方
  • CircleCI APIで環境変数を更新したい方

環境変数を事前準備する

CircleCIには、2つの環境変数があります。今回は、この2つの環境変数をそれぞれ更新します。

  • Contextの環境変数: 複数のプロジェクトで参照できる環境変数
  • プロジェクトの環境変数: ひとつのプロジェクトで参照できる環境変数

Contextの環境変数

組織単位で使える環境変数を設定します。まずは、Contextを作成します。

CircleCIのContextを作成する

続いて、作成したcontext内に環境変数を作成します。

name value
ContextTestEnvironment1 aaaaaa
ContextTestEnvironment2 bbbbbb

CircelCIのContextに環境変数を作成する

なお、URLにある「Context ID」は、あとで使うのでメモしておきます。

プロジェクトの環境変数

環境変数を2つ作成します。

name value
ProjectTestEnvironment1 yyyyyy
ProjectTestEnvironment2 zzzzzz

CircleCIのプロジェクトに環境変数を作成する

APIトークンの取得

Personal API Tokensにアクセスして、APIトークンを取得します。

CircleCI APIで環境変数を更新する

変更後の値

それぞれ、下記に変更します。

name value
ContextTestEnvironment1 111111
ContextTestEnvironment2 222222
ProjectTestEnvironment1 888888
ProjectTestEnvironment2 999999

Pythonスクリプト

Contextとプロジェクトの環境変数を更新します。次のPythonスクリプトを実行します。

app.py

import json
import requests


API_TOKEN = 'your_token'

CIECLECI_ENDPOINT = 'circleci.com/api/v2'

CONTEXT_ID = 'your_context_id'

PROJECT_SLUG = 'vcs-slug/org-name/repo-name'


def main():
    update_context_environment('ContextTestEnvironment1', '111111')
    update_context_environment('ContextTestEnvironment2', '222222')

    update_project_environment('ProjectTestEnvironment1', '888888')
    update_project_environment('ProjectTestEnvironment2', '999999')

def update_context_environment(env_name: str, env_value: str) -> None:
    # https://circleci.com/docs/api/v2/index.html#operation/addEnvironmentVariableToContext
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Circle-Token': API_TOKEN
    }
    body = {
        'value': env_value,
    }
    resp = requests.put(
        f'https://{CIECLECI_ENDPOINT}/context/{CONTEXT_ID}/environment-variable/{env_name}',
        headers=headers,
        data=json.dumps(body),
    )

    print(resp.status_code)
    print(resp.json())

def update_project_environment(env_name: str, env_value: str) -> None:
    # https://circleci.com/docs/api/v2/index.html#operation/createEnvVar
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Circle-Token': API_TOKEN
    }
    body = {
        'name': env_name,
        'value': env_value,
    }
    resp = requests.post(
        f'https://{CIECLECI_ENDPOINT}/project/{PROJECT_SLUG}/envvar',
        headers=headers,
        data=json.dumps(body),
    )

    print(resp.status_code)
    print(resp.json())

if __name__ == '__main__':
    main()

結果を確認する

更新に成功しました!

Contextの環境変数

CircelCIのContextの環境変数が更新された

プロジェクトの環境変数

CircleCIのプロジェクトの環境変数が更新された

さいごに

CircleCIのAPIを使って、環境変数を更新してみました。 他にもいろいろとAPIがあるので、面白そうなことができないか、試してみようと思います。

参考