Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 13 additions & 21 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,9 @@ jobs:
package_name: voicevox
compressed_artifact_name: voicevox-linux-nvidia
app_asar_dir: prepackage/resources
installer_artifact_name: linux-nvidia-appimage
installer_artifact_name: voicevox-linux-nvidia-appimage
linux_artifact_name: "VOICEVOX.${ext}"
linux_executable_name: voicevox
linux_appimage_7z_name: VOICEVOX.AppImage
os: ubuntu-22.04
# Linux CPU (x64)
- artifact_name: linux-cpu-x64-prepackage
Expand All @@ -68,10 +67,9 @@ jobs:
package_name: voicevox-cpu
compressed_artifact_name: voicevox-linux-cpu-x64
app_asar_dir: prepackage/resources
installer_artifact_name: linux-cpu-x64-appimage
installer_artifact_name: voicevox-linux-cpu-x64-appimage
linux_artifact_name: "VOICEVOX.${version}-x64.${ext}"
linux_executable_name: voicevox
linux_appimage_7z_name: VOICEVOX-CPU-X64.AppImage
os: ubuntu-22.04
# Linux CPU (arm64)
- artifact_name: linux-cpu-arm64-prepackage
Expand All @@ -80,10 +78,9 @@ jobs:
package_name: voicevox-cpu
compressed_artifact_name: voicevox-linux-cpu-arm64
app_asar_dir: prepackage/resources
installer_artifact_name: linux-cpu-arm64-appimage
installer_artifact_name: voicevox-linux-cpu-arm64-appimage
linux_artifact_name: "VOICEVOX.${version}-arm64.${ext}"
linux_executable_name: voicevox
linux_appimage_7z_name: VOICEVOX-CPU-ARM64.AppImage
os: ubuntu-22.04-arm
# Windows CUDA
- artifact_name: windows-nvidia-prepackage
Expand Down Expand Up @@ -452,29 +449,24 @@ jobs:
cd dist_electron/

for appImageFile in *.AppImage; do
echo "Splitting ${appImageFile}"
echo "Splitting ${appImageFile} to .AppImage.{1,2,...}"

# Split to MyArtifact.AppImage.7z.001, MyArtifact.AppImage.7z.002, ...
# Use compression level 0 since AppImage is already compressed
# .7z is needed for installer_linux.sh yet
7z -mx=0 -v1900m a "${{ matrix.linux_appimage_7z_name }}.7z" "${appImageFile}"
split --verbose -d -b 1900m "${appImageFile}" "${{ matrix.installer_artifact_name }}.AppImage." |wc -l > "${{ matrix.installer_artifact_name }}"_split

# Output split archive name<TAB>size<TAB>hash list to myartifact.7z.txt
ls "${{ matrix.linux_appimage_7z_name }}.7z".* > archives_name.txt
stat --printf="%s\n" "${{ matrix.linux_appimage_7z_name }}.7z".* > archives_size.txt
md5sum "${{ matrix.linux_appimage_7z_name }}.7z".* | awk '{print $1}' | tr a-z A-Z > archives_hash.txt

paste -d '\t' archives_name.txt archives_size.txt archives_hash.txt > archives.txt

mv archives.txt "${{ matrix.installer_artifact_name }}.7z.txt"
# Calc checksum of original file by same func with GitHub
sha256sum ${appImageFile} | cut -d ' ' -f 1 > "${{ matrix.installer_artifact_name }}.AppImage.sha256sum"
# Save runner's disk space and make release pattern simpler
rm ${appImageFile}
done

- name: Create Linux installer
if: endsWith(matrix.installer_artifact_name, '-appimage')
run: |
splitnum=$(cat dist_electron/"${{ matrix.installer_artifact_name }}"_split)
sed \
-e 's/^NAME=@@PLACEHOLDER@@ # placeholder for CI$/NAME="${{ matrix.installer_artifact_name }}"/' \
-e 's/^VERSION=@@PLACEHOLDER@@ # placeholder for CI$/VERSION="${{ env.VOICEVOX_EDITOR_VERSION }}"/' \
-e "s/^SPLIT=@@SPLIT@@ # placeholder for CI$/SPLIT=${splitnum}/" \
build/linux/installer_linux.template.sh > VOICEVOX.${{ matrix.installer_artifact_name }}.${{ env.VOICEVOX_EDITOR_VERSION }}.sh

