LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

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

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

今回使ったプロジェクトはここ

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タブを開きます。サンプルだとここ

image.png
こんな感じでチェック付いてたらOKです。うれしいね。

ビルドしたモノもタグと一緒にアップロードしてくれます。便利。サンプルだとここ

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
What you can do with signing up
2