CircleCIの環境変数を定期的に更新する運用をしているリポジトリがあります。 手動ポチポチしていましたが、もっと効率よく更新するために、CircleCIのAPIを使って自動化してみました。
おすすめの方
- CircleCI APIを使いたい方
- CircleCI APIで環境変数を更新したい方
環境変数を事前準備する
CircleCIには、2つの環境変数があります。今回は、この2つの環境変数をそれぞれ更新します。
- Contextの環境変数: 複数のプロジェクトで参照できる環境変数
- プロジェクトの環境変数: ひとつのプロジェクトで参照できる環境変数
Contextの環境変数
組織単位で使える環境変数を設定します。まずは、Contextを作成します。
続いて、作成したcontext内に環境変数を作成します。
name | value |
---|---|
ContextTestEnvironment1 | aaaaaa |
ContextTestEnvironment2 | bbbbbb |
なお、URLにある「Context ID」は、あとで使うのでメモしておきます。
プロジェクトの環境変数
環境変数を2つ作成します。
name | value |
---|---|
ProjectTestEnvironment1 | yyyyyy |
ProjectTestEnvironment2 | zzzzzz |
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の環境変数
プロジェクトの環境変数
さいごに
CircleCIのAPIを使って、環境変数を更新してみました。 他にもいろいろとAPIがあるので、面白そうなことができないか、試してみようと思います。