Skip to content

Commit

Permalink
Windows用実行バイナリの自動ビルド (#219) (#264)
Browse files Browse the repository at this point in the history
* add VOICEVOX_ENGINE_DIR env for electron-builder

* add linux electron-builder config

* add workflow

* pack VOICEVOX ENGINE

* fix workflow

* rm engine archive to free space

* name steps

* show disk space

* update voicevox engine run path for linux

* revert linux diff

* remove original engine after artifact build

* env check; empty string or undefined

* fail-fast false

* upload win unpacked

* stage build

* prepackaged

* fix prepackage

* add disk space disp

* merge nsis-web artifact

* engine-prepackage

* upload to release

* fix dir

* fix merge condition

* rename job; distributable

* fix engine copy

* fix matrix var name

* fix step name

* fix matrix var ref

* add fixme note to rename before upload to asset

* disable cpu build

* enable cpu engine prepackage

* build distributable only on release

* build on push master

* fix commented step name

* build on push main

* revert removeOriginalEngine diff

* temporary use Hiroshiba/voicevox_engine check-2021-09-25

* use env to define voicevox engine repo/ver

* use env directly (env cannot be used in matrix)

* add noengine-prepackage name and path in matrix

* impl upload-distributable-to-release

* generate public/licenses.json

* ci licenses.json

* mkdir

* engine

* Update build.yml

* npm ci

* license: use packageName if name is undefined

* revert packageName substitution

* skip uploading to release

* parentheses

* add comment

* env SKIP_UPLOADING_RELEASE_ASSET

* commonize os matrix

* fix env usage

* add note about VOICEVOX ENGINE cache

* use .node_version for Node Setup in engine prepackaging

* cahce version env

* use shell bash
  • Loading branch information
aoirint authored Sep 29, 2021
1 parent a862577 commit 99a7804
Showing 1 changed file with 390 additions and 0 deletions.
390 changes: 390 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,390 @@

name: build
on:
push:
branches:
- main
release:
types:
- created

env:
VOICEVOX_ENGINE_REPO_URL: "https://github.com/aoirint/voicevox_engine"
VOICEVOX_ENGINE_VERSION: 0.6.0-aoirint-1

# FIXME: implement build with production resources in Hiroshiba/voicevox
# Temporarily, skip uploading to GitHub Release (use Artifact instead)
SKIP_UPLOADING_RELEASE_ASSET: 1

jobs:
build-noengine-prepackage:
env:
CYPRESS_CACHE_FOLDER: ~/.npm/cypress_cache
ELECTRON_CACHE: .cache/electron
ELECTRON_BUILDER_CACHE: .cache/electron-builder
cache-version: v2
strategy:
fail-fast: false
matrix:
artifact_name:
- windows-noengine-prepackage
include:
- artifact_name: windows-noengine-prepackage
artifact_path: dist_electron/win-unpacked
os: windows-2019

runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@master

- name: Set output Node version
id: node-version
shell: bash
run: echo "::set-output name=NODE_VERSION::$(cat .node-version)"

- name: Setup Node
uses: actions/setup-node@master
with:
node-version: "${{ steps.node-version.outputs.NODE_VERSION }}"

- name: Cache Node packages
uses: actions/cache@master
with:
path: ~/.npm
key: ${{ env.cache-version }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.cache-version }}-node-
- name: Cache Electron
uses: actions/cache@master
with:
path: ${{ env.ELECTRON_CACHE }}
key: ${{ env.cache-version }}-${{ runner.os }}--electron-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.cache-version }}-${{ runner.os }}--electron-cache-
- name: Cache Electron-Builder
uses: actions/cache@master
with:
path: ${{ env.ELECTRON_BUILDER_CACHE }}
key: ${{ env.cache-version }}-${{ runner.os }}--electron-builder-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.cache-version }}-${{ runner.os }}--electron-builder-cache-
- name: Install dependencies
shell: bash
run: npm ci

- name: Generate public/licenses.json
shell: bash
run: npm run license:generate -- -o public/licenses.json

- name: Show disk space (debug info)
shell: bash
run: |
df -h
# Build result will be exported to ${{ matrix.artifact_path }}
- name: Build Electron
shell: bash
run: npm run electron:build_pnever -- --dir

- name: Upload NoEngine Prepackage
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.artifact_name }}
path: |
${{ matrix.artifact_path }}
build-engine-prepackage:
env:
cache-version: v2

