diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6bb7388dfd..42198b64b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -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 @@ -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 @@ -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 @@ -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 namesizehash 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 @@ -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 @@ -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 }} diff --git a/build/linux/installer_linux.template.sh b/build/linux/installer_linux.template.sh index eacced6d2b..9ea39adc4d 100755 --- a/build/linux/installer_linux.template.sh +++ b/build/linux/installer_linux.template.sh @@ -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 @@ -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" -# filenamesizehash -_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