Gitlab Pipeline With AWS Codedeploy

Gitlab Pipeline With AWS Codedeploy


3 min read

##Flow Chart Alt Text

###1. Create Codedeploy

  • Follow the link to create lambda function which is trigger by S3 notification event and then create code deployment.
  • Gitlab pipeline job will push to S3 so that lambda function will create code deployment for running install script on target instance by codedeploy-agent Alt Text

Alt Text

###2. Gitlab pipeline jobs to build and deploy Alt Text

  • image_version.txt is packed in for codedeploy get version to deploy
  • Codedeploy structure:
    • application: service_name (app, api, myweb, etc.)
    • deployment group: branch_name (feature, develop, hotfix, master, integration, etc.), each one will have same or different target instancce
  • .gitlab-ci.yml ``` build: stage: build script:
    • echo compile and package
    • echo tag image version
    • branch_name=$(echo $CI_COMMIT_REF_NAME | sed 's/\//-/g')
    • version="$branch_name-$CI_PIPELINE_ID"
    • echo login ECR and push image
    • eval $(aws ecr get-login --no-include-email --region ap-northeast-1)
    • docker tag app:latest myimage:${version}
    • docker push myimage:${version} only: refs:
      • feature
      • develop
      • integration
      • hotfix
      • master changes:
      • src/*/ tags:
    • build-runner

deploy: stage: deploy script:

- echo "Deploy app"
- branch_name=$(echo $CI_COMMIT_REF_NAME | sed 's/\//-/g')
- version="$branch_name-$CI_PIPELINE_ID"
- echo $version > codedeploy/image_version.txt
- cd codedeploy
- zip -r appspec.yml image_version.txt scripts
- aws s3 cp s3://codedeploy/automation/${CI_COMMIT_REF_NAME}/app/ --metadata x-amz-meta-application-name=app,x-amz-meta-deploymentgroup-name=${obj}

only: refs:

  - feature
  - develop
  - integration
  - hotfix
  - master
  - src/**/*


- deploy-runner

###**3. Install script**
![Alt Text](
- The script is run on target instance by codedeploy-agent [``](

$ cat codedeploy/scripts/


Script is run on instance

Get app version

dir=$(dirname "$0") version=$(cat ${dir}/../image_version.txt)

Tracking version

OPS_DIR="/ect/ops" export APP_VERSION=${version}

Compose up

docker-compose up -d app

###**4. [`appspec.yml`](**

version: 0.0 os: linux hooks: BeforeInstall:

- location: scripts/
  timeout: 300
  runas: root