Skip to content

Build and Push Docker Image #123

Build and Push Docker Image

Build and Push Docker Image #123

Workflow file for this run

name: Build and Push Docker Image
on:
push:
branches:
- main
tags:
- '*.*.*'
pull_request:
branches:
- main
workflow_dispatch:
inputs:
version:
description: 'Version to build and deploy'
required: false
is_release:
description: 'Is this a release build?'
required: false
default: false
type: boolean
env:
REPO: 'artifact.aerospike.io/ecosystem-container-dev-local'
JFROG_CLI_BUILD_NAME: 'asvec'
JFROG_CLI_LOG_LEVEL: DEBUG
JFROG_CLI_BUILD_PROJECT: 'ecosystem'
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
with:
platforms: all
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Install JFrog CLI
uses: jfrog/setup-jfrog-cli@v3
with:
version: 'latest'
- name: Login to Artifact Aerospike Docker Registry
run: |
jf docker login artifact.aerospike.io --username ${{ secrets.JFROG_USERNAME }} --password ${{ secrets.JFROG_ACCESS_TOKEN }}
env:
JFROG_CLI_OFFER_CONFIG: 'false'
- name: Configure JFrog CLI
run: |
jf c add \
--url https://artifact.aerospike.io/ \
--user ${{ secrets.JFROG_USERNAME }} \
--access-token ${{ secrets.JFROG_ACCESS_TOKEN }} \
artifact
jf c use artifact
env:
JFROG_CLI_OFFER_CONFIG: 'false'
- name: Set Version
run: |
# Initialize variables
VERSION_ARG=""
VERSION=""
IS_RELEASE="${{ github.event.inputs.is_release }}"
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
# On tag push: Use the tag name as the version
VERSION="${GITHUB_REF#refs/tags/}"
elif [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
# On manual trigger
if [ -n "${{ github.event.inputs.version }}" ]; then
VERSION_ARG="${{ github.event.inputs.version }}"
else
# If no version input provided, default to RELEASE file
VERSION_ARG=$(cat RELEASE)
fi
if [ "${IS_RELEASE}" == 'true' ]; then
# If release checkbox is checked, use version directly
VERSION="${VERSION_ARG}"
else
# If not release, append build ID
VERSION="${VERSION_ARG}-${GITHUB_RUN_NUMBER}"
fi
else
# In all other cases: Use RELEASE file content appended with build ID
VERSION_ARG=$(cat RELEASE)
VERSION="${VERSION_ARG}-${GITHUB_RUN_NUMBER}"
fi
echo "VERSION=${VERSION}" >> $GITHUB_ENV
- name: Build Docker Image (No Push)
if: github.event_name == 'pull_request'
run: |
jf docker buildx bake \
--set asvec.tags.0=asvec:test-${{ github.run_id }} \
--file docker/asvec.docker/bake.hcl \
env:
DOCKER_BUILDKIT: '1'
- name: Build and Push Docker Image
if: github.event_name == 'workflow_dispatch' || github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/'))
run: |
jf docker buildx bake \
--set asvec.tags=${{ env.REPO }}/asvec:${{ env.VERSION }} \
--file docker/asvec.docker/bake.hcl \
--push \
--metadata-file=build-metadata
env:
DOCKER_BUILDKIT: '1'
- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
- name: Extract Image Name and Digest
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')))
run: |
jq -r '.[] | {digest: .["containerimage.digest"], names: .["image.name"] | split(",")} | "(.digest)"' build-metadata > sha
echo ${{ env.REPO }}/asvec:${{ env.VERSION }}@$(cat sha) > meta-info
echo ${{ env.REPO }}/asvec:${{ env.VERSION }}@$(cat sha) > meta-info-latest
- name: Create Docker Build Info
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')))
run: |
jf rt build-docker-create \
--build-name "${{ env.JFROG_CLI_BUILD_NAME }}-container" \
--build-number "${{ env.VERSION }}" \
--image-file ./meta-info \
--project ecosystem \
ecosystem-container-dev-local
- name: Publish Build Info
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')))
run: |
export JFROG_CLI_LOG_LEVEL=DEBUG
jf rt build-collect-env --project ecosystem "${{ env.JFROG_CLI_BUILD_NAME }}-container" "${{ env.VERSION }}"
jf rt build-add-git --project ecosystem "${{ env.JFROG_CLI_BUILD_NAME }}-container" "${{ env.VERSION }}"
jf rt build-publish \
--detailed-summary \
--project ecosystem \
"${{ env.JFROG_CLI_BUILD_NAME }}-container" "${{ env.VERSION }}"
# All of the following steps are commented out because they are just to handle "latest" tag and it is typically not desired in a release bundle
# - name: Tag a release with latest (Release)
# if: github.event_name == 'workflow_dispatch' && github.event.inputs.is_release == 'true' || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
# run: |
# jf docker buildx imagetools create --tag ${{ env.REPO }}/asvec:latest ${{ env.REPO }}/asvec:${{ env.VERSION }}
# env:
# DOCKER_BUILDKIT: '1'
# - name: Create Docker Build Info for latest
# if: github.event_name == 'workflow_dispatch' && github.event.inputs.is_release == 'true' || (github.event_name == 'push' && (startsWith(github.ref, 'refs/tags/')))
# run: |
# jf rt build-docker-create \
# --build-name "${{ env.JFROG_CLI_BUILD_NAME }}-container-latest" \
# --build-number "${{ env.VERSION }}" \
# --image-file ./meta-info \
# --project ecosystem \
# ecosystem-container-dev-local
# - name: Publish Build Info for latest
# if: github.event_name == 'workflow_dispatch' && github.event.inputs.is_release == 'true' || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
# run: |
# jfrog rt build-collect-env "${{ env.JFROG_CLI_BUILD_NAME }}-container-latest" "${{ env.VERSION }}"
# jfrog rt build-add-git "${{ env.JFROG_CLI_BUILD_NAME }}-container-latest" "${{ env.VERSION }}"
# jfrog rt build-add-dependencies "${{ env.JFROG_CLI_BUILD_NAME }}-container-latest" "${{ env.VERSION }}".
# jf rt build-publish \
# --detailed-summary \
# --project ecosystem \
# "${{ env.JFROG_CLI_BUILD_NAME }}-container-latest" "${{ env.VERSION }}"
- name: Create Release Bundle
if: github.event_name == 'workflow_dispatch' && github.event.inputs.is_release == 'true'|| (github.event_name == 'push' && (startsWith(github.ref, 'refs/tags/')))
run: |
echo '{
"name": "${{ env.JFROG_CLI_BUILD_NAME }}",
"version": "${{ env.VERSION }}",
"description": "Release bundle for ${{github.repository}} version ${{ env.VERSION }}",
"files": [
{
"project": "ecosystem",
"build": "${{ env.JFROG_CLI_BUILD_NAME }}-container"
}
]
}' > release-bundle-spec.json
cat release-bundle-spec.json
jf release-bundle-create \
"${{ env.JFROG_CLI_BUILD_NAME }}" "${{ env.VERSION }}"\
--project ecosystem \
--spec release-bundle-spec.json \
--signing-key aerospike --sync