needs: [build-noengine-prepackage]
strategy:
fail-fast: false
matrix:
# FIXME: env cannot be referenced in matrix
# voicevox_engine_repo_url:
# - ${{ env.VOICEVOX_ENGINE_REPO_URL }}
# voicevox_engine_version:
# - ${{ env.VOICEVOX_ENGINE_VERSION }}
os: [ubuntu-18.04]
artifact_name:
- windows-cpu-prepackage
- windows-nvidia-prepackage
include:
- artifact_name: windows-cpu-prepackage
noengine_artifact_name: windows-noengine-prepackage
voicevox_engine_asset_name: windows-cpu
- artifact_name: windows-nvidia-prepackage
noengine_artifact_name: windows-noengine-prepackage
voicevox_engine_asset_name: windows-nvidia

runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@master

- name: Set output Node version
id: node-version
shell: bash
run: echo "::set-output name=NODE_VERSION::$(cat .node-version)"

- name: Setup Node
uses: actions/setup-node@master
with:
node-version: "${{ steps.node-version.outputs.NODE_VERSION }}"

- name: Cache Node packages
uses: actions/cache@master
with:
path: ~/.npm
key: ${{ env.cache-version }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.cache-version }}-node-
- name: Install asar
shell: bash
run: npm install -g asar

- name: Install dependencies
shell: bash
run: npm ci

- name: Show disk space (debug info)
shell: bash
run: |
df -h
- name: Download and extract noengine-prepackage artifact
uses: actions/download-artifact@v2
with:
name: ${{ matrix.noengine_artifact_name }}
path: ./prepackage

# Download VOICEVOX ENGINE
- name: Create directory voicevox_engine/download
shell: bash
run: |
mkdir -p voicevox_engine/download
# NOTE: VOICEVOX ENGINE should not be cached since it has a size of several GB
# and actions/cache has a limit of 5GB per repository.
# https://github.com/actions/cache#cache-limits
# - name: Dump VOICEVOX ENGINE repo URL to calc hash
# shell: bash
# run: |
# echo "${{ env.VOICEVOX_ENGINE_REPO_URL }}" > voicevox_engine/repo_url.txt
# - name: Cache VOICEVOX ENGINE
# uses: actions/cache@master
# id: voicevox-engine-cache
# with:
# path: voicevox_engine/download
# key: ${{ env.cache-version }}-voicevox-engine-${{ hashFiles('voicevox_engine/repo_url.txt') }}-${{ env.VOICEVOX_ENGINE_VERSION }}

