Build and Push Docker Image #120
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |