Github actionsで自動でCLIツールのバージョニング切ってバイナリを添付したい

> :warning:
> バージョンはツール自体のバージョンではなくて、github上で発番するバージョンです。

# Github Actionsってなに？

pushなどをフックしていろんなworkflowを組める、Github謹製のCI/CD的なものです。

詳しくは公式の説明をどうぞ
https://github.co.jp/features/actions

# workflow

実際のworkflowのファイルです。
今回はGoのバイナリファイルを作成するという体で書いています。
流れは同じなので他の言語でも同じように組めばできるはずです。

※ Mac用しか書いてないですが、matrix追加したら複数OSの対応も可能です。

## 自動バージョニング版

注意：

- checkout@v2からfetchしないとタグとか取れないようなので、直後にfetchしています
- goreleaser-actionはバージョン指定さえすれば、勝手にリリースとか切ってくれそうですが、自動採番でよしなにやろうとしたときに細かい調整ができるように前回のタグを取得して、インクリメントする形をとっています。
  - github-action-get-previous-tagは、最新タグを取得して、タグをそのまま渡すだけでなく、splitして一部分だけ取得できたりもするので、細かい制御に使えます
  - increment-semantic-versionは、version-fragmentでバージョンのどこをインクリメントするか指定できるので便利です
  - ただ、両方ともセマンティックバージョンのプレフィックスに対応してなさそうなので、そこは注意です。
     - 普通のパッケージとかだったgoreleaser-actionだけのほうがいいかもしれないです
     - 今回はCLIなので、他から参照されることを考慮してないため、こちらを採用しています

```yaml:merge-master.yml
on:
  push:
    branches:
      - master
name: create release information
jobs:
  versioning:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Unshallow
        run: git fetch --prune --unshallow
      - name: Get Previous tag
        id: previoustag
        uses: "WyriHaximus/github-action-get-previous-tag@master"
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
      - name: Bump release version
        id: bump_version
        uses: christian-draeger/increment-semantic-version@1.0.1
        with:
          current-version: ${{ steps.previoustag.outputs.tag }}
          version-fragment: 'feature'
      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.bump_version.outputs.next-version }}
          release_name: ${{ steps.bump_version.outputs.next-version }}
          draft: false
          prerelease: false
  releases:
    name: Release Go Binary
    needs: versioning
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - macOS-latest
        version:
          - latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Unshallow
        run: git fetch --prune --unshallow
      - name: Set up Go
        uses: actions/setup-go@v1
        with:
          go-version: 1.14.x
      - name: GoReleaser
        uses: goreleaser/goreleaser-action@v1
        with:
          version: ${{ matrix.version }}
          args: release --rm-dist
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
```

## 手動でリリース作った場合

別のバージョンで切り直したいとか、そういうケース用に手動でリリース作ったときのも用意しておきます。

```yaml:release.yml
on:
  release:
    types: [published]
name: Build
jobs:
  releases:
    name: Release Go Binary
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - macOS-latest
        version:
          - latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Unshallow
        run: git fetch --prune --unshallow
      - name: Set up Go
        uses: actions/setup-go@v1
        with:
          go-version: 1.14.x
      - name: GoReleaser
        uses: goreleaser/goreleaser-action@v1
        with:
          version: ${{ matrix.version }}
          args: release --rm-dist
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
```