CI/CD Pipeline: From Commit to Production in 5 Minutes — A Complete Guide to Automation with GitHub Actions and GitLab CI

Introduction

Imagine: you make a commit, drink coffee, and 5 minutes later your update is already running in production. No manual deployment, no SSH scripts, no late-night calls from the team. This isn't magic — it's a CI/CD pipeline. In 2026, automation has become the de facto standard for any team that wants to release updates quickly and without bugs. In this article, I'll explain how to build a complete cycle from commit to production using GitHub Actions and GitLab CI, which stages are mandatory, and how to avoid common mistakes. Let's go!

What is a CI/CD Pipeline and Why Do You Need It?

CI/CD (Continuous Integration / Continuous Delivery) is a development automation methodology that includes three key stages:

  • Continuous Integration (CI) — every commit is automatically tested and built.
  • Continuous Delivery (CD) — after a successful build, the artifact is ready for deployment to staging or production.
  • Continuous Deployment (CD) — final deployment to production without manual approval.

The main goal of a pipeline is to speed up the release cycle and reduce the risk of human errors. Instead of manually running tests and copying files to a server, you set up the process once, and it works automatically.

Key Components of a CI/CD Pipeline

Any pipeline consists of sequential stages. Here's a minimal set:

Stage Description Tools
Trigger Launch on commit, PR, or schedule GitHub Events, GitLab Webhooks
Linting and Formatting Check code style and syntax ESLint, Prettier, Black
Unit Tests Test individual modules Jest, pytest, JUnit
Build Compile or package the application Docker, Webpack, Maven
Integration Tests Test component interactions Cypress, Selenium, Postman
Deploy to Staging Deploy to a test environment Kubernetes, Ansible
Deploy to Production Final release ArgoCD, Helm, rsync

GitHub Actions: How to Set Up a Pipeline in 10 Minutes

GitHub Actions is a built-in CI/CD tool in GitHub. It works via YAML files in the .github/workflows folder. Here's an example of a simple pipeline for a Node.js application:

name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build Docker image
        run: docker build -t myapp:${{ github.sha }} .
      - name: Push to registry
        run: docker push myregistry/myapp:${{ github.sha }}

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to production
        run: |
          curl -X POST https://api.myapp.com/deploy \
            -H "Authorization: Bearer ${{ secrets.DEPLOY_TOKEN }}"

Tip: Use GitHub Actions Cache to speed up dependency installation. For example, caching node_modules can reduce build time by 40-60%.

GitLab CI: An Alternative with a Powerful Runner

GitLab CI uses a .gitlab-ci.yml file in the root of the repository. Its main advantage is a built-in Docker runner and support for multi-stage pipelines. Example for a Python application:

```yaml
stages:
- test
- build
- deploy

variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

lint:
stage: test
image: python:3.11
script:
- pip install flake8
- flake8 .

test:
stage: test
image: python:3.11
script:
- pip install -r requirements.txt
- pytest

build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE

deploy:
stage: deploy
image: alpine:latest
script:
- apk add --no-cache curl
- curl -X POST "https

← All posts

Comments