visit
From my use case, is the clear winner. As I am not a DevOps specialist, setting up CI/CD pipelines visually really appealed to me and I find that it was extremely easy to configure. Buddy also had the quickest Run Time but I suspect that people will soon make suggestions on how I can improve my existing pipelines. Buddy is, however, not as well known as the other services and you should therefore examine their offering carefully before using their service over their competitors.
In second place I would recommend AWS CodePipeline as it was surprisingly easy to configure which has not always been my experience with AWS. CodePipeline is deeply integrated with other AWS services which made it immensely powerful. If you are already using AWS heavily, I would thoroughly recommend this service.I personally found that Gitlab was the hardest to use out of all services as it wasn’t as well documented. Travis and CircleCI were very well documented and, if I wasn’t using AWS or couldn’t use a smaller company like Buddy I would definitely consider these services.Please comment if you have any suggestions — I would love to regularly update this series of articles with further optimisations. If you disagree with my findings, please let me know. Finally, please try replicate these results yourself and share your experiences using these tools in your own company.Click Users
Click Add user:
Name your user whatever you wish. In this example, I named mine CIComparisonBlogUser and gave them Programmatic access before clicking Next.
We then need to add a policy for this user. Click Attach existing policies directly and search for AWSElasticBeanstalkFullAccess, attach the policy and click Next.
Review your user and save the Access key ID and Secret access key in a secure location. These credentials will be used when setting up each CI service.
Click Get started:
Name your application (I named mine CI Comparison Blog), select Docker as the platform and choose Sample application which we will use for now. Click Create application and go make some coffee as it will take some time to spin up:
Click the provided URL to view the sample application:
Click Repositories and click Create Repository:
Name your repository whatever you wish (I named mine ci-comparison-blog) and click Create
You should see your created repository. The key part to remember is your equivalent of andrewbestbier/ci-comparison-blog:
To setup a CircleCI pipeline, head over to and click Log in with Github (You will need to Authorise CircleCI through Github).
Next click Settings and Projects and find your Github repository (mine is called ci-comparison-blog) before clicking the settings cog on the right:
Click Environment variables and add your AWS and Docker Hub credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, DOCKER_USER and DOCKER_PASS). These will be used later on:
Next click Add Projects on the sidebar, search for your Github repository and click Set Up Project:
version: 2
jobs:
test:
working_directory: ~/app
docker:
- image: circleci/node:latest # (1)
steps:
- checkout
- run:
name: Update npm
command: 'sudo npm install -g npm@latest'
- restore_cache: # (2)
key: dependency-cache-{{ checksum "package-lock.json" }}
- run:
name: Install npm dependencies
command: npm install
- save_cache:
key: dependency-cache-{{ checksum "package-lock.json" }}
paths:
- ./node_modules
- run:
name: Run tests # (3)
command: 'npm run test'
docker-deploy-image:
working_directory: ~/app
machine:
docker_layer_caching: true # (4)
steps:
- checkout
- run: | # (5)
docker build -t andrewbestbier/ci-comparison-blog .
docker login -u $DOCKER_USER -p $DOCKER_PASS
docker push andrewbestbier/ci-comparison-blog
deploy-aws:
working_directory: ~/app
docker:
- image: circleci/python:latest
steps:
- checkout
- run: # (6)
name: Installing deployment dependencies
working_directory: /
command: 'sudo pip install awsebcli --upgrade'
- run: # (7)
name: Deploying application to Elastic Beanstalk
command: eb deploy
workflows:
version: 2
build-test-and-deploy:
jobs:
- test
- docker-deploy-image:
requires:
- test
- deploy-aws:
requires:
- docker-deploy-image
branch-defaults:
master:
environment: CiComparisonBlog-env
environment-defaults:
CiComparisonBlog-env:
branch: null
repository: null
global:
application_name: CI Comparison Blog
default_ec2_keyname: null
default_platform: arn:aws:elasticbeanstalk:eu-west-2::platform/Docker running on
64bit Amazon Linux/2.12.17
default_region: eu-west-2
include_git_submodules: true
instance_profile: null
platform_name: null
platform_version: null
profile: null
sc: git
workspace_type: Application
We are finally ready to go so click Start Building in the CircleCI dashboard and, with a little luck, your project should test, build and deploy successfully:
If this is your first time using Gitlab, you will see the following screen. Click Create a project:
Next click the CI/CD for external repo tab and connect to Github.
You will be prompted for a personal access token from Github with repo access. To do so follow this short guide:
The next step is to add the environment variables. Click Settings on the side bar and then click CI/CD on the popup.
Scroll down and add your AWS and Docker Hub credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, DOCKER_USER and DOCKER_PASS).
image: node:latest # (1)
stages:
- build
- test
- docker-deploy-image
- aws-deploy
cache:
paths:
- node_modules/ # (2)
install_dependencies:
stage: build
script:
- npm install # (3)
artifacts:
paths:
- node_modules/
testing:
stage: test
script: npm test # (4)
docker-deploy-image:
stage: docker-deploy-image
image: docker:dind
services:
- docker:dind
script:
- echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin # (5)
- docker build -t andrewbestbier/ci-comparison-blog .
- docker push andrewbestbier/ci-comparison-blog
aws-deploy:
image: 'python:latest'
stage: aws-deploy
before_script:
- 'pip install awsebcli --upgrade' # (6)
script:
- eb deploy CiComparisonBlog-env
First, head over to and Sign in with Github:
You should then see a dashboard showing your connected projects. I have blocked out other personal projects I have. Click the small + button to add a new project:
Next, search for your Github repository and click the Settings button:
Scroll down and, like the other services, add your AWS and Docker Hub credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, DOCKER_USER and DOCKER_PASS).
language: node_js # (1)
node_js:
- 'node'
services:
- docker # (2)
jobs:
include:
- stage: test
script:
- npm install # (3)
- npm test # (4)
- stage: docker-deploy-image # (5)
script:
- echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin
- docker build -t andrewbestbier/ci-comparison-blog .
- docker push andrewbestbier/ci-comparison-blog
- stage: deploy
script: skip
deploy: # (6)
provider: elasticbeanstalk
access_key_id: $AWS_ACCESS_KEY_ID
secret_access_key: $AWS_SECRET_ACCESS_KEY
region: 'eu-west-2'
app: 'CI Comparison Blog'
env: 'CiComparisonBlog-env'
bucket_name: 'elasticbeanstalk-eu-west-2-094505317841'
bucket_path: 'CI Comparison Blog'
Head over to Buddy and sign in with Github. Then click Create new project:
should intelligently work out that our project is an Express application. Click Add a new pipeline:
Specify a pipeline name (I picked CI Blog Post), select trigger On push and click Add a new pipeline.
We can then create a first action to install our dependencies and run the tests. Search for the Node.js action and click it.
You are then prompted for some bash commands to run. In our case we wish to run yarn install and yarn test . Then click Add this action:
Next we want to build a Docker image from our source code. Search for the Build Image action:
Buddy automatically detects your Dockerfile so just click Add this action:
Next we want to push the image we just build up to Docker Hub. Search for the Push Image action:
automatically uses the image built in the previous action. Provide your Docker Hub username, password, repository and tags before clicking Add this action:
Finally, we want to deploy our files to Elastic Beanstalk so search for this action:
A modal will appear requesting your AWS user Access Key and Secret Access Key:
Select the AWS Region and your application should automatically appear. Then click Add this action:
Click Run pipeline and it should test, build and deploy your application successfully:
- pipeline: "CI Blog Post"
trigger_mode: "ON_EVERY_PUSH"
ref_name: "master"
ref_type: "BRANCH"
trigger_condition: "ALWAYS"
actions:
- action: "Execute: yarn test"
type: "BUILD"
working_directory: "/buddy/ci-comparison-blog"
docker_image_name: "library/node"
docker_image_tag: "10"
execute_commands:
- "yarn install"
- "yarn test"
setup_commands:
- "npm install -g gulp grunt-cli"
mount_filesystem_path: "/buddy/ci-comparison-blog"
shell: "BASH"
trigger_condition: "ALWAYS"
- action: "Build Docker image"
type: "DOCKERFILE"
dockerfile_path: "Dockerfile"
trigger_condition: "ALWAYS"
- action: "Push Docker image"
type: "DOCKER_PUSH"
login: "andrewbestbier"
password: "secure!KmF0va9L3z4s450LWVlvNdHi1+6Z6+45vQbkHS4bWFo="
docker_image_tag: "latest"
repository: "andrewbestbier/ci-comparison-blog"
trigger_condition: "ALWAYS"
- action: "Upload files to Elastic Beanstalk/CI Comparison Blog"
type: "ELASTIC_BEANSTALK"
application_name: "CI Comparison Blog"
environment: "e-zpfbesiqpa"
environment_name: "CiComparisonBlog-env"
region: "eu-west-2"
trigger_condition: "ALWAYS"
integration_id: 65587
Login to AWS and navigate to the CodePipeline service. Next click Create pipeline:
Next name your pipeline (I named mine CI-comparison) before clicking Next:
Next you will need to add a pipeline source. Select Github, follow the login prompts, connect your repository, select the master branch and click Next:
We then need to add a build stage. Select AWS CodeBuild as a build provider and click Create project. This will open a new tab where you configure the build.
Name your build (I named mine CI-comparison) and scroll down the page.
Next add the DOCKER_USER and DOCKER_PASS environment variables
Select use buildspec file as we will be using a buildspec.yml file in our repositories root directory to specify the build steps. Finally click Continue to CodePipeline.
The tab will close and you will be taken back to your CodePipeline configuration. Click Next:
Finally, we need to add a deploy stage. Select AWS Elastic Beanstalk as the deploy provider and find your application before clicking Next:
Review your pipeline and click Create pipeline:
Now view the buildspec.yml file in the root of our directory:
version: 0.2
phases:
install:
runtime-versions:
nodejs: 10 # (1)
commands:
- echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin # (2)
pre_build:
commands:
- npm install # (3)
- npm test # (4)
build:
commands:
- docker build -t andrewbestbier/ci-comparison-blog . # (5)
post_build:
commands:
- docker push andrewbestbier/ci-comparison-blog
Finally, click Release change and it should test, build and deploy your application successfully
(Image Source: )