LoginSignup
2
0

ポートフォリオ作成の過程でgithubに各ブランチでプッシュした場合はJestを走らせて、mainブランチにプルリクした場合のみs3のwebホスティングしているバケットにデプロイするようなCI/CDを構築したかった。
その過程でcicle ciのconfig.ymlについて理解をする必要があったので載せておく。

こんな構成
名称未設定ファイル.drawio (1).png

とりあえず、結論

version: 2.1

orbs:
  aws-s3: circleci/aws-s3@3.0.0

executors:
  default:
    docker:
      - image: cimg/node:14.15.0
      - image: cimg/python:3.10

commands:
  npm_install:
    steps:
      - restore_cache:
          key: dependency-cache-{{ checksum "package.json" }}
      - run:
          name: install npm
          command: npm install
      - save_cache:
          key: dependency-cache-{{ checksum "package.json" }}
          paths:
            - node_modules

jobs:
  test_frontend:
    executor: default
    steps:
      - checkout
      - npm_install
      - run:
          npm test

  build_deploy:
    executor: default
    steps:
      - checkout
      - npm_install
      - run:
          npm run build
      - run:
          ls -la
      - aws-s3/sync:
          arguments: |
            --delete --exact-timestamps
          from: ./build
          to: s3://{{s3のバケット名}}

workflows:
  version: 2
  continuous_integration&continuous_deploy:
    jobs:
      - test_frontend
      - build_deploy:
          requires:
            - test_frontend
          filters:
            branches:
              only: main

上から解説していく

version

circle ciのconfigバージョン。

orbs

ジョブ、 コマンド、 Executor などの、共有可能な設定要素をパッケージ化したもので、本来、特定のビルドやコマンドなどを記載しなくてはいけないところを、circle ciのほうでパッケージ化してくれてるので冗長になってしまう部分を簡素に書くことができる。
今回はs3 syncを使うために aws-s3: circleci/aws-s3@2.0.0 を設定。

executors

CircleCI で実行するテストやデプロイを動かすための環境を共通化して使うためのもの、今回でいえば、ソースはReactで構築していたので npmまわりのインストールやビルドにNode.jsが必要なのでそれのDockerイメージと、aws cliのためにPythonイメージを設定している。

commands

これは使いまわしたいコマンドを共通化するときに使えるもの、今回でいえばJestのテスト実行とデプロイ前のビルドに同じnpmコマンドを使うため共通化した。

command

実行するコマンド。

restore_cache

キャッシュを活用することでビルド時間を短縮するが、package.jsonが更新されている場合はモジュールの再インストールが必要なので、checksumでpackage.jsonの中身をチェックして、変化があれば npm install を実行して、なければ次の処理をスキップするようにしている。

save_cache

キャッシュすることでビルド時間を短縮する。
今回でいえば、node_modulesをキャッシュすることでビルド時間を短縮している。

jobs

wolkflowで実行する単位。

executor

executorsで設定したものを使う。

steps

実行するコマンド。commandsで設定したものを呼び出すこともできる。

checkout

githubとcircleciが連携していることが前提になるが、対象のリポジトリのブランチからソースをチェックアウトする

aws-s3/sync

awsのs3でデプロイするためのsyncコマンド周りのオプションと実行。
最新の3.1.1で --delete --exact-timestamps をオプション指定するとうまくいかなかったので3.0.0にしている。

詳しくは

fromは同期元のファイルの場所、toは同期先のs3バケットを指定する。

ただし、circle ciのプロジェクトでAWSの各環境変数を設定しておく必要がある。
IAMユーザーを作成して、アクセスキーとシークレットアクセスキーを作成する必要がある。

Web 1920 – 1.png

workflows

jobの実行管理をする。

requires

基本的にjobは並列実行されるが、requiresにjobを指定することで指定したjobが完了してから実行することができる。
今回でいえば、test_frontendでテストが実行されてpassとなった場合のみ、ビルドしたかったので設定。

branches

jobを実行するブランチを指定できる。
ビルドとデプロイに関しては、mainブランチでのみ実行したかったので指定。

一言

CircleCiすごいし、便利っす。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0