diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 6f7dd21..aca8a65 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -14,11 +14,17 @@ on: 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 @@ -43,9 +49,6 @@ jobs: - name: Login to Artifact Aerospike Docker Registry run: | jf docker login artifact.aerospike.io --username ${{ secrets.JFROG_USERNAME }} --password ${{ secrets.JFROG_ACCESS_TOKEN }} - # needed these to get the docker cache working - docker pull artifact.aerospike.io/ecosystem-container-dev-local/asvec:latest || true - docker push artifact.aerospike.io/ecosystem-container-dev-local/asvec:latest || true env: JFROG_CLI_OFFER_CONFIG: 'false' @@ -63,27 +66,41 @@ jobs: - name: Set Version run: | - if [ "${{ github.event_name }}" == "workflow_dispatch" ] && [ -n "${{ github.event.inputs.version }}" ]; then - VERSION_ARG="${{ github.event.inputs.version }}" - elif [ "${{ github.event_name }}" == "push" ] && [[ "${{ github.ref }}" == refs/tags/* ]]; then - VERSION_ARG="${GITHUB_REF#refs/tags/}" + # 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 - BUILD_ID=${GITHUB_RUN_NUMBER} - if [[ "${{ github.ref }}" == refs/tags/* ]]; then - VERSION="${VERSION_ARG}" - else - VERSION="${VERSION_ARG}-${BUILD_ID}" - 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.args.VERSION_ARG=${{ env.VERSION }} \ - --set asvec.args.REPO=${{ env.REPO }} \ --set asvec.tags.0=asvec:test-${{ github.run_id }} \ --file docker/asvec.docker/bake.hcl \ @@ -91,54 +108,101 @@ jobs: DOCKER_BUILDKIT: '1' - name: Build and Push Docker Image - if: github.event_name == 'push' && github.ref == 'refs/heads/main' + 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.args.VERSION_ARG=${{ env.VERSION }} \ - --set asvec.args.REPO=${{ env.REPO }} \ - --set asvec.tags.0=${{ env.REPO }}/asvec:${{ env.VERSION }} \ + --set asvec.tags=${{ env.REPO }}/asvec:${{ env.VERSION }} \ --file docker/asvec.docker/bake.hcl \ --push \ --metadata-file=build-metadata + env: DOCKER_BUILDKIT: '1' - - name: Build and Push Docker Image with 'latest' Tag (Release) - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - run: | - jf docker buildx bake \ - --set asvec.args.VERSION_ARG=${{ env.VERSION }} \ - --set asvec.args.REPO=${{ env.REPO }} \ - --set asvec.tags.0=${{ env.REPO }}/asvec:${{ env.VERSION }} \ - --set asvec.tags.1=${{ env.REPO }}/asvec:latest \ - --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 == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')) + 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(",")} | "\(.names[0])@\(.digest)"' build-metadata > meta-info + 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 == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')) - + 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 }}" \ + --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 == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')) + 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 }}" "${{ env.VERSION }}" + "${{ 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 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0ed766b..4af058b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ VERSION.md build-metadata bin/asvec-linux-amd64 docker/asvec.docker/meta-info +meta-info diff --git a/docker/asvec.docker/bake.hcl b/docker/asvec.docker/bake.hcl index 2d39639..e20ac8b 100644 --- a/docker/asvec.docker/bake.hcl +++ b/docker/asvec.docker/bake.hcl @@ -1,10 +1,3 @@ -variable "VERSION_ARG" { - default = "0.0.0" -} - -variable "REPO" { - default = "artifact.aerospike.io/ecosystem-container-dev-local" -} group "default" { targets = ["asvec"] @@ -15,10 +8,5 @@ target "asvec" { dockerfile = "./Dockerfile" platforms = ["linux/amd64", "linux/arm64"] tags = [ - "${REPO}/asvec:${VERSION_ARG}", - "${REPO}/asvec:latest", ] - args = { - VERSION = "${VERSION_ARG}" - } }