From 634794e7d3afb7ddbbd161ffc696dd22e438c1c9 Mon Sep 17 00:00:00 2001 From: Dave the Dev Date: Wed, 8 Jul 2026 19:53:17 +0000 Subject: [PATCH] Hithomelabs/CFTunnels#139: Parameterize portainer-automation build workflow for multi-environment reuse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace single-branch push trigger with test + main + workflow_dispatch - Add environment determination (test → PATCH bump, main/prod → MINOR bump) - Add semver calculation with conditional patch/minor logic - Add env validation (fails early on invalid env) - Remove pa- prefix from git tags (use plain semver) - Test builds fresh image; main/prod promotes test image to prod - Match final architecture spec from Archie --- .../portainer_automation_build_push.yml | 113 +++++++++++++----- 1 file changed, 85 insertions(+), 28 deletions(-) diff --git a/.gitea/workflows/portainer_automation_build_push.yml b/.gitea/workflows/portainer_automation_build_push.yml index 0a68187..8ce4c0f 100644 --- a/.gitea/workflows/portainer_automation_build_push.yml +++ b/.gitea/workflows/portainer_automation_build_push.yml @@ -1,66 +1,123 @@ -name: portainer-automation build and push +name: Build & Push Portainer Automation run-name: PA Build started by ${{ gitea.actor }} + on: push: - branches: [test] + branches: + - test # → PATCH bump, build & tag as test + - main # → MINOR bump, promote test→prod + workflow_dispatch: + inputs: + environment: + description: 'Target environment (test → PATCH bump, prod → MINOR bump)' + required: true + default: 'test' + type: choice + options: + - test + - prod + jobs: - tag: + version: runs-on: ubuntu-latest outputs: - new_version: ${{ steps.new_version.outputs.new_version }} + new_version: ${{ steps.semver.outputs.new_version }} + target_env: ${{ steps.env.outputs.target_env }} steps: - - name: Check out repository code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Get new version - id: new_version + - name: Determine environment + id: env run: | - VERSION=$(git describe --tags --abbrev=0) - echo "Current version: ${VERSION}" + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + ENV="${{ inputs.environment }}" + else + # Push events: test branch → test env, main branch → prod env + [[ "${{ github.ref_name }}" == "main" ]] && ENV="prod" || ENV="${{ github.ref_name }}" + fi + # Validate + if [[ "$ENV" != "test" && "$ENV" != "prod" ]]; then + echo "❌ Invalid environment: $ENV. Must be 'test' or 'prod'." + exit 1 + fi + echo "target_env=$ENV" >> $GITHUB_OUTPUT + + - name: Calculate semver bump + id: semver + run: | + VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0") + echo "Latest tag: ${VERSION}" MAJOR=$(echo ${VERSION} | cut -d "." -f 1) MINOR=$(echo ${VERSION} | cut -d "." -f 2) PATCH=$(echo ${VERSION} | cut -d "." -f 3) - NEW_PATCH=$((PATCH + 1)) - NEW_VERSION="${MAJOR}.${MINOR}.${NEW_PATCH}" - echo "New version: ${NEW_VERSION}" + + if [[ "${{ steps.env.outputs.target_env }}" == "prod" ]]; then + # MINOR bump, reset PATCH + NEW_MINOR=$((MINOR + 1)) + NEW_VERSION="${MAJOR}.${NEW_MINOR}.0" + echo "Production → minor bump: ${NEW_VERSION}" + else + # test → PATCH bump + NEW_PATCH=$((PATCH + 1)) + NEW_VERSION="${MAJOR}.${MINOR}.${NEW_PATCH}" + echo "Test → patch bump: ${NEW_VERSION}" + fi echo "new_version=${NEW_VERSION}" >> $GITHUB_OUTPUT - build_tag_push: + + build-and-push: runs-on: ubuntu-latest - needs: tag + needs: version container: image: 192.168.0.100:8928/hithomelabs/ci-runner:1.0.0 steps: - - name: Check out repository code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Install JDK (Alpine package) run: | apk add --no-cache openjdk17-jdk echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk" >> "$GITHUB_ENV" + - name: Validate Gradle Wrapper (offline checksum) run: | sha256sum --check gradle/wrapper/gradle-wrapper.jar.sha256 - - name: Create and push tag + + - name: Create and push git tag run: | - echo "New version: ${{ needs.tag.outputs.new_version }}" + echo "New version: ${{ needs.version.outputs.new_version }}" git config --global user.name "${{ gitea.actor }}" git config --global user.email "${{ gitea.actor }}@users.noreply.github.com" - git tag -a "pa-${{ needs.tag.outputs.new_version }}" -m "Pushing PA version ${{ needs.tag.outputs.new_version }}" - git push origin "pa-${{ needs.tag.outputs.new_version }}" + git tag -a "${{ needs.version.outputs.new_version }}" \ + -m "Push PA version ${{ needs.version.outputs.new_version }}" + git push origin "${{ needs.version.outputs.new_version }}" + - name: Log in to Gitea Docker Registry uses: docker/login-action@v3 with: registry: 'http://192.168.0.100:8928' username: hitanshu password: ${{ secrets.TOKEN }} - - name: Gradle build image - run: ./gradlew :portainer-automation:bootBuildImage --imageName=192.168.0.100:8928/hithomelabs/portainer-automation:${{ needs.tag.outputs.new_version }} - - name: Tag image as test - run: docker tag 192.168.0.100:8928/hithomelabs/portainer-automation:${{ needs.tag.outputs.new_version }} 192.168.0.100:8928/hithomelabs/portainer-automation:test - - name: Push to Gitea Registry + + - name: Build image (test) or promote (prod) run: | - docker push 192.168.0.100:8928/hithomelabs/portainer-automation:test - docker push 192.168.0.100:8928/hithomelabs/portainer-automation:${{ needs.tag.outputs.new_version }} + ENV="${{ needs.version.outputs.target_env }}" + VER="${{ needs.version.outputs.new_version }}" + REG="192.168.0.100:8928/hithomelabs/portainer-automation" + + if [[ "$ENV" == "test" ]]; then + echo "🔨 Building fresh image for test" + ./gradlew :portainer-automation:bootBuildImage --imageName="${REG}:${VER}" + docker tag "${REG}:${VER}" "${REG}:test" + docker push "${REG}:test" + docker push "${REG}:${VER}" + else + echo "♻️ Promoting test image to prod" + docker pull "${REG}:test" + docker tag "${REG}:test" "${REG}:${VER}" + docker tag "${REG}:${VER}" "${REG}:prod" + docker push "${REG}:prod" + docker push "${REG}:${VER}" + fi -- 2.45.2