Skip to content

Build and Bundle Jfrog Helm chart #53

Build and Bundle Jfrog Helm chart

Build and Bundle Jfrog Helm chart #53

name: Build and Bundle Jfrog Helm chart
permissions:
contents: read
pull-requests: write
on:
push:
tags:
- 'v*.*.*'
workflow_dispatch:
inputs:
chart_version:
description: 'Build number to use for the build metadata'
required: true
default: '0.0.0'
env:
JF_PROJECT: ecosystem
JF_REPO: ecosystem-helm-dev-local
CHART_NAME: 'aerospike-vector-search'
jobs:
setup:
runs-on: ubuntu-20.04
outputs:
chart_version: ${{ steps.version.outputs.chart_version }}
steps:
- name: Determine Version
id: version
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
CHART_VERSION=${{ github.event.inputs.chart_version }}
elif [[ "${{ github.event_name}}" == "push" ]]; then
TAG=${GITHUB_REF#refs/tags/}
# Remove "v" prefix to get the version
CHART_VERSION=${TAG#v}
else
echo "Unable to determine version"
exit 1
fi
echo "CHART_VERSION=${CHART_VERSION}" >> $GITHUB_ENV
echo "chart_version=${CHART_VERSION}" >> $GITHUB_OUTPUT
build-chart:
runs-on: ubuntu-20.04
needs: setup
steps:
- name: Checkout current repository
uses: actions/checkout@v4
- name: setup GPG
uses: aerospike/shared-workflows/devops/setup-gpg@af875da2c1956bc5848705de17c4998a0fad7b77 # v0.2.0
with:
gpg-private-key: ${{ secrets.GPG_SECRET_KEY }}
gpg-public-key: ${{ secrets.GPG_PUBLIC_KEY }}
gpg-key-pass: ${{ secrets.GPG_PASS }}
gpg-key-name: "aerospike-inc"
- name: setup jfrog
uses: jfrog/setup-jfrog-cli@v4
env:
JF_URL: https://aerospike.jfrog.io
JF_ACCESS_TOKEN: ${{ secrets.JF_ACCESS_TOKEN }}
JF_PROJECT: ${{ env.JF_PROJECT }}
- name: Set Helm Chart Version
uses: mikefarah/yq@8bf425b4d1344db7cd469a8d10a390876e0c77fd
with:
cmd: yq e -i '.version = "${{ needs.setup.outputs.chart_version }}"' charts/$CHART_NAME/Chart.yaml
- name: "Sign and publish build to JFrog"
env:
GPG_TTY: no-tty
GPG_PASSPHRASE: ${{ secrets.GPG_PASS }}
run: |
cd charts
gpg --export --no-tty --passphrase "$GPG_PASSPHRASE" > ~/.gnupg/pubring.gpg
gpg --export-secret-keys --no-tty --passphrase "$GPG_PASSPHRASE">~/.gnupg/secring.gpg
echo $GPG_PASSPHRASE > passphrase.txt
helm --sign --key='aerospike-inc' --keyring='/home/runner/.gnupg/secring.gpg' --passphrase-file passphrase.txt package $CHART_NAME
find .
jf rt u "${{env.CHART_NAME}}-${{needs.setup.outputs.chart_version}}.tgz*" "${{env.JF_REPO}}/${{env.CHART_NAME}}/${{needs.setup.outputs.chart_version}}/" \
--build-name="${{env.CHART_NAME}}-helm" --build-number="${{needs.setup.outputs.chart_version}}" --project="${{env.JF_PROJECT}}"
jf rt build-collect-env "${{env.CHART_NAME}}-helm" "${{needs.setup.outputs.chart_version}}"
jf rt build-add-git "${{env.CHART_NAME}}-helm" "${{needs.setup.outputs.chart_version}}"
jf rt build-publish "${{env.CHART_NAME}}-helm" "${{needs.setup.outputs.chart_version}}" --project="${{env.JF_PROJECT}}"
build-init-container:
needs:
- setup
runs-on: ubuntu-20.04
steps:
- name: 'Git checkout'
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3.3.0
with:
platforms: all
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: setup jfrog
uses: jfrog/setup-jfrog-cli@f748a0599171a192a2668afee8d0497f7c1069df # v4.5.6
env:
JF_URL: https://aerospike.jfrog.io
JF_ACCESS_TOKEN: ${{ secrets.JF_ACCESS_TOKEN }}
JF_PROJECT: ${{ env.JF_PROJECT }}
- name: Login to Artifact Aerospike Docker Registry
run: |
jf docker login artifact.aerospike.io --username ${{ vars.JF_USERNAME }} --password ${{ secrets.JF_ACCESS_TOKEN }}
env:
JFROG_CLI_OFFER_CONFIG: 'false'
- name: Configure JFrog CLI
run: |
jf c add \
--url https://artifact.aerospike.io/ \
--user ${{ vars.JF_USERNAME }} \
--access-token ${{ secrets.JF_ACCESS_TOKEN }} \
artifact
jf c use artifact
env:
JFROG_CLI_OFFER_CONFIG: 'false'
# Init container uses chart's version
- name: Build and Push Docker Image
run: |
jf docker buildx bake \
--set avs-init-container.tags=artifact.aerospike.io/${{ env.JF_PROJECT }}-container-dev-local/avs-init-container:${{ needs.setup.outputs.chart_version }} \
--file avs-init-container/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
run: |
jq -r '.[] | {digest: .["containerimage.digest"], names: .["image.name"] | split(",")} | "(.digest)"' build-metadata > sha
echo artifact.aerospike.io/${{ env.JF_PROJECT }}-container-dev-local/avs-init-container:${{ needs.setup.outputs.chart_version }}@$(cat sha) > meta-info
echo artifact.aerospike.io/${{ env.JF_PROJECT }}-container-dev-local/avs-init-container:${{ needs.setup.outputs.chart_version }}@$(cat sha) > meta-info-latest
- name: Create Docker Build Info
run: |
jf rt build-docker-create \
--build-name "avs-init-container" \
--build-number "${{ needs.setup.outputs.chart_version }}" \
--image-file ./meta-info \
--project ${{env.JF_PROJECT}} \
${{env.JF_PROJECT}}-container-dev-local
- name: Publish Build Info
run: |
export JFROG_CLI_LOG_LEVEL=DEBUG
jf rt build-collect-env --project ${{env.JF_PROJECT}} "avs-init-container" "${{ needs.setup.outputs.chart_version }}"
jf rt build-add-git --project ${{env.JF_PROJECT}} "avs-init-container" "${{ needs.setup.outputs.chart_version }}"
jf rt build-publish \
--detailed-summary \
--project ${{env.JF_PROJECT}} \
"avs-init-container" "${{ needs.setup.outputs.chart_version }}"
create-release-bundle:
needs:
- build-chart
- build-init-container
- setup
runs-on: ubuntu-20.04
steps:
- name: setup jfrog
uses: jfrog/setup-jfrog-cli@f748a0599171a192a2668afee8d0497f7c1069df # v4.5.6
env:
JF_URL: https://aerospike.jfrog.io
JF_ACCESS_TOKEN: ${{ secrets.JF_ACCESS_TOKEN }}
JF_PROJECT: ${{ env.JF_PROJECT }}
- name: Create release bundle
run: |
echo '{
"name": "${{ env.CHART_NAME }}-helm",
"version": "${{ needs.setup.outputs.chart_version }}",
"files": [
{
"project": "${{ env.JF_PROJECT }}",
"build": "${{ env.CHART_NAME }}-helm/${{ needs.setup.outputs.chart_version }}"
},
{
"project": "${{ env.JF_PROJECT }}",
"build": "avs-init-container/${{ needs.setup.outputs.chart_version }}"
}
]
}' > release-bundle-spec.json
cat release-bundle-spec.json
jf release-bundle-create "${{ env.CHART_NAME }}-helm" "${{ needs.setup.outputs.chart_version }}" \
--spec release-bundle-spec.json --project="${{ env.JF_PROJECT }}" --signing-key="aerospike"