Skip to main content

On This Page

Standardizing DevOps: Implementing Shared Reusable GitHub Workflows

2 min read
Share

These articles are AI-generated summaries. Please check the original sources for full details.

Shared Workflows: minha experiência definindo pipelines reutilizáveis

Marcos Vilela developed a standardized shared workflow model for Node.js backends and AWS infrastructure to solve pipeline fragmentation. The system utilizes GitHub Actions’ workflow_call to centralize linting, testing, and deployment logic across multiple organizational repositories.

Why This Matters

Decentralized CI/CD management often results in security inconsistencies and significant maintenance overhead as each team independently defines their own pipeline logic. Transitioning to a shared, versioned model allows for centralized security enforcement and rollback capabilities, though it requires high-quality documentation and precise parametrization to accommodate diverse project structures like monorepos without causing breaking changes.

Key Insights

  • Reusable workflows leverage the ‘on: workflow_call’ trigger to allow consumers to point to specific version tags such as @v1 for stable deployments.
  • The principle of least privilege is applied by restricting jobs to ‘contents: read’ for standard CI, elevating permissions only for release tasks.
  • Static validation tools including actionlint, shellcheck, and checkov are integrated to catch security flaws and syntax errors before merging shared code.
  • Parametrization via inputs like ‘working_directory’ and ‘app_path’ enables a single workflow to support varied repository structures and monorepos.

Working Examples

Standard consumption of a shared CI workflow in a project repository.

jobs:
  ci:
    uses: ./.github/workflows/shared-backend-ci.yml
    with:
      working_directory: app
      node_version: '20'
      enable_security_scan: true
    secrets:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Deployment wrapper that triggers a release workflow only after a successful staging deployment.

jobs:
  deploy:
    uses: ./.github/workflows/shared-backend-deploy-ecs.yml
    with:
      environment: staging
      tf_backend_bucket: my-staging-state
      tf_var_file: envs/staging/variables.tfvars
    secrets:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  promote:
    needs: deploy
    if: ${{ needs.deploy.result == 'success' }}
    uses: ./.github/workflows/shared-release.yml
    secrets:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Practical Applications

  • Use case: Standardizing Node.js CI with ‘yarn audit’ and automated caching across all backend teams to ensure security compliance. Pitfall: Hardcoding file paths in shared scripts, which causes failures in monorepo projects requiring custom working directories.
  • Use case: Automated blue/green ECS deployments using a shared-backend-deploy-ecs workflow to reduce manual infrastructure errors. Pitfall: Granting broad repository-level permissions instead of job-specific scopes, increasing the security impact of a compromised action.

References:

Continue reading

Next article

Bootstrapping a Bare-Metal Kubernetes Homelab with Ansible and Debian

Related Content