LoginSignup
2
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-07

参考文献

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デプロイメント

circle.yml
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環境

appspec.yml
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

Scripts/BeforeInstall.sh
#!/bin/bash
export FOLDER=/tmp/CodeDeployExample

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

mkdir -p $FOLDER

AfterInstall.sh

Scripts/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でデプロイを自動化する

circleci/config.yml
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
2
2
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
2