diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index cd48527..b64aaa4 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -10,8 +10,9 @@ env: IMAGE_NAME: euchre-camp jobs: - build-and-test: + release: runs-on: ubuntu-latest + # Skip if this is an auto-generated version bump commit if: "!contains(github.event.head_commit.message, 'chore: bump version')" steps: @@ -19,14 +20,75 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + token: ${{ secrets.GITEA_TOKEN || github.token }} - - name: Get current version + - name: Configure Git + run: | + git config user.name "Gitea Actions" + git config user.email "actions@gitea.com" + + - name: Determine version bump type + id: bump_type + run: | + # Get the merge commit message or use commits since last tag + MERGE_MSG="${{ github.event.head_commit.message }}" + echo "Commit message: $MERGE_MSG" + + # Determine bump type from commit message or commits + if echo "$MERGE_MSG" | grep -qE "(BREAKING CHANGE|!:)"; then + echo "bump=major" >> $GITHUB_OUTPUT + echo "Bump type: major (breaking change detected)" + elif echo "$MERGE_MSG" | grep -qE "^feat"; then + echo "bump=minor" >> $GITHUB_OUTPUT + echo "Bump type: minor (feature detected)" + else + # Check actual commits in the PR + LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + if [ -n "$LAST_TAG" ]; then + COMMITS=$(git log --oneline ${LAST_TAG}..HEAD 2>/dev/null | head -5) + else + COMMITS=$(git log --oneline | head -5) + fi + echo "Recent commits: $COMMITS" + + if echo "$COMMITS" | grep -qE "BREAKING\|!:"; then + echo "bump=major" >> $GITHUB_OUTPUT + echo "Bump type: major (breaking change in commits)" + elif echo "$COMMITS" | grep -qE "^feat"; then + echo "bump=minor" >> $GITHUB_OUTPUT + echo "Bump type: minor (feature in commits)" + else + echo "bump=patch" >> $GITHUB_OUTPUT + echo "Bump type: patch (default)" + fi + fi + + - name: Bump version id: version run: | - # Read version from package.json - CURRENT_VERSION=$(node -p "require('./package.json').version") - echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT - echo "Current version: $CURRENT_VERSION" + BUMP="${{ steps.bump_type.outputs.bump }}" + echo "Bumping version: $BUMP" + + # Run the bump script + node scripts/bump-version.js "$BUMP" --yes + + # Get new version + NEW_VERSION=$(node -p "require('./package.json').version") + echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT + echo "New version: $NEW_VERSION" + + - name: Commit version bump + run: | + git add package.json CHANGELOG.md + git commit -m "chore: bump version to v${{ steps.version.outputs.new_version }}" + git push origin main + + - name: Create git tag for release + run: | + TAG_NAME="v${{ steps.version.outputs.new_version }}" + echo "Creating tag $TAG_NAME" + git tag -a "$TAG_NAME" -m "Release $TAG_NAME" + git push origin "$TAG_NAME" - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -36,14 +98,14 @@ jobs: docker build \ --target test-runner \ --build-arg GIT_COMMIT=${{ github.sha }} \ - -t ${{ env.IMAGE_NAME }}-test:${{ steps.version.outputs.version }} \ + -t ${{ env.IMAGE_NAME }}-test:${{ steps.version.outputs.new_version }} \ . - name: Run tests inside test-capable container run: | docker run --rm \ -e DATABASE_URL="postgresql://user:pass@localhost:5432/dummy" \ - ${{ env.IMAGE_NAME }}-test:${{ steps.version.outputs.version }} \ + ${{ env.IMAGE_NAME }}-test:${{ steps.version.outputs.new_version }} \ npm run test:run - name: Build production image @@ -51,53 +113,35 @@ jobs: docker build \ --target runner \ --build-arg GIT_COMMIT=${{ github.sha }} \ - -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }} \ + -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.new_version }} \ -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest \ . - - name: Configure Git - run: | - git config user.name "Gitea Actions" - git config user.email "actions@gitea.com" - - - name: Create git tag for release - run: | - TAG_NAME="v${{ steps.version.outputs.version }}" - # Check if tag already exists - if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then - echo "Tag $TAG_NAME already exists, skipping creation" - else - echo "Creating tag $TAG_NAME" - git tag -a "$TAG_NAME" -m "Release $TAG_NAME" - fi - # Always try to push (in case tag exists locally but not remotely) - git push origin "$TAG_NAME" || echo "Tag push failed (may already exist remotely)" - - name: Push Docker images run: | echo "Pushing to ${{ env.REGISTRY }}..." # Check if we can authenticate to the registry using DOCKER_LOGIN and DOCKER_PASSWORD secrets if [ -n "${{ secrets.DOCKER_LOGIN }}" ] && [ -n "${{ secrets.DOCKER_PASSWORD }}" ]; then if docker login ${{ env.REGISTRY }} -u ${{ secrets.DOCKER_LOGIN }} -p ${{ secrets.DOCKER_PASSWORD }} 2>/dev/null; then - docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }} + docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.new_version }} docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest echo "Successfully pushed images to ${{ env.REGISTRY }}" else echo "Warning: Docker login failed with provided credentials" echo "Images built locally but not pushed to registry" echo "Manual push required:" - echo " docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}" + echo " docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.new_version }}" echo " docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" fi else echo "Warning: DOCKER_LOGIN or DOCKER_PASSWORD secrets not configured" echo "Images built locally but not pushed to registry" echo "Manual push required:" - echo " docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}" + echo " docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.new_version }}" echo " docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" fi - name: Deploy to dev (placeholder) run: | - echo "Deploying version ${{ steps.version.outputs.version }} to dev environment..." + echo "Deploying version ${{ steps.version.outputs.new_version }} to dev environment..." # TODO: Add actual deployment steps