Continious Deployment Using Bitbucket and AWS code Deploy

bitbucket-pipieline-ec2-codedeploy

Continuous deployment [CD] can be achieved using following simple steps if you are using bitbucket for code and aws for hosting.

Pre-requisite

  • bit-bucket account http://bitbucket.org/
  • Aws account
  • there is a repository in bitbucket account, bitbucket pipeline is enabled
  • AWS account has
    • one s3 bucket,
    • one IAM user, having aws codedeploy access, and s3 access
    • AWS code deploy group
    • instance added under that group for deployment

bitbucket pipeline YAML

image: atlassian/default-image:2
pipelines:
  custom:
    project-1:
      - step:
          name: Preparing the package
          script:
            - mkdir <projectname>
            - rsync -a -v src/* <projectname>/
            - cd <projectname>
            - zip -r ../<projectname>.zip *
          artifacts:
            - <projectname>.zip

      - step:
          name: Upload to S3 Bucket
          services:
            - docker
          script:
          
            - pipe: atlassian/aws-code-deploy:0.2.10
              variables:
                AWS_ACCESS_KEY_ID: $S3_ACCESS_KEY
                AWS_SECRET_ACCESS_KEY: $S3_SECRET_KEY
                AWS_DEFAULT_REGION: eu-west-1
                COMMAND: 'upload'
                APPLICATION_NAME: <<project1>>
                ZIP_FILE: '<projectname>.zip'
                S3_BUCKET: $S3_BUCKET

      - step:
          name: Deploy Project 
          deployment: project-1
          services:
          - docker
          script:
          - pipe: atlassian/aws-code-deploy:0.2.10
            variables:
              AWS_ACCESS_KEY_ID: $S3_ACCESS_KEY
              AWS_SECRET_ACCESS_KEY: $S3_SECRET_KEY
              AWS_DEFAULT_REGION: eu-west-1
              COMMAND: 'deploy'
              APPLICATION_NAME: <<project1>>
              DEPLOYMENT_GROUP: <aws deployment group name>
              IGNORE_APPLICATION_STOP_FAILURES: 'true'
              FILE_EXISTS_BEHAVIOR: 'OVERWRITE'
              S3_BUCKET: $S3_BUCKET
              WAIT: 'true'
  • save this content, with a filename as bitbucket-pipelines.yml
  • push this file in bitbucket repo under root of the repo
  • there are a few variables and values need modification $ represent variable, and for these, <> or <<>>, you can replace with your own name.
  • a variable can be defined under Repository settings > pipelines > repository variable, with same name.
Variable Name
  • This is manual triggered, however, you can set up the trigger points, means push, merge etc.

What it will do

  • it will zip the code from the path you have given with command
 mkdir <projectname>
            - rsync -a -v src/* <projectname>/
            - cd <projectname>
            - zip -r ../<projectname>.zip *
  • zip will be moved to s3 before deployment, for backup purpose
 pipe: atlassian/aws-code-deploy:0.2.10
              variables:
                AWS_ACCESS_KEY_ID: $S3_ACCESS_KEY
                AWS_SECRET_ACCESS_KEY: $S3_SECRET_KEY
                AWS_DEFAULT_REGION: eu-west-1
                COMMAND: 'upload'
                APPLICATION_NAME: <<project1>>
                ZIP_FILE: '<projectname>.zip'
                S3_BUCKET: $S3_BUCKET
  • Deploy the zip artifact from S3 to ec2 using AWS code deploy. [requires AWS code deploy group name]
  • application name is the name , you define under aws code deploy .
name: Deploy Project 
          deployment: project-1
          services:
          - docker
          script:
          - pipe: atlassian/aws-code-deploy:0.2.10
            variables:
              AWS_ACCESS_KEY_ID: $S3_ACCESS_KEY
              AWS_SECRET_ACCESS_KEY: $S3_SECRET_KEY
              AWS_DEFAULT_REGION: eu-west-1
              COMMAND: 'deploy'
              APPLICATION_NAME: <<project1>>
              DEPLOYMENT_GROUP: <aws deployment group name>
              IGNORE_APPLICATION_STOP_FAILURES: 'true'
              FILE_EXISTS_BEHAVIOR: 'OVERWRITE'
              S3_BUCKET: $S3_BUCKET
              WAIT: 'true'

More about pipeline : https://support.atlassian.com/bitbucket-cloud/docs/configure-bitbucket-pipelinesyml/

AWS code deploy app spec Hooks

version: 0.0
os: linux

files:
  - source: ./
    destination: </var/www/html/project-1/>

hooks:
  BeforeInstall:
    - location: <deployment_scripts/before.sh>
      runas: root

You can define appspec.yml in your code, that can contain hooks, which will be executed during code deploy
hooks : https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

Leave a Reply

Your email address will not be published. Required fields are marked *