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 deploy.zip 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 deploy.zip 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 deploy.zip appspec.yml image_version.txt scripts
- aws s3 cp deploy.zip s3://codedeploy/automation/${CI_COMMIT_REF_NAME}/app/deploy.zip --metadata x-amz-meta-application-name=app,x-amz-meta-deploymentgroup-name=${obj}

only: refs:

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

tags:

- deploy-runner

###**3. Install script**
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/texdrp5op28irl7g35b2.png)
- The script is run on target instance by codedeploy-agent [`install.sh`](https://github.com/vumdao/codedeploy/blob/master/cicd/codedeploy/scripts/install.sh)

$ cat codedeploy/scripts/install.sh

#!/bin/bash

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`](https://github.com/vumdao/codedeploy/blob/master/cicd/codedeploy/appspec.yml)**

version: 0.0 os: linux hooks: BeforeInstall:

- location: scripts/install.sh
  timeout: 300
  runas: root

```

Ref: github.com/vumdao/codedeploy