Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

最近私の中でGitHubについて理解を深めようキャンペーンが開催されています。
というわけで今回はGitHubのRelease機能について触ってみることにしました。

前回のGitHubの記事はこちら

この記事はTDCソフト株式会社Advent Calendarの8日目です。

GitHub Releaseってなんだ?

GitHub上でライブラリやソフトウェアのリリースを管理できる機能のこと。
Gitのタグに紐づいて管理・作成されます。

リポジトリの赤枠部分に載ってるやつですね。
image.png

リリースのリンクを押下すると、リリースノートが表示されるほか、ソースコードやリリースされたソフトウェアといったアセットのダウンロードが出来たりします。
image.png

※画像はTypeScriptのGitHubリポジトリ

リリースを作ってみよう

適当なリポジトリを開き、Create a new releaseを押下してみます。
image.png

既存のタグor新規タグに紐づけてリリースを作成できます。
リリースノートやソースコード以外に紐づけたいアセットなんかを指定してあげるだけっぽいですね。
image.png

Publish releaseを押したらリリースの作成が完了です。
とっても簡単ですね。
image.png

リリースノートのカスタマイズ

さて、リリースを作成するまではできましたがこのままでは味気ないのでリリースノートをカスタマイズしてみましょう。

リポジトリに.github/release.ymlファイルを追加することでリリースノートを自動生成することが出来ます。

公式docからコピペしてきたrelease.yml

.github/release.yml
changelog:
  exclude:
    labels:
      - ignore-for-release
    authors:
      - octocat
  categories:
    - title: Breaking Changes 🛠
      labels:
        - Semver-Major
        - breaking-change
    - title: Exciting New Features 🎉
      labels:
        - Semver-Minor
        - enhancement
    - title: Other Changes
      labels:
        - "*"

exclude

リリースノートから排除したいラベルやユーザを指定します。
今回はignore-for-releaseというラベルの付いたPRやoctocatユーザのPRをリリースノートに載せる情報から除外しています。

categories

リリースノートに載せる変更情報のカテゴリを指定します。
今回はメジャーリリース、マイナーリリース、その他のリリースの3つのカテゴリを設定しています。

どんな感じ?

release.ymlを追加し、適当にいくつかPRをマージした後にリリースを作成してみました。
image.png

PRのラベルに紐づいて変更内容を自動で記載してくれていますね。

自動化してみたい

ここで終わってもつまらないのでGitHubActionsを使って自動リリースを試してみましょう。

ワークフロー

必要最低限の要件として以下2点を満たすようとりあえず動かしたワークフローがこちらです。

  • タグが追加されたらリリースを作成する
  • アセットにビルドしたアーティファクトを追加する

※プロジェクトは前回用意したものを流用しています。

.github/workflows/create_release.yml
name: Release
run-name: release

# タグがプッシュされたら実行する
on: 
  push:
    tags:
      - "v*"

jobs:
  release:
    runs-on: ubuntu-latest

    steps:
      # リポジトリをチェックアウトする
      - name: Checkout repository
        uses: actions/checkout@v4

      # Node.jsを使用する
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'

      # 依存関係をインストール
      - name: Install dependencies
        run: npm install -D

      # ビルドを実行
      - name: Run build
        run: npm run build

      # 1つ前のタグを取得
      - name: Get Previous Tag
        id: get_pre_tag
        run: |
          PRE_TAG=$(git tag --sort=creatordate | tail -n 2 | head -n 1)
          echo "pre_tag=$PRE_TAG" >> $GITHUB_OUTPUT
          echo "previous_tag: $PRE_TAG"
      
      # 前回リリースからの差分をもとに、変更点を取得する
      - name: Generate Release Note
        id: generate_release_note
        run: |
          echo "$(
          curl -X POST \
            -H 'Accept: application/vnd.github.v3+json' \
            -H 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' \
            https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
            -d '{
              "tag_name": "${{ github.ref_name }}",
              "previous_tag_name": "${{ steps.get_pre_tag.outputs.pre_tag }}",
              "target_commitish": "main"
            }' | jq .body | sed 's/\\"//g' | sed 's/["“]//g' | sed 's/\\n/\n/g'
          )" >> RELEASE_NOTE

      # リリースを作成
      - name: Create GitHub Release
        id: create_release
        uses: actions/create-release@v1.1.4
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref_name }}
          release_name: Release ${{ github.ref_name }}
          body_path: ./RELEASE_NOTE
          draft: false
          prerelease: false

      # 出力ファイルを圧縮
      - name: Compress bundle
        run: |
          mkdir -p artifacts
          zip -r artifacts/build.zip dist/

      # アセットをアップロード
      - name: Upload release Asset
        uses: actions/upload-release-asset@v1.0.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./artifacts/build.zip
          asset_name: build.zip
          asset_content_type: application/zip

