name: Release on: push: tags: - "v*.*.*" concurrency: group: release-${{ github.ref }} cancel-in-progress: false env: DOCKER_IMAGE_NAME: openmonetis permissions: contents: read jobs: quality: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v5 - name: Validate release version shell: bash run: | TAG_VERSION="${GITHUB_REF_NAME#v}" PACKAGE_VERSION="$(jq -r '.version' package.json)" if [[ ! "$TAG_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "A tag $GITHUB_REF_NAME não segue o formato vX.Y.Z." exit 1 fi if [[ "$TAG_VERSION" != "$PACKAGE_VERSION" ]]; then echo "A tag $GITHUB_REF_NAME não corresponde à versão $PACKAGE_VERSION do package.json." exit 1 fi if ! grep -Fq "## [$TAG_VERSION]" CHANGELOG.md; then echo "A versão $TAG_VERSION não foi encontrada no CHANGELOG.md." exit 1 fi - name: Setup pnpm uses: pnpm/action-setup@v4 - name: Setup Node.js uses: actions/setup-node@v5 with: node-version: 22 cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Generate Next.js types run: pnpm exec next typegen - name: Typecheck run: pnpm exec tsc --noEmit - name: Lint run: pnpm run lint docker: runs-on: ubuntu-latest needs: quality steps: - name: Checkout repository uses: actions/checkout@v5 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract Docker metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ secrets.DOCKER_USERNAME }}/${{ env.DOCKER_IMAGE_NAME }} tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=raw,value=latest - name: Build and push Docker image id: build uses: docker/build-push-action@v5 with: context: . file: ./Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max platforms: linux/amd64,linux/arm64 - name: Image digest run: echo "${{ steps.build.outputs.digest }}" github-release: runs-on: ubuntu-latest needs: docker permissions: contents: write steps: - name: Checkout repository uses: actions/checkout@v5 - name: Extract changelog for this version id: changelog shell: bash run: | VERSION="${GITHUB_REF_NAME#v}" NOTES=$(awk -v version="$VERSION" ' index($0, "## [" version "]") == 1 { found=1; next } found && /^## \[/ { exit } found && !started && /^[[:space:]]*$/ { next } found { started=1; print } ' CHANGELOG.md) if [[ -z "$NOTES" ]]; then echo "Não foi possível extrair as notas da versão $VERSION." exit 1 fi { echo "notes<> "$GITHUB_OUTPUT" - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ github.ref_name }} name: ${{ github.ref_name }} body: ${{ steps.changelog.outputs.notes }} draft: false prerelease: false