CircleCIのparameters使うと複数のjobを関数化できるというのを知ったぞ。便利。
— adachin👾SRE (@adachin0817) October 18, 2022
CircleCIで下記のように複数のStg環境デプロイがあった場合、jobを毎回指定していました。コード自体の可読性は上がりますが、やたらコードが長くなってしまったり、メンテナンスがしづらいというデメリットが生じてしまいます。今回はparametersを利用して複数のjobを関数化してコードをキレイにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
~省略~ deploy_stg1: executor: docker_build steps: - aws-cli/setup: aws-region: AWS_REGION aws-access-key-id: AWS_ACCESS_KEY_ID aws-secret-access-key: AWS_SECRET_ACCESS_KEY override-installed: false - aws-ecs/update-service: family: 'stg1-hoge-service' service-name: 'stg1-hoge-service' cluster: 'stg1-hoge-cluster' container-image-name-updates: 'container=hoge,tag=${CIRCLE_SHA1}' deploy_stg2: executor: docker_build steps: - aws-cli/setup: aws-region: AWS_REGION aws-access-key-id: AWS_ACCESS_KEY_ID aws-secret-access-key: AWS_SECRET_ACCESS_KEY override-installed: false - aws-ecs/update-service: family: 'stg2-hoge-service' service-name: 'stg2-hoge-service' cluster: 'stg2-hoge-cluster' container-image-name-updates: 'container=hoge,tag=${CIRCLE_SHA1}' workflows: version: 2 deploy_stg1: when: << pipeline.parameters.deploy_stg1 >> jobs: - deploy_stg1: deploy_stg2: when: << pipeline.parameters.deploy_stg2 >> jobs: - deploy_stg2: |
パイプライン値とパラメーター
https://circleci.com/docs/ja/pipeline-variables/
https://circleci.com/docs/ja/reusing-config/
- パイプライン値: 設定ファイル全体で使用できるメタデータ。
- パイプラインパラメーター: 型指定されたパイプライン変数。 設定ファイルの一番上にある
parameters
キーで宣言します。parameters
は、API からパイプラインの新規実行をトリガーする際にパイプラインに渡すことができます。
- 例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
version: 2.1 parameters: image-tag: type: string default: "latest" workingdir: type: string default: "~/main" jobs: build: docker: - image: cimg/node:<< pipeline.parameters.image-tag >> auth: username: mydockerhub-user password: $DOCKERHUB_PASSWORD # context / project UI env-var reference environment: IMAGETAG: << pipeline.parameters.image-tag >> working_directory: << pipeline.parameters.workingdir >> steps: - run: echo "Image tag used was ${IMAGETAG}" - run: echo "$(pwd) == << pipeline.parameters.workingdir >>" |
jobに対して定義した引数を渡すことが可能で、引数の型を指定してworkflowからjobに渡すことができます。共通stepやパラメータを一元化できるのと、修正する箇所がパラメーターのみになるので修正コストが下がります。もちろんパラメーターに依存してしまうので、コードを把握する前提となります。
修正してみる
- config.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
~省略~ deploy_container: executor: deploy_image parameters: env: type: string steps: - aws-cli/setup: aws-region: AWS_REGION aws-access-key-id: AWS_ACCESS_KEY_ID aws-secret-access-key: AWS_SECRET_ACCESS_KEY override-installed: false - aws-ecs/update-service: family: "<< parameters.env >>-hoge-task" service-name: "<< parameters.env >>-hoge-service" cluster: "<< parameters.env >>-hoge-cluster" container-image-name-updates: 'container=hoge,tag=${CIRCLE_SHA1}' workflows: version: 2 deploy_stg1: when: << pipeline.parameters.deploy_stg1 >> jobs: - deploy_container: env: stg1 deploy_stg2: when: << pipeline.parameters.deploy_stg2 >> jobs: - deploy_container: env: stg2 |
3行目のparametersではenvという引数をstringで指定します。その後13行目から16行目で環境ごとの引数をparametersで渡し、workflowsで対象のjobs名と引数を指定するだけです。
まとめ
むちゃくちゃ便利か!しかもこんな書き方があるのを知らんかったぞ….バシバシparametersを使いこなしていこうと思います!
0件のコメント