GitHub Actions のリリースを自動化する

## はじめに

JavaScript版の GitHub Actions のリリース作業は真面目にやるととても面倒です。

1. ローカルで開発を行う
2. リリース用にビルドする
3. ビルドしたファイルや node_modules のような依存モジュールを含めて実行に必要なコードをリリース用ブランチにコミットする
4. タグを付与する（メジャー、マイナー、パッチバージョンを考慮）
5. GitHub に Push
6. リリース

しかし GitHub Actions を使用することでこれらの手順もある程度自動化できます。

## 対象
TypeScript または JavaScript による GitHub Actions 開発者

## Release GitHub Actions
[Release GitHub Actions](https://github.com/technote-space/release-github-actions) を使用することでリリース作業は以下のようになります。

1. ローカルで開発を行う
2. GitHub に変更を Push
3. リリース（タグを作成）
4. 自動化された手順が完了するのを待つ
    1. リリース用にビルドする
    2. ビルドしたファイルや node_modules のような依存モジュールを含めて実行に必要なコードをリリース用ブランチにコミットする
    3. タグを付与する（メジャー、マイナー、パッチバージョンを考慮）
    4. GitHub に Push

開発者が行うことは

- GitHub Actions の開発
- GitHub Releases からリリース または タグをPush

だけになります。

## 使用方法
以下のような workflow を設定するだけです。

```yaml:.github/workflows/release.yml
on: create

name: Release
jobs:
  release:
    name: Release GitHub Actions
    runs-on: ubuntu-latest
    steps:
      - name: Release GitHub Actions
        uses: technote-space/release-github-actions@v2
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

## 詳細
### ビルド
`BUILD_COMMAND` オプションでビルドに使用するコマンドを指定します。
デフォルトではこの値は空で、その場合は以下の手順でコマンドが生成されます。

 - `package.json` の scripts に `build`、`production`、`prod` または `package` が含まれている場合、ビルド用コマンドとしてそれが使用されます。（`BUILD_COMMAND_TARGET`でコマンドの検索対象は変更可能です）
 - `npm run install` や `yarn install` のようなインストール用コマンドが存在しない場合、インストール用コマンドが追加されます。

したがって `BUILD_COMMAND` が設定されていない かつ package.json に `build` が存在する場合、以下のコマンドが実行されます。

```bash
yarn install
yarn build
yarn install --production
```

または

```bash
npm install
npm run build
rm -rdf node_modules
npm install --production
```

### ファイル削除
GitHub Actions の実行時には「ビルドに使用したソースコード」や「テストコード」、「テスト設定」などは不要です。
また GitHub Actions は Workflow で使用される際に毎回ダウンロードされるため、ファイルは少ないほうがよいです。

この目的のために `CLEAN_TARGETS` オプションが存在し、デフォルトは「TypeScriptのActionテンプレート」や「JavaScriptのActionテンプレート」の使用を想定した値になっています。

default: `.[!.]*,__tests__,src,*.js,*.ts,*.json,*.lock,_config.yml`

```bash
rm -rdf .[!.]*
rm -rdf *.js
rm -rdf *.ts
rm -rdf *.json
rm -rdf *.lock
rm -rdf __tests__ src '_config.yml'
```

https://github.com/actions/typescript-action
https://github.com/actions/javascript-action

不要なファイルが削除された状態の例
https://github.com/technote-space/release-github-actions/tree/gh-actions

## テスト用
タグ名は `v1.2.3` のような [Semantic Versioning](https://semver.org/) に従っている必要があり、このタグ名でタグを作成すると本番リリースされます。
`TEST_TAG_PREFIX` を使用することでテスト用ビルドを行うことが可能です。

`TEST_TAG_PREFIX: test/`
を設定した場合、`test/v1.2.3`でもアクションが起動し、`test/v1`、`test/v1.2`、`test/v1.2.3` のタグ指定でアクションが利用できます。
テスト用タグ または リリース用ブランチで利用する Workflow を用意しておけばリリース前に気軽に試せるようになります。

```yaml
uses: owner/repo@test/v1
# または
# uses: owner/repo@gh-actions
```

## CLI Tool
[![technote-space/release-github-actions-cli - GitHub](https://gh-card.dev/repos/technote-space/release-github-actions-cli.svg)](https://github.com/technote-space/release-github-actions-cli)

## その他
[指定可能なオプション](https://github.com/technote-space/release-github-actions/blob/master/README.ja.md#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)

### 実際に使用している例

- TOC Generator
 - [release.yml](https://github.com/technote-space/toc-generator/blob/master/.github/workflows/release.yml)
 - https://github.com/technote-space/toc-generator/actions?query=workflow%3ARelease