ようへいの日々精進XP

よかろうもん

俺の .circleci/config.yml を晒す 〜 S3 バケットに静的コンテンツをアップロードする 〜

tl;dr

俺の .circleci/config.yml を晒すシリーズ第一弾. もしかしたら, 第二弾は無いかもしれませんがご容赦ください. そして, この記事は YAMAP エンジニア Advent Calendar 2019 の三日目の記事になる予定です.

qiita.com

実現したいこと

  • ソースコードGithubリポジトリに存在している
  • 成果物は S3 バケットにアップロード(S3 バケットは CloudFront 経由でコンテンツを配信することを想定)
  • development ブランチに push した場合には, 開発環境の S3 バケット (your-development-bucket-name) にアップロードされるようにします
  • production ブランチに push した場合には, プロダクション環境の S3 バケット (your-production-bucket-name) にアップロードされるようにします
  • 成果物ディレクトリ以下の一部のディレクトリはアップロード不要なので除外されるようにします

俺の .circleci/config.yml

以下のように書きました. orbs を使って成果物をアップロードするプロセスはガチャガチャコードを書く必要がなくなっています. また, persist_to_workspace を使って build ジョブから deploy ジョブに成果物を共有しています.

version: 2.1

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

executors:
  default:
    docker:
      - image: circleci/node:12.12
      - image: circleci/python:2.7

jobs:
  build:
    executor: default
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "path/to/package.json" }}
            - v1-dependencies-
      - run:
          name: Install dependencies
          command: |
            # Install dependencies commands
            echo "export PATH=$PATH:$(pwd)/path/to/node_modules/.bin" >> $BASH_ENV
      - save_cache:
          paths:
            - build/node_modules
          key: v1-dependencies-{{ checksum "path/to/package.json" }}
      - run:
          name: Build 
          command: |
            # Build 
      - persist_to_workspace:
          root: /home/circleci/repo
          paths:
            - your/path/*
  deploy:
    executor: default
    steps:
      - attach_workspace:
          at: /home/circleci/repo
      - checkout
      - run:
          name: list files
          command: |
            ls -l /home/circleci/repo/
yo
      - run: 
          name: select bucket
          command: |
            if [ "${CIRCLE_BRANCH}" == "production" ]; then
                echo 'export S3_BUCKET=your-production-bucket-name' >> $BASH_ENV
            else
                echo 'export S3_BUCKET=your-development-bucket-name' >> $BASH_ENV
            fi
      - aws-s3/sync:
          from: /home/circleci/repo/your/path
          to: s3://${S3_BUCKET}
          overwrite: true
          arguments: >
            --delete
            --exclude /home/circleci/repo/your/path/ignore1
            --exclude /home/circleci/repo/your/path/ignore2

workflows:
  version: 2
  build-and-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only:
                - master
                - production
                - development

orbs を使うといちいち aws cli を駆使することなく YAML の設定だけで (アクセスキーとシークレットアクセスキーを環境変数に設定しておく必要がありますが) S3 バケットにファイルアップロードすることが可能となります. 出来るだけ orbs を使うようにしたいですよね.

こんな感じで

俺のしょぼい .circleci/config.yml を出来る範囲で晒していこうと思います.