Skip to content

Init container for k8s operator #173

Init container for k8s operator

Init container for k8s operator #173

name: "Init container for k8s operator"
on:
workflow_dispatch:
inputs:
release_tag:
description: "Release tag of the agent"
required: true
init_image_tag:
description: "Image tag"
required: true
default: "0"
force:
description: "Force build"
required: false
default: "false"
jobs:
set_image_tag_variable:
strategy:
matrix:
agents:
[
{ name: "linux", file: "agent.zip", platform: "linux/amd64" },
{
name: "alpine",
file: "agent-alpine.zip",
platform: "linux/amd64",
},
{
name: "linux-arm64",
file: "agent-arm64.zip",
platform: "linux/arm64",
},
{
name: "alpine-arm64",
file: "agent-alpine-arm64.zip",
platform: "linux/arm64",
},
]
runs-on: ubuntu-latest
name: Build and push Docker image
env:
base_image_tag: alpine-3.20.0
steps:
- name: Set release tag
shell: bash
run: |
# check that tag is matching regex x.y.x-release.<commit hash> or force flag is enabled
if [[ ! ${{ inputs.release_tag }} =~ ^[0-9]+\.[0-9]+\.[0-9]+-release\.[0-9a-f]+$ ]] ; then
echo "Tag ${{ inputs.release_tag }} is not matching regex x.y.x-release.<commithash>"
if [[ "${{ inputs.force }}" == "true" ]] ; then
echo "Force flag is enabled. Continue"
else
exit 1
fi
fi
echo "TAG_NAME=$(echo ${{ inputs.release_tag }} | sed -E 's/^([0-9]*\.[0-9]*\.[0-9]*).*/\1/')-init.${{ inputs.init_image_tag }}" >> "$GITHUB_OUTPUT"
id: set_tag
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
if: ${{ success() }}
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_PASS }}
- name: Configure AWS credentials for artifacts bucket
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.RELEASE_ARTIFACTS_MANAGER_KEY }}
aws-secret-access-key: ${{ secrets.RELEASE_ARTIFACTS_MANAGER_SECRET }}
aws-region: us-east-1
- name: Set docker image tags
id: set_docker_tags
run: |
python3 -m pip install semver
existing_tags=()
dockerhub_tags=$(curl -s "https://hub.docker.com/v2/namespaces/lightruncom/repositories/k8s-operator-init-java-agent-${{ matrix.agents.name }}/tags?page_size=50" | jq -r ".results[].name")
if [[ $? -ne 0 ]] ; then
echo "Failed to fetch existing tags"
exit 1
fi
while IFS= read -r line; do
existing_tags+=("$line")
done < <(echo $dockerhub_tags)
for tag in $existing_tags
do
if [[ "$tag" == "latest" ]] ; then
continue
fi
echo "Comparing existing tag: $tag with new: ${{steps.set_tag.outputs.TAG_NAME}}"
if [[ $(pysemver compare $tag ${{steps.set_tag.outputs.TAG_NAME}}) -ge 0 ]] ; then
echo "Existing tag: $tag is greater or equal than new: ${{ inputs.release_tag }}. Skip adding latest tag"
echo "DOCKER_TAGS=lightruncom/k8s-operator-init-java-agent-${{ matrix.agents.name }}:${{steps.set_tag.outputs.TAG_NAME}}" >> "$GITHUB_OUTPUT"
exit 0
fi
done
echo "Adding latest tag to ${{steps.set_tag.outputs.TAG_NAME}}"
echo "DOCKER_TAGS=lightruncom/k8s-operator-init-java-agent-${{ matrix.agents.name }}:${{steps.set_tag.outputs.TAG_NAME}},lightruncom/k8s-operator-init-java-agent-${{ matrix.agents.name }}:latest" >> "$GITHUB_OUTPUT"
- name: Download agent artifacts
run: |
aws s3 cp s3://${{ secrets.RELEASE_ARTIFACTS_BUCKET }}/artifacts/${{ inputs.release_tag }}/${{ matrix.agents.file }} ./lightrun-init-agent/
- name: Build and push ${{ matrix.agents.name }} container
uses: docker/build-push-action@v4
with:
context: .
file: ./lightrun-init-agent/Dockerfile
push: true
platforms: ${{ matrix.agents.platform }}
tags: ${{steps.set_docker_tags.outputs.DOCKER_TAGS}}
build-args: |
FILE=${{ matrix.agents.file }}
base_image_tag=${{ env.base_image_tag }}
- name: Slack Notification
if: always()
uses: rtCamp/[email protected]
env:
SLACK_CHANNEL: devops-alerts
SLACK_COLOR: ${{ job.status }} # or a specific color like 'good' or '#ff00ff'
SLACK_MESSAGE: "Tag ${{ inputs.release_tag }} | Platform ${{ matrix.agents.name }}"
SLACK_TITLE: Init contianer build status - ${{ job.status }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}