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