Automate Testing and Deployment with GitHub Actions

Github Actions

GitHub Actions provides a powerful way to automate your software development workflows directly within your GitHub repository. By defining custom workflows, you can automate tasks like running tests, building your application, and deploying it to various environments. This article will guide you through setting up a basic Continuous Integration/Continuous Deployment pipeline using GitHub Actions.


What is GitHub Actions?

GitHub Actions is an event driven automation tool. Workflows are defined by YAML files in the .github/workflows directory of your repository. These workflows specify jobs which, in turn, contain steps that execute commands or use reusable actions (pre defined tasks) on a runner (a server hosting the environment).

A workflow is typically triggered by an event, such as a push to a branch, a pull_request creation, or a scheduled time.


Setting up the Workflow File

To begin, create a directory named .github/workflows in the root of your project. Inside this directory, create a new YAML file, for example, ci cd.yml.

Example Workflow (ci cd.yml)

Here’s a basic structure for a workflow that runs tests and then deploys the code:

name: CI/CD Pipeline

# 1. Define Triggers
on:
  push:
    branches:
      - main  # Trigger on push to the 'main' branch
  pull_request:
    branches:
      - main  # Trigger on pull request targeting 'main'

# 2. Define Jobs
jobs:
  # Job 1: Testing
  test:
    name: Run Tests
    runs-on: ubuntu-latest # Specify the runner environment (OS)
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v4 # Action to clone the repository
        
      - name: Set up Node.js (Example for a Node project)
        uses: actions/setup-node@v4
        with:
          node-version: '20' # Specify the version
          
      - name: Install dependencies
        run: npm install
        
      - name: Run unit tests
        run: npm test # The command to execute your tests

  # Job 2: Deployment (Only runs after the 'test' job completes successfully)
  deploy:
    name: Deploy Application
    needs: test # Ensure the 'test' job must succeed first
    runs-on: ubuntu-latest
    
    # Optional: Set up environment and conditions for deployment
    environment: Production
    if: success() && github.ref == 'refs/heads/main' # Only deploy if tests pass AND it's a push to main
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        
      # Example: A simplified deployment step (Replace with your actual deployment logic)
      - name: Deploy to Server
        run: |
          echo "Deployment started..."
          # Example: Using rsync, a cloud provider CLI, or a custom script
          # rsync -avz --delete ./build/ user@your-server-ip:/var/www/html/
          echo "Deployment to Production complete!"

Breaking Down the Components

1. Triggers (on:)

This section defines when the workflow should execute. In the example, it runs on push and pull_request events targeting the main branch. Other common triggers include workflow_dispatch (manual trigger) and schedule.

2. Jobs (jobs:)

A workflow can have one or more jobs that run in parallel by default.

  • runs on: Specifies the type of runner machine (e.g, ubuntu latest, windows latest, macos latest).
  • needs: Used to establish dependencies. The deploy job uses needs: test to ensure it only starts after the test job finishes successfully.
  • environment: Links the job to a specific GitHub Environment, allowing you to enforce protection rules like manual approvals.
  • if: A conditional statement to control job execution. The deployment only runs if the previous steps were success() and the trigger was specifically a push to main.

3. Steps (steps:)

Steps are the individual tasks executed within a job.

  • uses: Executes a reusable action. actions/checkout@v4 and actions/setup node@v4 are standard, widely used actions.
  • run: Executes command line commands on the runner. This is where you typically place your build, test, and deployment scripts (npm test, npm run build, custom shell scripts, etc.).
  • name: Provides a readable name for the step in the GitHub UI.

Key Benefits

  • Consistency Every change goes through the same automated process, reducing human error.
  • Speed Automation significantly reduces the time required between code commit and production deployment.
  • Early Feedback Tests run immediately upon code changes, catching bugs quickly.
  • Integration Deeply integrated with the GitHub ecosystem, including Pull Requests and Environments.

GitHub Actions is an indispensable tool for modern development teams, allowing for sophisticated and flexible CI/CD pipelines right alongside your code. By defining simple YAML files, you can automate critical processes, ensure code quality, and accelerate your time to market. Start by automating your testing, and gradually build towards a fully automated deployment strategy.


Get The Blockchain Sector Newsletter, binge the YouTube channel and connect with me on Twitter

The Blockchain Sector newsletter goes out a few times a month when there is breaking news or interesting developments to discuss. All the content I produce is free, if you’d like to help please share this content on social media.

Thank you.

James Bachini

Disclaimer: Not a financial advisor, not financial advice. The content I create is to document my journey and for educational and entertainment purposes only. It is not under any circumstances investment advice. I am not an investment or trading professional and am learning myself while still making plenty of mistakes along the way. Any code published is experimental and not production ready to be used for financial transactions. Do your own research and do not play with funds you do not want to lose.


Posted

in

, ,

by