diff --git a/.gitea/workflows/cftunnels_build_push.yml b/.gitea/workflows/cftunnels_build_push.yml new file mode 100644 index 0000000..7dce083 --- /dev/null +++ b/.gitea/workflows/cftunnels_build_push.yml @@ -0,0 +1,138 @@ +name: Build & Push CFTunnels +run-name: CF Build started by ${{ gitea.actor }} + +on: + push: + branches: + - test # → PATCH bump, build & tag as test + - main # → MINOR bump, promote test→prod + workflow_dispatch: + +jobs: + version: + runs-on: ubuntu-latest + outputs: + new_version: ${{ steps.semver.outputs.new_version }} + target_env: ${{ steps.env.outputs.target_env }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Determine environment + id: env + run: | + [[ "${{ github.ref_name }}" == "main" ]] && ENV="prod" || ENV="${{ github.ref_name }}" + 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 --match "cf-*" --abbrev=0 2>/dev/null || echo "cf-0.0.0") + echo "Latest tag: ${VERSION}" + # Strip cf- prefix + VERSION=${VERSION#cf-} + MAJOR=$(echo ${VERSION} | cut -d "." -f 1) + MINOR=$(echo ${VERSION} | cut -d "." -f 2) + PATCH=$(echo ${VERSION} | cut -d "." -f 3) + + 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=cf-${NEW_VERSION}" >> $GITHUB_OUTPUT + + build-and-push: + runs-on: ubuntu-latest + needs: version + container: + image: 192.168.0.100:8928/hithomelabs/ci-runner:1.0.0 + steps: + - 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 git tag + run: | + 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 "${{ needs.version.outputs.new_version }}" \ + -m "Push CF 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: Build image (test) or promote (prod) + run: | + ENV="${{ needs.version.outputs.target_env }}" + VER="${{ needs.version.outputs.new_version }}" + REG="192.168.0.100:8928/hithomelabs/cftunnels" + + if [[ "$ENV" == "test" ]]; then + echo "→ Building fresh image for test" + ./gradlew :cftunnels-service: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 + + - name: Set Portainer deploy variables + id: portainer-vars + run: | + ENV="${{ needs.version.outputs.target_env }}" + if [[ "$ENV" == "prod" ]]; then + echo "url=http://192.168.0.100:8082" >> $GITHUB_OUTPUT + echo "stack=${{ vars.CFTUNNELS_PROD_STACK_ID }}" >> $GITHUB_OUTPUT + echo "key=${{ secrets.PORTAINER_SERVICE_API_KEY_PROD }}" >> $GITHUB_OUTPUT + else + echo "url=http://192.168.0.100:8081" >> $GITHUB_OUTPUT + echo "stack=${{ vars.CFTUNNELS_DEV_STACK_ID }}" >> $GITHUB_OUTPUT + echo "key=${{ secrets.PORTAINER_SERVICE_API_KEY }}" >> $GITHUB_OUTPUT + fi + + - name: Trigger Portainer Redeploy + if: success() + env: + PORTAINER_AUTOMATION_URL: ${{ steps.portainer-vars.outputs.url }} + STACK_ID: ${{ steps.portainer-vars.outputs.stack }} + API_KEY: ${{ steps.portainer-vars.outputs.key }} + run: | + wget -q --no-check-certificate --timeout=30 \ + --post-data= \ + --header="X-API-Key: $API_KEY" \ + -O - \ + "$PORTAINER_AUTOMATION_URL/api/deploy/$STACK_ID" 2>&1 \ + || echo "Deploy trigger failed (non-fatal)" diff --git a/.gitea/workflows/portainer_automation_build_push.yml b/.gitea/workflows/portainer_automation_build_push.yml index 0888e23..e8fa2ae 100644 --- a/.gitea/workflows/portainer_automation_build_push.yml +++ b/.gitea/workflows/portainer_automation_build_push.yml @@ -7,12 +7,6 @@ on: - test # → PATCH bump, build & tag as test - main # → MINOR bump, promote test→prod workflow_dispatch: - inputs: - environment: - description: 'Target environment: "test" (PATCH bump) or "prod" (MINOR bump). Invalid values fail early with validation error.' - required: true - default: 'test' - type: string jobs: version: @@ -28,15 +22,9 @@ jobs: - name: Determine environment id: env run: | - 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 + [[ "${{ github.ref_name }}" == "main" ]] && ENV="prod" || ENV="${{ github.ref_name }}" if [[ "$ENV" != "test" && "$ENV" != "prod" ]]; then - echo "❌ Invalid environment: $ENV. Must be 'test' or 'prod'." + echo "→ Invalid environment: $ENV. Must be 'test' or 'prod'." exit 1 fi echo "target_env=$ENV" >> $GITHUB_OUTPUT @@ -44,8 +32,10 @@ jobs: - name: Calculate semver bump id: semver run: | - VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0") + VERSION=$(git describe --tags --match "pa-*" --abbrev=0 2>/dev/null || echo "pa-0.0.0") echo "Latest tag: ${VERSION}" + # Strip pa- prefix + VERSION=${VERSION#pa-} MAJOR=$(echo ${VERSION} | cut -d "." -f 1) MINOR=$(echo ${VERSION} | cut -d "." -f 2) PATCH=$(echo ${VERSION} | cut -d "." -f 3) @@ -61,7 +51,7 @@ jobs: NEW_VERSION="${MAJOR}.${MINOR}.${NEW_PATCH}" echo "Test → patch bump: ${NEW_VERSION}" fi - echo "new_version=${NEW_VERSION}" >> $GITHUB_OUTPUT + echo "new_version=pa-${NEW_VERSION}" >> $GITHUB_OUTPUT build-and-push: runs-on: ubuntu-latest @@ -105,13 +95,13 @@ jobs: REG="192.168.0.100:8928/hithomelabs/portainer-automation" if [[ "$ENV" == "test" ]]; then - echo "🔨 Building fresh image for test" + 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" + echo "→ Promoting test image to prod" docker pull "${REG}:test" docker tag "${REG}:test" "${REG}:${VER}" docker tag "${REG}:${VER}" "${REG}:prod" diff --git a/.gitea/workflows/prod_image_tag_promote.yaml b/.gitea/workflows/prod_image_tag_promote.yaml deleted file mode 100644 index 25cf4cf..0000000 --- a/.gitea/workflows/prod_image_tag_promote.yaml +++ /dev/null @@ -1,70 +0,0 @@ -name: Promote image with tag test to prod -run-name: Build started by $ {{gitea.actor}} -on: - push: - branches: [main] -jobs: - tag: - runs-on: ubuntu-latest - outputs: - new_version: ${{ steps.new_version.outputs.new_version }} - steps: - - name: Check out repository code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Get new version - id: new_version - run: | - VERSION=$(git describe --tags --abbrev=0) - echo ${VERSION} - MAJOR=$(echo ${VERSION} | cut -d "." -f 1) - MINOR=$(echo ${VERSION} | cut -d "." -f 2) - PATCH=0 - NEW_MINOR=$(( ${MINOR} + 1)) - echo ${NEW_MINOR} - echo "new_version=$(echo "${MAJOR}.${NEW_MINOR}.${PATCH}")" >> $GITHUB_OUTPUT - build_tag_push: - runs-on: ubuntu-latest - needs: tag - container: - image: 192.168.0.100:8928/hithomelabs/ci-runner:1.0.0 - steps: - - name: Check out repository code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Create and push tag - run: | - echo "NEW_VERSION=${{ needs.tag.outputs.new_version }}" - git config --global user.name "${{gitea.actor}}" - git config --global user.email "${{ gitea.actor }}@users.noreply.github.com" - git tag -a ${{ needs.tag.outputs.new_version }} -m "Pushing new version ${{ needs.tag.outputs.new_version }}" - git push origin ${{ needs.tag.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: Tag prod image - run: | - docker tag 192.168.0.100:8928/hithomelabs/cftunnels:test 192.168.0.100:8928/hithomelabs/cftunnels:${{ needs.tag.outputs.new_version }} - docker tag 192.168.0.100:8928/hithomelabs/cftunnels:${{ needs.tag.outputs.new_version }} 192.168.0.100:8928/hithomelabs/cftunnels:prod - - name: Push to Gitea Registry - run: | - docker push 192.168.0.100:8928/hithomelabs/cftunnels:prod - docker push 192.168.0.100:8928/hithomelabs/cftunnels:${{ needs.tag.outputs.new_version }} - - name: Trigger Portainer Redeploy (Prod) - if: success() - env: - PORTAINER_AUTOMATION_URL: "http://192.168.0.100:8082" - STACK_ID: ${{ vars.CFTUNNELS_PROD_STACK_ID }} - API_KEY: ${{ secrets.PORTAINER_SERVICE_API_KEY_PROD }} - run: | - wget -q --no-check-certificate --timeout=30 \ - --post-data= \ - --header="X-API-Key: $API_KEY" \ - -O - \ - "$PORTAINER_AUTOMATION_URL/api/deploy/$STACK_ID" 2>&1 \ - || echo "Deploy trigger failed (non-fatal)" diff --git a/.gitea/workflows/test_image_build_push.yml b/.gitea/workflows/test_image_build_push.yml deleted file mode 100644 index 7d22be9..0000000 --- a/.gitea/workflows/test_image_build_push.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: sample gradle build and test -run-name: Build started by ${{ gitea.actor }} -on: - push: - branches: [test] -jobs: - tag: - runs-on: ubuntu-latest - outputs: - new_version: ${{ steps.new_version.outputs.new_version }} - steps: - - name: Check out repository code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Get new version - id: new_version - run: | - VERSION=$(git describe --tags --abbrev=0) - echo "Current version: ${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}" - echo "new_version=${NEW_VERSION}" >> $GITHUB_OUTPUT - build_tag_push: - runs-on: ubuntu-latest - needs: tag - container: - image: 192.168.0.100:8928/hithomelabs/ci-runner:1.0.0 - steps: - - name: Check out repository code - 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 - run: | - echo "New version: ${{ needs.tag.outputs.new_version }}" - git config --global user.name "${{ gitea.actor }}" - git config --global user.email "${{ gitea.actor }}@users.noreply.github.com" - git tag -a "${{ needs.tag.outputs.new_version }}" -m "Pushing new version ${{ needs.tag.outputs.new_version }}" - git push origin "${{ needs.tag.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 - run: ./gradlew :cftunnels-service:bootBuildImage --imageName=192.168.0.100:8928/hithomelabs/cftunnels:${{ needs.tag.outputs.new_version }} - - name: Tag image as test - run: docker tag 192.168.0.100:8928/hithomelabs/cftunnels:${{ needs.tag.outputs.new_version }} 192.168.0.100:8928/hithomelabs/cftunnels:test - - name: Push to Gitea Registry - run: | - docker push 192.168.0.100:8928/hithomelabs/cftunnels:test - docker push 192.168.0.100:8928/hithomelabs/cftunnels:${{ needs.tag.outputs.new_version }} - - name: Trigger Portainer Redeploy (Dev) - if: success() - env: - PORTAINER_AUTOMATION_URL: "http://192.168.0.100:8081" - STACK_ID: ${{ vars.CFTUNNELS_DEV_STACK_ID }} - API_KEY: ${{ secrets.PORTAINER_SERVICE_API_KEY }} - run: | - wget -q --no-check-certificate --timeout=30 \ - --post-data= \ - --header="X-API-Key: $API_KEY" \ - -O - \ - "$PORTAINER_AUTOMATION_URL/api/deploy/$STACK_ID" 2>&1 \ - || echo "Deploy trigger failed (non-fatal)"