JUCE6とGitHub Actionsを使ってお手軽CD

JUCE6からCMakeで何から何までできるようになったので、Projucerの依存関係を意識する必要がなくなりました。
これで地獄のようなyamlを書く作業から開放されたのでサクッとCD組んじゃいましょう。

[今回使ったプロジェクトはここ](https://github.com/SachiSakurane/JuceWithActions)

## GitHub Actionsとは
GitHub上のアクション(Pull requestsやタグ等)からトリガーして色々やってくれるヤツです。
Privateなリポジトリだと時間制限がありますが、Publicなリポジトリだと無料で使えます。
Windows、MacOS、Ubuntuといった主要なOSが全部使えるのもえらいですね。

今回はこれを使って、**新たにタグが付けられたコミットに対してAudioPluginをビルドするヤツを作る**ことを目標とします。

## JUCEをsubmoduleに追加する
JUCEが必要なので`git submodule`使ってリポジトリに追加します。

```
$ mkdir JuceWithActions
$ cd JuceWithActions
$ git init
$ git submodule add git@github.com:juce-framework/JUCE.git JUCE
```

## AudioPluginをつくる
動けばなんでもいいので、`JUCE/examples/CMake/AudioPlugin`ある物をそのまま使っちゃいましょう

```
$ cp -r JUCE/examples/CMake/AudioPlugin ./
```

## CMakeをかく
実はさっきの`JUCE/examples/CMake/AudioPlugin/CMakeLists.txt`にJUCE6でビルドするコードとその説明が書いてあります。
なので、詳しい解説はそちらに譲って、今回は`add_subdirectory`で利用します。

リポジトリ直下に`CMakeLists.txt`を作成しましょう。

``` CMakeLists.txt
cmake_minimum_required(VERSION 3.17)

project(JuceWithActions)

add_subdirectory(JUCE) # JUCEの追加も忘れずに
add_subdirectory(AudioPlugin)
```

これでプロジェクトの準備は完了なので手元でビルドしてみます。

```
$ cmake -B cmake-build
$ cmake --build cmake-build --target AudioPluginExample_All
```

## Actions向けのyamlをかく
`./github/workflows`下にyamlファイルを置くことで、どのアクションからトリガーして何するかまで指定できます。
まずは、ここまでをGithubにもコードを上げておきましょう。

OSX向けのworkflowを書いてみます。

``` deploy-osx.yaml
name: Deploy OSX

on:
  push:
    tags:
      - v*
      - o*

jobs:
  deploy-osx:
    env:
      BUILD_DIRECTORY: cmake-build
    runs-on: macOS-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          submodules: recursive

      - name: Install Ninja
        uses: seanmiddleditch/gha-setup-ninja@master

      - name: Build
        run: |
          cmake -B ${BUILD_DIRECTORY} -G Ninja -DCMAKE_BUILD_TYPE=Release
          ninja -C ${BUILD_DIRECTORY} AudioPluginExample_All -j 4

      - name: Packaging
        run: |
          chmod 755 bin/packaging.sh
          ./bin/packaging.sh osx "${BUILD_DIRECTORY}/AudioPlugin/AudioPluginExample_artefacts/Release" "AudioPluginExample"

      - name: Release
        uses: softprops/action-gh-release@master
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: pkg/*
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

ついでにパッケージングのフローも書いてしまいます。
`bin/packaging.sh`を作って…

``` packaging.sh
#!/bin/sh

# usage ./pachaging.sh PRODUCT_OS PRODUCT_PATH PROUCT_NAME

cd `dirname $0`
cd ../

mkdir pkg
PRODUCT_OS="$1"
PRODUCT_PATH="$2"
PROUCT_NAME="$3-$PRODUCT_OS"

mkdir -p "pkg/$PROUCT_NAME"
cp -r "$PRODUCT_PATH" "pkg/$PROUCT_NAME"
cd pkg
ls | xargs -t -I FILE_NAME zip -r FILE_NAME.zip FILE_NAME
ls | grep -v -E ".zip$" | xargs rm -r
cd ../
```

これらもpushします。

`v*`のタグが打たれた時にトリガーするようになったので、早速タグを付けてみます。

```
git tag v0
git push origin tag
```

Githubに移動してActionsタブを開きます。[サンプルだとここ](https://github.com/SachiSakurane/JuceWithActions/actions)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849691/9a7a7bab-3b3d-5bca-da7f-ab1545b9f471.png)
こんな感じでチェック付いてたらOKです。うれしいね。

ビルドしたモノもタグと一緒にアップロードしてくれます。便利。[サンプルだとここ](https://github.com/SachiSakurane/JuceWithActions/releases/tag/v3)