リリースノート作成

# 前回リリースからの差分をもとに、変更点を取得する
- name: Generate Release Note
  id: generate_release_note
  run: |
    echo "$(
    curl -X POST \
      -H 'Accept: application/vnd.github.v3+json' \
      -H 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' \
      https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
      -d '{
        "tag_name": "${{ github.ref_name }}",
        "previous_tag_name": "${{ steps.get_pre_tag.outputs.pre_tag }}",
        "target_commitish": "main"
      }' | jq .body | sed 's/\\"//g' | sed 's/["“]//g' | sed 's/\\n/\n/g'
    )" >> RELEASE_NOTE

GitHub APIを利用して1つ前のタグとの差分リリースノートを生成・出力しています。

リリースの作成

# リリースを作成
- name: Create GitHub Release
  id: create_release
  uses: actions/create-release@v1.1.4
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  with:
    tag_name: ${{ github.ref_name }}
    release_name: Release ${{ github.ref_name }}
    body_path: ./RELEASE_NOTE
    draft: false
    prerelease: false

actions/create-releaseというアクションを使用し、リリースの作成を行っています。
タグ名・リリース名はシンプルにpushされたタグ名をそのまま使用しています。

アセットの配置

# 出力ファイルを圧縮
- name: Compress bundle
  run: |
    mkdir -p artifacts
    zip -r artifacts/build.zip dist/

# アセットをアップロード
- name: Upload release Asset
  uses: actions/upload-release-asset@v1.0.1
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  with:
    upload_url: ${{ steps.create_release.outputs.upload_url }}
    asset_path: ./artifacts/build.zip
    asset_name: build.zip
    asset_content_type: application/zip

actions/upload-release-assetアクションを利用しリリースに紐づくアセットを配置しています。
upload_urlにはリリースの作成時に出力されたアセットのアップロード用URLを指定しています。

actions/create-releaseactions/upload-release-assetは共に廃止が予定されているset-outputコマンドを使用しているため、実行時にアラートが出ます。

今回はお試しなので簡易なものを使用しましたが、実際に運用するには別のアクションを利用するなりした方がよさそうです。
↓アラートの様子
image.png

動かしてみよう

ワークフローを作ったところで適当にいくつかPRをマージし、タグを追加してみます。

git tag v2.0.0
git push origin v2.0.0

ワークフローが動きだしました。(ワークフローの数に試行回数が現れている)
image.png

リリースが作成され、前バージョンとの差分も記載されているほか、アセットにもbuild.zipが配置されています。
これでタグの追加に応じて自動でリリースを作成するワークフローができました。
image.png

おわりに

今回はGitHub Releaseとは何ぞやというところから実際にどうやって使うんだろう?の入門編という形でやってきましたが、前回学んだGitHubActionsと合わせてそれっぽい学びができたのではないかと思います。

まだまだ私の知らないGitHubの機能はたくさんあるので今後もGitHubについて理解を深めようキャンペーンを継続していきたいですね。

参考

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar 🎅

Some calendars come with gifts and some gifts are drawn from all calendars 👀

Please tie the article to your calendar and let's enjoy Christmas together!

10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?