Skip to content

Building Fluent Bit image #112

Building Fluent Bit image

Building Fluent Bit image #112

name: Building Fluent Bit image
on:
workflow_dispatch:
inputs:
docker_tag_version:
description: 'Fluent Bit image release version'
required: true
default: '3.1.2'
env:
DOCKER_REPO: 'kubesphere'
DOCKER_IMAGE: 'fluent-bit'
GITHUB_IMAGE: '${{ github.repository }}/fluent-bit'
permissions:
contents: read
packages: write
jobs:
determine-tags:
runs-on: ubuntu-latest
name: Determine image tags
outputs:
IMAGE_BASE_TAG: ${{ steps.determine-tags.outputs.IMAGE_BASE_TAG }}
IMAGE_MAJOR_MINOR: ${{ steps.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
steps:
- name: Determine image version tag
id: determine-tags
run: |
VERSION=${{ github.event.inputs.docker_tag_version }}
VERSION_WITHOUT_V=${VERSION#v}
MAJOR_MINOR=$(echo $VERSION_WITHOUT_V | cut -d. -f1-2)
if skopeo inspect docker://ghcr.io/${{ env.GITHUB_IMAGE }}:${VERSION}; then
echo "${VERSION} tag already exists, assuming we're building a patch release!"
LATEST_PATCH_VERSION=$(skopeo list-tags docker://ghcr.io/${{ env.GITHUB_IMAGE }} | grep -E "${VERSION}-[0-9]+" | sort | uniq | tail -1 | tr -d \" | cut -d'-' -f2)
NEW_PATCH_VERSION=$((LATEST_PATCH_VERSION + 1))
IMAGE_BASE_TAG="${VERSION}-${NEW_PATCH_VERSION}"
echo "Building patch release ${IMAGE_BASE_TAG}!"
else
echo "${VERSION} tag does not exist, assuming we're building a new release!"
IMAGE_BASE_TAG="${VERSION}"
fi
echo "IMAGE_BASE_TAG=$IMAGE_BASE_TAG" >> $GITHUB_OUTPUT
echo "IMAGE_MAJOR_MINOR=$MAJOR_MINOR" >> $GITHUB_OUTPUT
build-prod-image-metadata:
needs:
- determine-tags
runs-on: ubuntu-latest
name: Build prod image metadata
outputs:
IMG_NAME: ${{ steps.set-outputs.outputs.IMAGE_NAME }}
DOCKER_IMG_NAME: ${{ steps.set-outputs.outputs.DOCKER_IMG_NAME }}
version: ${{ steps.image-metadata.outputs.version }}
tags: ${{ steps.image-metadata.outputs.tags }}
release_tags: ${{ steps.image-tags.outputs.tags }}
labels: ${{ steps.image-metadata.outputs.labels }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: docker metadata for building
id: image-metadata
uses: docker/metadata-action@v5
with:
images: "ghcr.io/${{ env.GITHUB_IMAGE }}"
tags: |
raw,latest
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
- name: docker tags for cloning
id: image-tags
uses: docker/metadata-action@v5
with:
tags: |
raw,latest
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
- name: Set outputs
id: set-outputs
run: |
echo "IMAGE_NAME=${{ env.GITHUB_IMAGE }}" >> $GITHUB_OUTPUT
echo "DOCKER_IMG_NAME=${{env.DOCKER_REPO}}/${{ env.DOCKER_IMAGE }}" >> $GITHUB_OUTPUT
build-debug-image-metadata:
needs:
- determine-tags
runs-on: ubuntu-latest
name: Build debug image metadata
outputs:
IMG_NAME: ${{ steps.set-outputs.outputs.IMAGE_NAME }}
DOCKER_IMG_NAME: ${{ steps.set-outputs.outputs.DOCKER_IMG_NAME }}
version: ${{ steps.image-metadata.outputs.version }}
tags: ${{ steps.image-metadata.outputs.tags }}
labels: ${{ steps.image-metadata.outputs.labels }}
release_tags: ${{ steps.image-tags.outputs.tags }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: docker metadata
id: image-metadata
uses: docker/metadata-action@v5
with:
images: "ghcr.io/${{ env.GITHUB_IMAGE }}"
flavor: |
latest=false
suffix=-debug
tags: |
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
- name: docker tags for cloning
id: image-tags
uses: docker/metadata-action@v5
with:
flavor: |
latest=false
suffix=-debug
tags: |
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_BASE_TAG }}
type=raw,value=${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
type=raw,value=v${{ needs.determine-tags.outputs.IMAGE_MAJOR_MINOR }}
- name: Set outputs
id: set-outputs
run: |
echo "IMAGE_NAME=${{ env.GITHUB_IMAGE }}" >> $GITHUB_OUTPUT
echo "DOCKER_IMG_NAME=${{env.DOCKER_REPO}}/${{ env.DOCKER_IMAGE }}" >> $GITHUB_OUTPUT
build-FluentBit-prod-image:
needs:
- build-prod-image-metadata
runs-on: ubuntu-latest
timeout-minutes: 30
name: Build Fluent Bit prod image
steps:
- name: Install Go
uses: actions/setup-go@v5
with:
go-version: 1.22.0
- uses: actions/cache@v4
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
- name: Build and Push Image for Fluent Bit
id: docker-build
uses: docker/build-push-action@v6
with:
context: .
file: ./cmd/fluent-watcher/fluentbit/Dockerfile
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ needs.build-prod-image-metadata.outputs.tags }}
labels: ${{ needs.build-prod-image-metadata.outputs.labels }}
build-FluentBit-debug-image:
needs:
- build-debug-image-metadata
runs-on: ubuntu-latest
timeout-minutes: 30
name: Build Fluent Bit debug image
steps:
- name: Install Go
uses: actions/setup-go@v5
with:
go-version: 1.22.0
- uses: actions/cache@v4
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
- name: Build and Push Fluent Bit Debug Image
id: docker-build-debug
uses: docker/build-push-action@v6
with:
context: .
file: ./cmd/fluent-watcher/fluentbit/Dockerfile.debug
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ needs.build-debug-image-metadata.outputs.tags }}
labels: ${{ needs.build-debug-image-metadata.outputs.labels }}
scan-FluentBit-image:
name: Scan prod image
needs:
- build-prod-image-metadata
- build-FluentBit-prod-image
uses: ./.github/workflows/scan-docker-image-action.yaml
with:
source_image: "${{ needs.build-prod-image-metadata.outputs.IMG_NAME }}:${{ needs.build-prod-image-metadata.outputs.version }}"
source_registry: ghcr.io
platforms: "['linux/arm64', 'linux/amd64']"
secrets:
registry_username: ${{ github.actor }}
registry_password: ${{ secrets.GITHUB_TOKEN }}
release-prod-image-to-docker-hub:
if: ${{ github.event_name != 'pull_request' }}
name: Release prod image to Docker Hub
uses: ./.github/workflows/clone-docker-image-action.yaml
needs:
- build-FluentBit-prod-image
- scan-FluentBit-image
- build-prod-image-metadata
with:
source_image: "${{ needs.build-prod-image-metadata.outputs.IMG_NAME }}:${{ needs.build-prod-image-metadata.outputs.version }}"
source_registry: ghcr.io
target_image: "${{ needs.build-prod-image-metadata.outputs.DOCKER_IMG_NAME }}"
target_registry: docker.io
tags: ${{ needs.build-prod-image-metadata.outputs.release_tags }}
secrets:
source_registry_username: ${{ github.actor }}
source_registry_token: ${{ secrets.GITHUB_TOKEN }}
target_registry_username: ${{ secrets.REGISTRY_USER }}
target_registry_token: ${{ secrets.REGISTRY_PASSWORD }}
release-debug-image-to-docker-hub:
if: ${{ github.event_name != 'pull_request' }}
name: Release debug image to Docker Hub
uses: ./.github/workflows/clone-docker-image-action.yaml
needs:
- build-FluentBit-debug-image
- build-debug-image-metadata
with:
source_image: "${{ needs.build-debug-image-metadata.outputs.IMG_NAME }}:${{ needs.build-debug-image-metadata.outputs.version }}"
source_registry: ghcr.io
target_image: "${{ needs.build-debug-image-metadata.outputs.DOCKER_IMG_NAME }}"
target_registry: docker.io
tags: ${{ needs.build-debug-image-metadata.outputs.release_tags }}
secrets:
source_registry_username: ${{ github.actor }}
source_registry_token: ${{ secrets.GITHUB_TOKEN }}
target_registry_username: ${{ secrets.REGISTRY_USER }}
target_registry_token: ${{ secrets.REGISTRY_PASSWORD }}