Skip to content

ditkrg/build-image-workflow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

78 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Build Image Workflow

This GitHub Action automates the process of building and pushing a Docker image to a self-hosted registry. The workflow includes setting up Docker Buildx, extracting metadata, logging in to the registry, and building and pushing the Docker image.

Inputs

image (required)

  • Description: Image Name
  • Required: true

build-args (optional)

  • Description: Build Arguments
  • Required: false

file (optional)

  • Description: Dockerfile Path
  • Required: false

registry (required)

  • Description: Registry URL
  • Required: true
  • Default: reg.dev.krd

username (required)

  • Description: Username for the registry
  • Required: true

password (required)

  • Description: Password for the registry
  • Required: true

build-secrets (optional)

  • Description: Build Secrets
  • Required: false

Outputs

tag

  • Description: Image Tag
  • Value: ${{ steps.meta.outputs.tags[0] }}

tags

  • Description: Image Tags
  • Value: ${{ steps.meta.outputs.tags }}

Workflow Steps

  1. Set up Docker Buildx:

    • Uses: docker/setup-buildx-action@v3
  2. Extract Metadata:

    • Uses: docker/metadata-action@v5
    • Inputs:
      • images: ${{ inputs.registry }}/${{ inputs.image }}
      • flavor: latest=false
      • tags:
        • Cache: type=raw,value=${{ github.ref_name }}-cache
        • Branches: type=ref,event=branch, type=ref,event=branch,suffix=-{{sha}},priority=8888
        • Releases: type=semver,pattern={{major}}, type=semver,pattern={{major}}.{{minor}}, type=semver,pattern={{version}},priority=9999
  3. Login to Registry:

    • Uses: docker/login-action@v3
    • Inputs:
      • registry: ${{ inputs.registry }}
      • username: ${{ inputs.username }}
      • password: ${{ inputs.password }}
  4. Build Docker images:

    • Uses: docker/build-push-action@v5
    • Inputs:
      • push: true
      • file: ${{ inputs.file }}
      • tags: ${{ steps.meta.outputs.tags }}
      • cache-to: type=inline
      • cache-from: type=registry,ref=${{ inputs.registry }}/${{ inputs.image }}:${{ github.ref_name }}-cache
      • build-args: ${{ inputs.build-args }}
      • secrets: ${{ inputs.build-secrets }}

Example Usage

name: Build Image Workflow
on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Build and Push Image
        uses: ditkrg/build-image-workflow@v1
        with:
          image: "my-docker-image"
          registry: "my-registry.example.com"
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}
          build-args: "EXAMPLE=123"
          build-secrets: "EXAMPLE=****"
          file: "path/to/Dockerfile"

If you want to use it with our GitOps Action:

name: Deploy

on:
  push:
    branches:
      - dev
      - main
    tags:
      - v[0-9]+.[0-9]+.[0-9]+

    paths-ignore:
      - "**.md"
      - ".vscode/**"

      - ".github/**"
      - "!.github/workflows/tests-base.yaml"
      - "!.github/workflows/deploy.yaml"

jobs:
  build:
    runs-on: ubuntu-latest
    concurrency: build-${{ github.ref_name }}
    outputs:
      tag: ${{ steps.build-image.outputs.tag }}
      tags: ${{ steps.build-image.outputs.tags }}
    steps:
      - id: build-image
        name: Build and Push Image
        uses: ditkrg/build-image-workflow@v1
        with:
          image: "my-docker-image"
          registry: "my-registry.example.com"
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}
          build-args: "EXAMPLE=123"
          build-secrets: "EXAMPLE=****"
          file: "path/to/Dockerfile"

  update-gitops:
    runs-on: ubuntu-latest
    concurrency: pr-${{ github.ref_name }}
    needs: build
    steps:
      - name: Update gitops
        uses: ditkrg/update-gitops-image@v1
        with:
          owner: ditkrg
          repo: GITOPS_REPO
          app-id: ${{ secrets.APP_ID }}
          image-tag: ${{ needs.build.outputs.tag }}
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
          component-name: REPO_NAME