- name: Download VOICEVOX ENGINE
# if: steps.voicevox-engine-cache.outputs.cache-hit != 'true'
shell: bash
env:
VOICEVOX_ENGINE_RELEASE_URL: ${{ env.VOICEVOX_ENGINE_REPO_URL }}/releases/download/${{ env.VOICEVOX_ENGINE_VERSION }}
run: |
curl -L -o "voicevox_engine/download/list.txt" "${{ env.VOICEVOX_ENGINE_RELEASE_URL }}/${{ matrix.voicevox_engine_asset_name }}.7z.txt"
cat "voicevox_engine/download/list.txt" | xargs -I '%' curl -L -o "voicevox_engine/download/%" "${{ env.VOICEVOX_ENGINE_RELEASE_URL }}/%"
- name: Extract VOICEVOX ENGINE
shell: bash
run: |
mkdir -p voicevox_engine/tmp
# Extract first file to extract all parts
# Destination: voicevox_engine/tmp/${{ matrix.voicevox_engine_asset_name }}/
7z x "voicevox_engine/download/$(cat voicevox_engine/download/list.txt | head -n1)" -ovoicevox_engine/tmp/
mkdir -p voicevox_engine/voicevox_engine
mv voicevox_engine/tmp/${{ matrix.voicevox_engine_asset_name }}/* voicevox_engine/voicevox_engine
# remove downloads to free space
rm -rf voicevox_engine/download voicevox_engine/tmp
- name: Merge licenses.json (ENGINE, VOICEVOX)
shell: bash
run: |
# Unpack asar
asar extract prepackage/resources/app.asar prepackage/resources/app
rm prepackage/resources/app.asar
mv voicevox_engine/voicevox_engine/licenses.json engine_licenses.json
npm run license:merge -- -o prepackage/resources/app/licenses.json -i engine_licenses.json -i prepackage/resources/app/licenses.json
# Repack asar
asar pack prepackage/resources/app prepackage/resources/app.asar
rm -rf prepackage/resources/app
- name: Merge VOICEVOX ENGINE into prepackage/
shell: bash
run: |
mv voicevox_engine/voicevox_engine/* prepackage/
rm -rf voicevox_engine
- name: Show disk space (debug info)
shell: bash
run: |
df -h
- name: Upload prepackage artifact
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.artifact_name }}
path: |
prepackage/
build-distributable:
if: github.event.release.tag_name != '' # If release
needs: [build-engine-prepackage]
env:
CYPRESS_CACHE_FOLDER: ~/.npm/cypress_cache
ELECTRON_CACHE: .cache/electron
ELECTRON_BUILDER_CACHE: .cache/electron-builder
cache-version: v2
strategy:
fail-fast: false
matrix:
artifact_name:
# - windows-cpu-nsis-web
- windows-nvidia-nsis-web
include:
# - artifact_name: windows-cpu-nsis-web
# engine_artifact_name: windows-cpu-prepackage
# os: windows-2019
- artifact_name: windows-nvidia-nsis-web
engine_artifact_name: windows-nvidia-prepackage
os: windows-2019

runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@master

- name: Download and extract engine-prepackage artifact
uses: actions/download-artifact@v2
with:
name: ${{ matrix.engine_artifact_name }}
path: ./prepackage

- name: Show disk space (debug info)
shell: bash
run: |
df -h
- name: Set output Node version
id: node-version
shell: bash
run: echo "::set-output name=NODE_VERSION::$(cat .node-version)"

- name: Setup Node
uses: actions/setup-node@master
with:
node-version: "${{ steps.node-version.outputs.NODE_VERSION }}"

- name: Cache Node packages
uses: actions/cache@master
with:
path: ~/.npm
key: ${{ env.cache-version }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.cache-version }}-node-
- name: Cache Electron
uses: actions/cache@master
with:
path: ${{ env.ELECTRON_CACHE }}
key: ${{ env.cache-version }}-${{ runner.os }}--electron-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.cache-version }}-${{ runner.os }}--electron-cache-
- name: Cache Electron-Builder
uses: actions/cache@master
with:
path: ${{ env.ELECTRON_BUILDER_CACHE }}
key: ${{ env.cache-version }}-${{ runner.os }}--electron-builder-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ env.cache-version }}-${{ runner.os }}--electron-builder-cache-
- name: Install dependencies
shell: bash
run: npm ci

- name: Show disk space (debug info)
shell: bash
run: |
df -h
# NOTE: prepackage can be removed before splitting nsis-web archive
- name: Build Electron
shell: bash
run: npm run electron:build_pnever -- --prepackaged "prepackage/"

- name: Show disk space (debug info)
shell: bash
run: |
df -h
- name: Upload Windows NSIS Web artifact
if: endsWith(matrix.artifact_name, '-nsis-web')
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.artifact_name }}
path: |
dist_electron/nsis-web/out/*.7z.*
dist_electron/nsis-web/*.exe
upload-distributable-to-release:
if: github.event.release.tag_name != '' # If release
needs: [build-distributable]
strategy:
fail-fast: false
matrix:
os: [ubuntu-18.04]
artifact_name:
# - windows-cpu-nsis-web
- windows-nvidia-nsis-web
include:
# - artifact_name: windows-cpu-nsis-web
- artifact_name: windows-nvidia-nsis-web

runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@master

- name: Download and extract distributable artifact
uses: actions/download-artifact@v2
with:
name: ${{ matrix.artifact_name }}
path: ./artifact

- name: Show disk space (debug info)
shell: bash
run: |
df -h
# Windows NSIS Web
# FIXME: rename archives and installer before upload to separate cpu, gpu distribution
- name: Upload Windows nsis-web archives to Release assets
if: env.SKIP_UPLOADING_RELEASE_ASSET != '1' && endsWith(matrix.artifact_name, '-nsis-web')
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ github.ref }} # == github.event.release.tag_name
file_glob: true
file: artifact/out/*.7z.*

- name: Upload Windows nsis-web installer to Release assets
if: env.SKIP_UPLOADING_RELEASE_ASSET != '1' && endsWith(matrix.artifact_name, '-nsis-web')
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ github.ref }} # == github.event.release.tag_name
file_glob: true
file: artifact/*.exe

0 comments on commit 99a7804

Please sign in to comment.