diff --git a/.github/workflows/build.sh b/.github/workflows/build.sh deleted file mode 100755 index 65004e2..0000000 --- a/.github/workflows/build.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -set -e - -if [ -f /etc/os-release ]; then - . /etc/os-release - OS=$NAME -elif [ -f /etc/lsb-release ]; then - . /etc/lsb-release - OS=$DISTRIB_ID -else - OS=$(uname -s) -fi - -case $OS in - "Arch Linux") - echo "Arch Linux" - pacman -Syy --noconfirm - pacman -S --noconfirm git sudo base-devel p7zip nodejs jq asar electron27 libpulse dpkg unzip xdg-utils python - # fix makepkg from non-root - mkdir /home/build - chgrp nobody /home/build - chmod g+ws /home/build - setfacl -m u::rwx,g::rwx /home/build - setfacl -d --set u::rwx,g::rwx,o::- /home/build - chown nobody . - sudo -u nobody makepkg --log - - mkdir dist - mv *.pkg.tar.zst dist - - mv ./src/app/yandex-music.asar dist/yandex-music.asar - mv ./src/app/release_notes.json dist/release_notes.json - - bash ./build_deb.sh -a all - mv deb/*.deb dist - ;; - "Ubuntu") - echo NixOS - export NIXPKGS_ALLOW_UNFREE=1 - nix build --impure - ;; - *) - echo "Operating system is not recognized." - ;; -esac diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d98aca..0fc27d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,20 +21,44 @@ jobs: container: image: archlinux:latest steps: + - name: Install packages + run: pacman -Syy --noconfirm && pacman -S --noconfirm git sudo base-devel p7zip nodejs jq asar electron27 libpulse dpkg unzip xdg-utils python + - name: Checkout uses: actions/checkout@v4 with: ref: ${{ (inputs.ref || '') }} - - name: Build - run: bash ./.github/workflows/build.sh + - name: Create dist directory + run: mkdir -p dist - - name: Upload Arch artifact + - name: Fix permissions for build + run: mkdir /home/build && chgrp nobody /home/build && chmod g+ws /home/build && setfacl -m u::rwx,g::rwx /home/build && setfacl -d --set u::rwx,g::rwx,o::- /home/build && chown nobody . + + - name: Make Arch package + run: sudo -u nobody makepkg --log && mv *.pkg.tar.zst dist/ + + - name: Build tarball packages + run: bash ./build_tarball.sh -a all && mv tar/* dist/ + + - name: Build Deb packages + run: bash ./build_deb.sh -a all && mv deb/*.deb dist + + - name: Retrieve Asar and release notes + run: mv ./src/app/yandex-music.asar dist/yandex-music.asar && mv ./src/app/release_notes.json dist/release_notes.json + + - name: Upload Arch artifacts uses: actions/upload-artifact@v4 with: path: ./dist/*.pkg.tar.zst name: arch-packages + - name: Upload tarball artifacts + uses: actions/upload-artifact@v4 + with: + path: ./dist/*.tar.gz + name: tar-packages + - name: Upload Deb artifact uses: actions/upload-artifact@v4 with: diff --git a/.gitignore b/.gitignore index 1252f14..3f10be6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ app/ arch/ deb/ + +tar/ diff --git a/build_deb.sh b/build_deb.sh index 0fe8502..644a461 100755 --- a/build_deb.sh +++ b/build_deb.sh @@ -10,12 +10,14 @@ usage() { echo " -h Show this help and exit" } -download_electron_binary(){ +prepare_tarball(){ arch=${1} - echo "Downloading electron ${arch}" - LINK=$(jq -r .electron."${arch}" ./utility/version_info.json) - curl -L -o "${TEMPDIR}/electron-${arch}.zip" "${LINK}" - unzip -q "${TEMPDIR}/electron-${arch}.zip" -d "${TEMPDIR}/electron-${arch}" + echo "Preparing tarball for ${arch}" + if [ ! -f "tar/yandex-music_${version}_${arch}.tar.gz" ]; then + echo "Building tarball for ${arch}" + bash build_tarball.sh -a "${arch}" + fi + cp "tar/yandex-music_${version}_${arch}.tar.gz" "${TEMPDIR}/yandex-music_${version}_${arch}.tar.gz" } build_deb(){ @@ -30,25 +32,8 @@ build_deb(){ sed -i "s/%version%/${version}/g" "${pkgdir}/DEBIAN/control" sed -i "s/%arch%/${pkgarch}/g" "${pkgdir}/DEBIAN/control" - mkdir -p "${pkgdir}/usr/lib/yandex-music" - mkdir -p "${pkgdir}/usr/share/applications" - mkdir -p "${pkgdir}/usr/share/licenses/yandex-music" - mkdir -p "${pkgdir}/usr/share/pixmaps" - mkdir -p "${pkgdir}/usr/bin" - - install -Dm644 "${TEMPDIR}/app/yandex-music.asar" "${pkgdir}/usr/lib/yandex-music/yandex-music.asar" - - install -Dm644 "${TEMPDIR}/app/favicon.png" "${pkgdir}/usr/share/pixmaps/yandex-music.png" - install -Dm644 "${TEMPDIR}/app/favicon.png" "${pkgdir}/usr/share/icons/hicolor/48x48/apps/yandex-music.png" - install -Dm644 "${TEMPDIR}/app/favicon.svg" "${pkgdir}/usr/share/icons/hicolor/scalable/apps/yandex-music.svg" - - install -Dm644 "./templates/desktop" "${pkgdir}/usr/share/applications/yandex-music.desktop" - install -Dm644 "./LICENSE.md" "${pkgdir}/usr/share/licenses/yandex-music/LICENSE" - mv "${TEMPDIR}/electron-${arch}/" "${pkgdir}/usr/lib/yandex-music/electron" - - echo "#!/bin/sh" > "${pkgdir}/usr/bin/yandex-music" - echo 'exec /usr/lib/yandex-music/electron/electron /usr/lib/yandex-music/yandex-music.asar "$@"' >> "${pkgdir}/usr/bin/yandex-music" - chmod 755 "${pkgdir}/usr/bin/yandex-music" + # extract tarball to pkgdir + tar -xzf "${TEMPDIR}/yandex-music_${version}_${arch}.tar.gz" -C "${pkgdir}" dpkg-deb --build "${pkgdir}" "deb/yandex-music_${version}_${pkgarch}.deb" } @@ -101,34 +86,20 @@ trap clear EXIT #loading version info with jq version=$(jq -r '.ym.version' ./utility/version_info.json) -exe_name=$(jq -r '.ym.exe_name' ./utility/version_info.json) -exe_link=$(jq -r '.ym.exe_link' ./utility/version_info.json) -exe_sha256=$(jq -r '.ym.exe_sha256' ./utility/version_info.json) - -#downloading exe -echo "Downloading ${exe_name}" -curl -L -o "${TEMPDIR}/${exe_name}" "${exe_link}" - -#checking sha256 -echo "Checking sha256" -echo "${exe_sha256} ${TEMPDIR}/${exe_name}" | sha256sum -c - -echo "Repaking ${exe_name}" -bash repack.sh -o "${TEMPDIR}/app" "${TEMPDIR}/${exe_name}" mkdir -p "deb" if [ ${x64} -eq 1 ]; then - download_electron_binary "x64" + prepare_tarball "x64" build_deb "x64" "amd64" fi if [ ${armv7l} -eq 1 ]; then - download_electron_binary "armv7l" + prepare_tarball "armv7l" build_deb "armv7l" "armhf" fi if [ ${arm64} -eq 1 ]; then - download_electron_binary "arm64" + prepare_tarball "arm64" build_deb "arm64" "arm64" fi \ No newline at end of file diff --git a/build_tarball.sh b/build_tarball.sh new file mode 100644 index 0000000..20a3791 --- /dev/null +++ b/build_tarball.sh @@ -0,0 +1,131 @@ +#!/bin/bash + +set -e + +usage() { + echo "Usage: $(basename "$0") [-h] [-a default=x64]" + echo + echo " Options:" + echo " -a Architecture to build for ( default=x64)" + echo " -o Output directory" + echo " -h Show this help and exit" +} + +download_electron_binary(){ + arch=${1} + echo "Downloading electron ${arch}" + LINK=$(jq -r .electron."${arch}" ./utility/version_info.json) + curl -L -o "${TEMPDIR}/electron-${arch}.zip" "${LINK}" + unzip -q "${TEMPDIR}/electron-${arch}.zip" -d "${TEMPDIR}/electron-${arch}" +} + +build_tarball(){ + arch=${1} + app_dir="${TEMPDIR}/yandex-music_${version}_${arch}" + + mkdir -p "${app_dir}/usr/lib/yandex-music" + mkdir -p "${app_dir}/usr/share/applications" + mkdir -p "${app_dir}/usr/share/licenses/yandex-music" + mkdir -p "${app_dir}/usr/share/pixmaps" + mkdir -p "${app_dir}/usr/bin" + + install -Dm644 "${TEMPDIR}/app/yandex-music.asar" "${app_dir}/usr/lib/yandex-music/yandex-music.asar" + + install -Dm644 "${TEMPDIR}/app/favicon.png" "${app_dir}/usr/share/pixmaps/yandex-music.png" + install -Dm644 "${TEMPDIR}/app/favicon.png" "${app_dir}/usr/share/icons/hicolor/48x48/apps/yandex-music.png" + install -Dm644 "${TEMPDIR}/app/favicon.svg" "${app_dir}/usr/share/icons/hicolor/scalable/apps/yandex-music.svg" + + install -Dm644 "./templates/desktop" "${app_dir}/usr/share/applications/yandex-music.desktop" + install -Dm644 "./LICENSE.md" "${app_dir}/usr/share/licenses/yandex-music/LICENSE" + mv "${TEMPDIR}/electron-${arch}/" "${app_dir}/usr/lib/yandex-music/electron" + + echo "#!/bin/sh" > "${app_dir}/usr/bin/yandex-music" + echo 'exec /usr/lib/yandex-music/electron/electron /usr/lib/yandex-music/yandex-music.asar "$@"' >> "${app_dir}/usr/bin/yandex-music" + chmod 755 "${app_dir}/usr/bin/yandex-music" + + cd "${app_dir}" + tar cvfz "${OUTPUT_DIR}/yandex-music_${version}_${arch}.tar.gz" * + cd "${INITIAL_DIR}" +} + +INITIAL_DIR="${PWD}" +OUTPUT_DIR="${PWD}/tar" +x64=0 +armv7l=0 +arm64=0 + +#checking for arch option (if not specified set x64) and h option +while getopts :a:h name; do + case ${name} in + a) + case ${OPTARG} in + x64) x64=1 ;; + armv7l) armv7l=1 ;; + arm64) arm64=1 ;; + all) + x64=1 + armv7l=1 + arm64=1 + ;; + *) + echo "Invalid architecture specified" + usage + exit 1 + ;; + esac + ;; + h) + usage + exit 0 + ;; + *) + usage + exit 1 + ;; + esac +done + +#checking if at least one arch is specified else set x64 +if [ ${x64} -eq 0 ] && [ ${armv7l} -eq 0 ] && [ ${arm64} -eq 0 ]; then + x64=1 +fi + +clear() { + rm -rf "${TEMPDIR}" +} +TEMPDIR="$(mktemp -d)" +trap clear EXIT + +#loading version info with jq +version=$(jq -r '.ym.version' ./utility/version_info.json) +exe_name=$(jq -r '.ym.exe_name' ./utility/version_info.json) +exe_link=$(jq -r '.ym.exe_link' ./utility/version_info.json) +exe_sha256=$(jq -r '.ym.exe_sha256' ./utility/version_info.json) + +#downloading exe +echo "Downloading ${exe_name}" +curl -L -o "${TEMPDIR}/${exe_name}" "${exe_link}" + +#checking sha256 +echo "Checking sha256" +echo "${exe_sha256} ${TEMPDIR}/${exe_name}" | sha256sum -c + +echo "Repaking ${exe_name}" +bash repack.sh -o "${TEMPDIR}/app" "${TEMPDIR}/${exe_name}" + +mkdir -p "${OUTPUT_DIR}" + +if [ ${x64} -eq 1 ]; then + download_electron_binary "x64" + build_tarball "x64" +fi + +if [ ${armv7l} -eq 1 ]; then + download_electron_binary "armv7l" + build_tarball "armv7l" +fi + +if [ ${arm64} -eq 1 ]; then + download_electron_binary "arm64" + build_tarball "arm64" +fi \ No newline at end of file