Project Overview

Create an automated deployment pipeline that builds, tests, and deploys your application whenever you push code. Essential for modern DevOps practices.

Difficulty:
Intermediate
AWS Services:
CodePipeline, CodeBuild, CodeDeploy, ECR
Cost:
~$5-15/month for light usage

Prerequisites

  • GitHub or CodeCommit repository with application code
  • EC2 instances or ECS cluster for deployment
  • Basic understanding of build processes
  • Familiarity with YAML configuration

Architecture

💻
GitHub
Source
→
⚙
CodePipeline
Orchestration
→
🔧
CodeBuild
Build & Test
→
🚀
CodeDeploy
Deploy
→
🖥
EC2/ECS
Target

ECR stores container images, S3 stores build artifacts

Advertisement

Step-by-Step Instructions

Prepare Your Repository

  • Store your code in GitHub or AWS CodeCommit
  • Create a buildspec.yml file in the root directory
  • Define build phases: install, pre_build, build, post_build
  • Specify artifacts to pass to deployment stage

Create CodeBuild Project

  • Go to CodeBuild and create a new project
  • Connect to your source repository
  • Select a managed image (e.g., Amazon Linux 2023, Node.js)
  • Configure environment variables for sensitive values
  • Enable build caching to speed up subsequent builds

Create AppSpec File for CodeDeploy

  • Create appspec.yml in your repository root
  • Define file mappings (source to destination)
  • Add lifecycle hooks: BeforeInstall, AfterInstall, ApplicationStart
  • Create deployment scripts in a scripts/ folder

Set Up CodeDeploy

  • Install CodeDeploy agent on target EC2 instances
  • Create a CodeDeploy application
  • Create a deployment group targeting your instances
  • Choose deployment type (in-place or blue/green)
  • Configure rollback settings

Create CodePipeline

  • Create a new pipeline in CodePipeline
  • Add Source stage (GitHub or CodeCommit)
  • Add Build stage (CodeBuild project)
  • Add Deploy stage (CodeDeploy application)
  • Optionally add manual approval before production

Test the Pipeline

  • Push a code change to trigger the pipeline
  • Monitor each stage in the CodePipeline console
  • Review build logs in CodeBuild
  • Verify deployment succeeded on target instances
  • Test rollback by intentionally failing a deployment

Tips

  • Use Parameter Store for secrets - Store database passwords, API keys securely and reference in buildspec
  • Enable build caching - Cache dependencies to significantly speed up builds
  • Add notifications - Use SNS to get notified on pipeline failures
  • Use blue/green deployments - Safer deployments with instant rollback capability
Advertisement

Code Examples

CodeBuild buildspec.yml

buildspec.yml YAML
version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 22
    commands:
      - npm install
  pre_build:
    commands:
      - echo "Running tests..."
      - npm test
  build:
    commands:
      - echo "Building application..."
      - npm run build
  post_build:
    commands:
      - echo "Build completed on $(date)"

artifacts:
  files:
    - '**/*'
  base-directory: dist

cache:
  paths:
    - node_modules/**/*

CodeDeploy appspec.yml

appspec.yml YAML
version: 0.0
os: linux

files:
  - source: /
    destination: /var/www/myapp

permissions:
  - object: /var/www/myapp
    owner: www-data
    group: www-data

hooks:
  BeforeInstall:
    - location: scripts/before_install.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/after_install.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
      timeout: 300
      runas: root
  ValidateService:
    - location: scripts/validate.sh
      timeout: 300

Deployment Scripts

scripts/after_install.sh BASH
#!/bin/bash
set -e

# Navigate to app directory
cd /var/www/myapp

# Install dependencies
npm install --production

# Set correct permissions
chown -R www-data:www-data /var/www/myapp

echo "After install completed"

Pipeline Creation (AWS CLI)

Terminal Commands BASH
# Create CodeBuild project
aws codebuild create-project \
    --name my-build-project \
    --source type=GITHUB,location=https://github.com/user/repo \
    --artifacts type=S3,location=my-artifact-bucket \
    --environment type=LINUX_CONTAINER,image=aws/codebuild/amazonlinux-x86_64-standard:5.0,computeType=BUILD_GENERAL1_SMALL \
    --service-role arn:aws:iam::123456789:role/CodeBuildRole

# Create CodeDeploy application
aws deploy create-application \
    --application-name my-app \
    --compute-platform Server

# Create deployment group
aws deploy create-deployment-group \
    --application-name my-app \
    --deployment-group-name production \
    --deployment-config-name CodeDeployDefault.OneAtATime \
    --ec2-tag-filters Key=Environment,Value=Production,Type=KEY_AND_VALUE \
    --service-role-arn arn:aws:iam::123456789:role/CodeDeployRole

What You'll Learn

  • Source control integration with AWS services
  • Build automation with CodeBuild and buildspec.yml
  • Deployment strategies (rolling, blue/green)
  • Container image management with ECR
  • Pipeline orchestration and stage management
Advertisement