😸

【CI/CD】 Git Codedeploy 連携まとめ

2021/01/17に公開

参考文献

code-deploy-agentのインストール

$ sudo yum update
$ sudo yum install ruby
$ sudo yum install wget
$ cd /home/ec2-user
$ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
$ sudo service codedeploy-agent start

circle.ymlの記述

下記参照▼

CodeDeployとCircleCIを利用したBlue/Greenデプロイメント

deployment:
  blue:
    branch: release/blue
    codedeploy:
      bg-deploy-app:         #CodeDeploy作成時のアプリケーション名
        application_root: /app  #appspec.ymlのパス
        revision_location:
          revision_type: S3   #リビジョンの保管場所(S3)
          s3_location:
            bucket: bg-deploy-app
            key_pattern: apps/{SHORT_COMMIT}  #S3バケットのキー名指定
        region: ap-northeast-1
        deployment_group: Blue             #デプロイメントグループ名
        deployment_config: CodeDeployDefault.AllAtOnce
  green:
    branch: release/green
    codedeploy:
      bg-deploy-app:
        application_root: /app
        revision_location:
          revision_type: S3
          s3_location:
            bucket: bg-deploy-app
            key_pattern: apps/{SHORT_COMMIT}
        region: ap-northeast-1
        deployment_group: Green
        deployment_config: CodeDeployDefault.AllAtOnce

appspec.ymlの記述

下記参照▼

CircleCIとAWS(CodeDeploy/S3)で作るCI環境

version: 0.0
os: linux # このあたりはお約束なのでそのまま記述すること

files:
# You can specify one or more mappings in the files section.
  - source: /
    destination: /home/ec2-user # 他が良ければ事前にユーザ名、ディレクトリは作成すること
hooks:
  BeforeInstall:
    - location: Scripts/BeforeInstall.sh      #下記デプロイ用シェル参照
  AfterInstall:
    - location: Scripts/AfterInstall.sh      #下記デプロイ用シェル参照
      timeout: 60
  ApplicationStart:
    - location: Scripts/ApplicationStart.sh   #下記デプロイ用シェル参照
      timeout: 60
  ValidateService:
    - location: Scripts/ValidateService.sh    #下記デプロイ用シェル参照
      timeout: 60

デプロイ用シェルの作成

下記参照▼

ステップ 2: サンプルのアプリケーションリビジョンを作成する

BeforeInstall.sh

#!/bin/bash
export FOLDER=/tmp/CodeDeployExample

if [ -d $FOLDER ]
then
 rm -rf $FOLDER
fi

mkdir -p $FOLDER

AfterInstall.sh

#!/bin/bash
cd /tmp/CodeDeployExample

echo "The AfterInstall deployment lifecycle event successfully completed." > after-install.txt

ApplicationStart.sh

#!/bin/bash
cd /tmp/CodeDeployExample

echo "The ApplicationStart deployment lifecycle event successfully completed." > application-start.txt

ValidateService.sh

#!/bin/bash
cd /tmp/CodeDeployExample

echo "The ValidateService deployment lifecycle event successfully completed." > validate-service.txt

unset FOLDER

実行権限付与

$ chmod +x ./Scripts/*

CircleCI CodeDeployの連携

下記参照▼

CircleCI 2.0とcodedeployでデプロイを自動化する

version: 2
jobs:
  build: #単体テストを実行するジョブ
    working_directory: ~/my-app
    docker:
      - image: ruby:2.4.0
    steps:
      - checkout
      - run: bundle install --path vendor/bundle
      - run:
          name: Run Test
          command: bundle exec rspec
  deploy: #デプロイするジョブ
    working_directory: ~/my-app
    docker:
    - image: ruby:2.4.0
    steps:
      - checkout
      - run: bundle install --path vendor/bundle
      - run: bundle exec rake deploy
workflows:
  version: 2
  build-deploy:
    jobs:
      - build
      - deploy: # deployはbuildのあとに実行
          requires:
            - build
          filters: # developブランチの場合のみデプロイする
            branches:
              only: develop
Rakefile
# frozen_string_literal: true

require 'aws-sdk-codedeploy'
require 'aws-sdk-s3'

# Configs for codedeploy
APP_NAME = 'app_name'
S3_BUCKET = 'mybucket'
S3_PREFIX = 'app/versions/'
TAG = `git describe --tags`.strip
DEPLOY_GROUP_NAME = 'deploy_group_name'

desc "Deploy with codedeploy"
task :deploy do
  # upload files to s3
  zip_file = "#{APP_NAME}_#{TAG}.zip"
  s3_key = S3_PREFIX + '/' + zip_file
  `git archive HEAD --output=#{zip_file}`
  begin
    Aws::S3::Client.new.put_object(bucket: S3_BUCKET, key: s3_key, body: File.open(File.basename(zip_file)))
  ensure
    File.delete(zip_file)
  end
  # register revision
  revision = {
    revision_type: 'S3',
    s3_location: {
      bucket: S3_BUCKET,
      key: s3_key,
      bundle_type: 'zip',
    },
  }
  codedeploy = Aws::CodeDeploy::Client.new
  codedeploy.register_application_revision(application_name: APP_NAME, revision: revision)
  # deploy
  codedeploy.create_deployment(application_name: APP_NAME,
                               deployment_group_name: DEPLOY_GROUP_NAME,
                               revision: revision,
                               file_exists_behavior: 'OVERWRITE')
end

Discussion