Automatizar la creación de releases con GitHub Actions

Estos días he estado jugando a automatizar unos despliegues donde necesitaba que el proceso de generación de la release fuera GitHub Actions quien lo hiciera por mí. En este artículo te comparto el flujo que he utilizado, el cuál solo tienes que modificar ligeramente dependiendo del lenguaje, por si a ti también te ayuda.

Flujo de generación de releases con GitHub Actions

Normalmente una release parte de una nueva etiqueta generada con cierto formato, como por ejemplo SemVer. En base a este lanzo el siguiente flujo:

name: Generate Angular release
on:
  push:
    tags:
      - "[0-9]+.[0-9]+.[0-9]+*" 
env:
  NODE_VERSION: 18.x
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ env.NODE_VERSION }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: "npm"
      - run: npm ci
      - run: npm run build --if-present
      - name: Zip dist
        run: cd dist/angular-tour-of-heroes ; zip -r ../../dist.zip . * ; cd ../../
      - name: Check package version
        uses: technote-space/package-version-check-action@v1
      - name: Build changelog
        id: build_changelog
        uses: mikepenz/release-changelog-builder-action@main
        with:
          configuration: "release-changelog-builder-config.json"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Create Release
        id: create_release
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body: ${{steps.build_changelog.outputs.changelog}}
          draft: false
          prerelease: false
      - name: Upload Release Asset
        id: upload-release-asset 
        uses: actions/upload-release-asset@v1
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./dist.zip
          asset_name: "dist.zip"
          asset_content_type: application/zip

En este caso es un ejemplo con un proyecto en Node.js (Angular de hecho), pero en el caso de .NET sería bastante similar:

name: Generate .NET release
on:
  push:
    tags:
      - "[0-9]+.[0-9]+.[0-9]+*" 
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: dotnet restore
      - run: dotnet build --configuration Release
      - run: ls -la
      - name: Zip dist
        run: cd bin/Release/net7.0/ ; zip -r ../../../drop.zip . * ; cd ../../../
      - name: Check package version
        uses: technote-space/package-version-check-action@v1
      - name: Build changelog
        id: build_changelog
        uses: mikepenz/release-changelog-builder-action@main
        with:
          configuration: "release-changelog-builder-config.json"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Create Release
        id: create_release
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Release ${{ github.ref }}
          body: ${{steps.build_changelog.outputs.changelog}}
          draft: false
          prerelease: false
      - name: Upload Release Asset
        id: upload-release-asset 
        uses: actions/upload-release-asset@v1
        env:
            GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./drop.zip
          asset_name: "drop.zip"
          asset_content_type: application/zip

¡Saludos!