name: Release on: push: branches: - 'release/**' jobs: release: runs-on: docker steps: # Install software dependencies into the runner container - name: Install system dependencies run: | apt-get update apt-get install -y nodejs npm openjdk-17-jdk maven git jq export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) echo "JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV - name: Check Java and Node versions run: | java -version mvn -v mvn help:evaluate -Dexpression=settings.localRepository -q -DforceStdout node -v npm -v # Checkout (clone) a fresh repo source of the project - name: Checkout repository uses: actions/checkout@v4 # ################################################################## # ## THIS IS A RELEASE ## # ## #1. Get full version string ## # ## #2. Remove sufix "-SNAPSHOT" from version string ## # ## And commit ## # ## #3. Tag the release ## # ## ## - name: Extract version from pom.xml id: version run: | VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) RELEASE_VERSION="${VERSION/-SNAPSHOT/}" echo "release_version=$RELEASE_VERSION" >> $GITHUB_OUTPUT - name: Set release version (remove -SNAPSHOT) run: | mvn versions:set -DnewVersion=${{ steps.version.outputs.release_version }} mvn versions:commit git config user.name "forgejo-actions" git config user.email "ci@forgejo.local" git commit -am "Release ${{ steps.version.outputs.release_version }}" git push - name: Tag release run: | git tag -a v${{ steps.version.outputs.release_version }} -m "Release ${{ steps.version.outputs.release_version }}" git push origin v${{ steps.version.outputs.release_version }} # ## ## # ################################################################## # Install @Angular dependencies - name: Install frontend dependencies if: false # DISABLED for testing. To check if backend build is also doing frontend. run: | cd src/main/webapp npm ci # Build the frontend - name: Build frontend if: false # DISABLED for testing. To check if backend build is also doing frontend. run: | cd src/main/webapp npm run build # Build the backend (JAR). NOTE: the -Dmaven.download.parallel=false will force MAVEN to have a single connection for downloads, without this I can get "Connection reset" - name: Build backend (Spring Boot) if: false # DISABLED for testing. Justo to make it faster to reach the CREATE RELEASE step run: | echo "DEBUG Outputs ************************* " echo "Container hostname: $(hostname)" echo "Runner working dir: $PWD" echo "Runner user: $(whoami)" echo "Listing contents of ~/.m2/repository:" ls -lhR ~/.m2/repository | head -n 100 || echo "No .m2/repository found" echo "Disk usage:" du -sh ~/.m2/repository || echo "No .m2 directory found" echo " " echo "BUILD Outputs ************************* " mvn clean package -Pprod -DskipTests -Dmaven.download.parallel=false -Dmaven.repo.local=/root/.m2/repository -s .forgejo/workflows/ci-settings.xml container: image: maven:3.9-eclipse-temurin-17 volumes: - docker-forgejo_maven-cache:/root/.m2 # Log output - name: List output files run: | ls -lh target/*.jar || true # save artifacts - name: Upload backend JAR uses: actions/upload-artifact@v3 with: name: app-backend path: target/resilient*.jar # Create the release notes (closed issues) - name: Generate release notes from closed issues id: generate_notes run: | OWNER="root" REPO="resilient" TOKEN="${{ secrets.FORGEJO_TOKEN }}" VERSION="${{ steps.version.outputs.release_version }}" FORGEJO_API="https://git.oguerreiro.com/api/v1" echo "Fetching latest release date..." LAST_TAG_DATE=$(curl -s -H "Authorization: token $TOKEN" \ "$FORGEJO_API/repos/$OWNER/$REPO/releases" | jq -r '.[0].created_at') echo "Fetching closed issues since $LAST_TAG_DATE..." # Get closed issues since last tag (if any) if [[ "$LATEST_TAG" != "null" && "$LATEST_TAG" != "v$VERSION" ]]; then CLOSED_ISSUES=$(curl -s -H "Authorization: token $TOKEN" \ "$FORGEJO_API/repos/$REPO_OWNER/$REPO_NAME/issues?state=closed&since=$(date -u -d "$(git log -1 --format=%cI $LATEST_TAG)" +"%Y-%m-%dT%H:%M:%SZ")" \ | jq -r '.[] | "- [#\(.number)](\(.html_url)) \(.title)"') else CLOSED_ISSUES="" fi # Build release notes with proper line breaks { echo "## Release v$VERSION" echo if [[ -n "$CLOSED_ISSUES" ]]; then echo "### Closed Issues" echo "$CLOSED_ISSUES" else echo "No issues closed since last release." fi } > release-notes.md cat release-notes.md # Create the release # NOTE: added system dependency install "jq" - name: Create release and upload JAR run: | VERSION=${{ steps.version.outputs.release_version }} API="https://git.oguerreiro.com/api/v1" REPO="root/resilient" # Create release RESPONSE=$(curl -s -X POST "$API/repos/$REPO/releases" \ -H "Authorization: token ${{ secrets.FORGEJO_TOKEN }}" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"v$VERSION\", \"target_commitish\": \"master\", \"name\": \"Release v$VERSION\", \"body\": $(jq -Rs < release-notes.md) }") RELEASE_ID=$(echo "$RESPONSE" | jq -r '.id') echo "Created release ID: $RELEASE_ID" # Upload artifact curl -s -X POST "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=resilient.jar" \ -H "Authorization: token ${{ secrets.FORGEJO_TOKEN }}" \ -H "Content-Type: application/java-archive" \ --data-binary @"target/resilient*.jar" # ################################################################## # ## THIS IS A RELEASE - Change master version to next SNAPSHOT ## # ## #4. Checkout master ## # ## #5. Calculate the new version string ## # ## Update pom.xml ## # ## Calculate the new version string ## - name: Checkout main if: false # DISABLED for testing. DON't atually change master version uses: actions/checkout@v3 with: ref: master - name: Bump to next SNAPSHOT version if: false # DISABLED for testing. DON't atually change master version run: | # Extract the version from the ref, handling tags like v1.0.2 or branches like release/1.0.2 RAW_REF="${GITHUB_REF##*/}" # gets 'v1.0.2' or '1.0.2' VERSION="${RAW_REF#v}" # strips leading 'v' if present → gives '1.0.2' echo "Current version: $VERSION" MAJOR=$(echo "$VERSION" | cut -d. -f1) MINOR=$(echo "$VERSION" | cut -d. -f2) PATCH=$(echo "$VERSION" | cut -d. -f3) NEXT_PATCH=$((PATCH + 1)) NEXT_VERSION="$MAJOR.$MINOR.$NEXT_PATCH-SNAPSHOT" echo "Next version: $NEXT_VERSION" mvn versions:set -DnewVersion="$NEXT_VERSION" mvn versions:commit git config user.name "forgejo-actions" git config user.email "ci@forgejo.local" git commit -am "Start next development cycle $NEXT_VERSION" git push origin master # ## ## # ##################################################################