name: Release on: push: branches: [master] workflow_dispatch: permissions: contents: write packages: write id-token: write jobs: release: name: Release runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, '[skip ci]')" steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Install backend dependencies working-directory: ./backend run: npm ci - name: Lint run: npm run lint - name: Run tests run: npm run test:run - name: Run backend tests working-directory: ./backend run: npm test - name: Build run: npm run build - name: Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: npx semantic-release docker: name: Build & Push Docker Image runs-on: ubuntu-latest needs: release if: needs.release.result == 'success' steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get version id: version run: | VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "latest") echo "version=${VERSION#v}" >> $GITHUB_OUTPUT echo "tag=${VERSION}" >> $GITHUB_OUTPUT - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: | ${{ secrets.DOCKERHUB_USERNAME }}/cv-app:latest ${{ secrets.DOCKERHUB_USERNAME }}/cv-app:${{ steps.version.outputs.version }} ghcr.io/${{ github.repository_owner }}/cv-app:latest ghcr.io/${{ github.repository_owner }}/cv-app:${{ steps.version.outputs.version }} cache-from: type=gha cache-to: type=gha,mode=max