# Check that placeholders were replaced
Expand All @@ -486,7 +478,7 @@ jobs:
with:
name: ${{ matrix.installer_artifact_name }}-release
path: |-
dist_electron/*.7z.*
dist_electron/*.AppImage*
VOICEVOX.${{ matrix.installer_artifact_name }}.${{ env.VOICEVOX_EDITOR_VERSION }}.sh

- name: Upload Linux AppImage split and installer to Release Assets
Expand All @@ -496,7 +488,7 @@ jobs:
prerelease: ${{ github.event.inputs.prerelease }}
tag_name: ${{ env.VOICEVOX_EDITOR_VERSION }}
files: |-
dist_electron/*.7z.*
dist_electron/*.AppImage*
VOICEVOX.${{ matrix.installer_artifact_name }}.${{ env.VOICEVOX_EDITOR_VERSION }}.sh
target_commitish: ${{ github.sha }}

Expand Down
157 changes: 13 additions & 144 deletions build/linux/installer_linux.template.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ BANNER

NAME=@@PLACEHOLDER@@ # placeholder for CI
VERSION=@@PLACEHOLDER@@ # placeholder for CI
SPLIT=@@SPLIT@@ # placeholder for CI
REPO_URL=${REPO_URL:-https://github.com/VOICEVOX/voicevox}

# Install directory
Expand Down Expand Up @@ -78,162 +79,30 @@ Or
EOS
fi

COMMAND_7Z=${COMMAND_7Z:-}
if [ -n "${COMMAND_7Z}" ]; then
# use env var
:
elif command -v 7z &> /dev/null; then
# Ubuntu/Debian p7zip-full
COMMAND_7Z=7z
elif command -v 7zr &> /dev/null; then
# Ubuntu/Debian p7zip
COMMAND_7Z=7zr
elif command -v 7za &> /dev/null; then
# CentOS/Fedora
COMMAND_7Z=7za
elif command -v 7zz &> /dev/null; then
# Official 7zip
COMMAND_7Z=7zz
else
cat << 'EOS' && exit 1
[!] Command '7z', '7zr', '7za' or '7zz' not found

Required to extract compressed files

Ubuntu/Debian:
sudo apt install p7zip

CentOS (Enable EPEL repository):
sudo dnf install epel-release && sudo dnf install p7zip
Or
sudo yum install epel-release && sudo yum install p7zip

Fedora:
sudo dnf install p7zip
Or
sudo yum install p7zip

Arch Linux:
sudo pacman -S 7zip
EOS
fi
echo "[-] 7z command: ${COMMAND_7Z}"

RELEASE_URL=${REPO_URL}/releases/download/${VERSION}
ARCHIVE_LIST_URL=${RELEASE_URL}/${NAME}.7z.txt

echo "[-] Install directory: ${APP_DIR}"
mkdir -p "${APP_DIR}"

cd "${APP_DIR}"

# Download archive list
if [ "$REUSE_LIST" != "1" ]; then
echo "[+] Downloading ${ARCHIVE_LIST_URL}..."
curl --fail -L -o "list.txt" "${ARCHIVE_LIST_URL}"
fi

echo
echo "[+] Listing of split archives..."
_readarray ARCHIVE_LIST < "list.txt"
# filename<TAB>size<TAB>hash
_readarray ARCHIVE_NAME_LIST < <(
for line in "${ARCHIVE_LIST[@]}"; do
echo "$line"
done | awk '$0!=""{print $1}'
)
_readarray ARCHIVE_SIZE_LIST < <(
for line in "${ARCHIVE_LIST[@]}"; do
echo "$line"
done | awk '$0!=""{print $2}'
)
_readarray ARCHIVE_HASH_LIST < <(
for line in "${ARCHIVE_LIST[@]}"; do
echo "$line"
done | awk '$0!=""{print $3}' |
tr '[:lower:]' '[:upper:]'
)

echo

for index in "${!ARCHIVE_NAME_LIST[@]}"; do
echo "${index}." \
"${ARCHIVE_NAME_LIST[index]}" \
"${ARCHIVE_SIZE_LIST[index]}" \
"${ARCHIVE_HASH_LIST[index]}"
done
echo

# Download archives
for index in "${!ARCHIVE_LIST[@]}"; do
FILENAME=${ARCHIVE_NAME_LIST[index]}
SIZE=${ARCHIVE_SIZE_LIST[index]}
HASH=${ARCHIVE_HASH_LIST[index]}

URL=${RELEASE_URL}/${FILENAME}

echo "[+] Downloading ${URL}..."
if [ ! -f "${FILENAME}" ]; then
curl --fail -L -C - -o "${FILENAME}.tmp" "${URL}"
mv "${FILENAME}.tmp" "${FILENAME}"
fi

# File verification (size, md5 hash)
if [ "$SKIP_VERIFY" = "1" ]; then
echo "[-] File verification skipped"
else
if [ "$SIZE" != "x" ]; then
echo "[+] Verifying size == ${SIZE}..."
if stat --version &>/dev/null; then
DOWNLOADED_SIZE=$(stat --printf="%s" "${FILENAME}")
else
DOWNLOADED_SIZE=$(stat -f%z "${FILENAME}")
fi

if [ "$DOWNLOADED_SIZE" = "$SIZE" ]; then
echo "[-] Size OK"
else
cat << EOS && exit 1
[!] Invalid size: ${DOWNLOADED_SIZE} != ${SIZE}

Remove the corrupted file and restart installer!

rm $(realpath "${FILENAME}")

EOS
fi
fi

if [ "$HASH" != "x" ]; then
echo "[+] Verifying hash == ${HASH}..."
DOWNLOADED_HASH=$(md5sum "${FILENAME}" | awk '$0=$1' | tr '[:lower:]' '[:upper:]')
if [ "$DOWNLOADED_HASH" = "$HASH" ]; then
echo "[-] Hash OK"
else
cat << EOS && exit 1
[!] Invalid hash: ${DOWNLOADED_HASH} != ${HASH}

Remove the corrupted file and restart installer!

rm $(realpath "${FILENAME}")

EOS
fi
fi
fi
done

# Extract archives
echo "[+] Extracting archive..."
FIRST_ARCHIVE=${ARCHIVE_NAME_LIST[0]}
"${COMMAND_7Z}" x "${FIRST_ARCHIVE}" -y
# Download separated AppImages and verify it
curl --fail -L -o sha ${REPO_URL}/releases/download/${VERSION}/${NAME}.AppImage.sha256sum
# Download AppImage if missing or broken
if [ "$(cat sha)" != "$(sha256sum ${NAME}.AppImage)" ];then
rm -f ${NAME}.AppImage
# Do not put duplicated large files on the disk
for s in $(seq 0 $(( ${SPLIT} - 1 )) );do
curl --fail -L ${REPO_URL}/releases/download/${VERSION}/${NAME}.AppImage.0${s} >> ${NAME}.AppImage
done
fi
[ $(cat sha) != $(sha256sum ${NAME}.AppImage) ] || (echo "Checksum mismatch. Please retry." ;exit 1)

# Rename
APPIMAGE="VOICEVOX.AppImage"
EXTRACTED_APPIMAGE_NAME=$("${COMMAND_7Z}" l -slt -ba "${FIRST_ARCHIVE}" | grep 'Path = ' | head -n1 | sed 's/Path = \(.*\)/\1/')
if [ "$EXTRACTED_APPIMAGE_NAME" != "$APPIMAGE" ]; then
mv "$EXTRACTED_APPIMAGE_NAME" "$APPIMAGE"
fi
mv -f ${NAME}.AppImage "$APPIMAGE"
chmod +x "${APPIMAGE}"

# Dump version
Expand Down
Loading