name: Build on: push: pull_request: types: [opened, synchronize, reopened] release: types: [published] jobs: build-opensuse: name: Build openSUSE if: github.repository != 'strawberrymusicplayer/strawberry-private' runs-on: ubuntu-latest strategy: fail-fast: false matrix: opensuse_version: [ 'tumbleweed', 'leap:15.5', 'leap:15.6' ] qt_version: [ '5', '6' ] container: image: opensuse/${{matrix.opensuse_version}} steps: - name: Add devel tools building repo if: matrix.opensuse_version != 'tumbleweed' run: zypper -n ar -c -f -n 'devel-tools-building' https://download.opensuse.org/repositories/devel:tools:building/$(echo "${{matrix.opensuse_version}}" | cut -d ':' -f 2)/ devel-tools-building - name: Add tagparser repo if: matrix.opensuse_version == 'tumbleweed' run: zypper -n ar -c -f -n 'repo-tagparser' https://download.opensuse.org/repositories/home:/mkittler/openSUSE_Tumbleweed/ repo-tagparser - name: Refresh repositories run: zypper -n --gpg-auto-import-keys ref - name: Upgrade packages if: matrix.opensuse_version == 'tumbleweed' run: zypper -n --gpg-auto-import-keys dup - name: Upgrade packages if: matrix.opensuse_version != 'tumbleweed' run: zypper -n --gpg-auto-import-keys up - name: Install gcc if: matrix.opensuse_version == 'tumbleweed' run: zypper -n --gpg-auto-import-keys in gcc gcc-c++ - name: Install gcc 13 if: matrix.opensuse_version != 'tumbleweed' run: zypper -n --gpg-auto-import-keys in gcc13 gcc13-c++ - name: Install packages run: > zypper -n --gpg-auto-import-keys in lsb-release rpm-build git tar make cmake gettext-tools openssh-clients rsync glibc-devel libboost_headers-devel boost-devel glib2-devel glib2-tools dbus-1-devel alsa-devel libnotify-devel protobuf-devel sqlite3-devel libpulse-devel gstreamer-devel gstreamer-plugins-base-devel vlc-devel taglib-devel libicu-devel libcdio-devel libgpod-devel libmtp-devel libchromaprint-devel fftw3-devel libebur128-devel desktop-file-utils update-desktop-files appstream-glib hicolor-icon-theme - name: Install Qt 5 if: matrix.qt_version == '5' run: > zypper -n --gpg-auto-import-keys in libQt5Core-devel libQt5Gui-devel libQt5Widgets-devel libQt5Concurrent-devel libQt5Network-devel libQt5Sql-devel libQt5DBus-devel libQt5Test-devel libqt5-qtbase-common-devel libQt5Sql5-sqlite libqt5-linguist-devel libqt5-qtx11extras-devel - name: Install Qt 6 if: matrix.qt_version == '6' run: > zypper -n --gpg-auto-import-keys in qt6-core-devel qt6-gui-devel qt6-widgets-devel qt6-concurrent-devel qt6-network-devel qt6-sql-devel qt6-dbus-devel qt6-test-devel qt6-base-common-devel qt6-sql-sqlite qt6-linguist-devel - name: Install tagparser if: matrix.opensuse_version == 'tumbleweed' run: zypper -n --gpg-auto-import-keys in tagparser-devel - name: Install kdsingleapplication-devel if: matrix.opensuse_version == 'tumbleweed' && matrix.qt_version == '5' run: zypper -n --gpg-auto-import-keys in kdsingleapplication-devel - name: Install kdsingleapplication-qt6-devel if: matrix.opensuse_version == 'tumbleweed' && matrix.qt_version == '6' run: zypper -n --gpg-auto-import-keys in kdsingleapplication-qt6-devel - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON -DUSE_TAGLIB=ON -DQT_VERSION_MAJOR=${{matrix.qt_version}} - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz /usr/src/packages/SOURCES/ - name: Build RPM (Tumbleweed) if: matrix.opensuse_version == 'tumbleweed' working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Build RPM (Leap) if: matrix.opensuse_version != 'tumbleweed' working-directory: build env: CC: gcc-13 CXX: g++-13 run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Set subdir id: set-subdir run: echo "subdir=$(echo ${{matrix.opensuse_version}} | sed 's/leap:/lp/g' | sed 's/\.//g')" > $GITHUB_OUTPUT - name: Upload source if: matrix.opensuse_version == 'tumbleweed' && matrix.qt_version == '6' uses: actions/upload-artifact@v4 with: name: source path: | /usr/src/packages/SOURCES/*.xz - name: Upload rpm if: matrix.opensuse_version != 'tumbleweed' && matrix.qt_version == '6' uses: actions/upload-artifact@v4 with: name: opensuse-${{steps.set-subdir.outputs.subdir}} path: | /usr/src/packages/SRPMS/*.rpm /usr/src/packages/RPMS/x86_64/*.rpm build-fedora: name: Build Fedora if: github.repository != 'strawberrymusicplayer/strawberry-private' runs-on: ubuntu-latest strategy: fail-fast: false matrix: fedora_version: [ '38', '39', '40', '41' ] container: image: fedora:${{matrix.fedora_version}} steps: - name: Update repositories run: dnf -y update - name: Upgrade packages run: dnf -y upgrade - name: Install dependencies run: > dnf -y --skip-broken install @development-tools redhat-lsb-core which git glibc gcc-c++ rpmdevtools make cmake pkgconfig glib man tar gettext openssh rsync boost-devel dbus-devel protobuf-devel protobuf-compiler sqlite-devel alsa-lib-devel pulseaudio-libs-devel libnotify-devel libicu-devel qt6-qtbase-devel qt6-qtbase-private-devel qt6-qttools-devel gstreamer1-devel gstreamer1-plugins-base-devel taglib-devel libcdio-devel libgpod-devel libmtp-devel libchromaprint-devel libebur128-devel fftw-devel desktop-file-utils libappstream-glib hicolor-icon-theme kdsingleapplication-qt6-devel - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories working-directory: build run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz ~/rpmbuild/SOURCES/ - name: Build RPM env: RPM_BUILD_NCPUS: "2" working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: fedora-${{matrix.fedora_version}} path: | /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm build-openmandriva: name: Build OpenMandriva if: github.repository != 'strawberrymusicplayer/strawberry-private' && false runs-on: ubuntu-latest strategy: fail-fast: false matrix: openmandriva_version: [ "cooker" ] container: image: openmandriva/${{matrix.openmandriva_version}} steps: - name: Update distro run: dnf distro-sync --assumeyes - name: Install dependencies run: > dnf install -y which glibc gcc-c++ git gnutar make cmake glib gettext lsb-release rpmdevtools rpm-build rsync glibc-devel boost-devel dbus-devel protobuf-devel protobuf-compiler sqlite-devel libasound-devel pulseaudio-devel libGL-devel libgst-plugins-base1.0-devel taglib-devel chromaprint-devel libebur128-devel fftw-devel icu-devel libcdio-devel libgpod-devel libmtp-devel lib64Qt6Core-devel lib64Qt6Concurrent-devel lib64Qt6Network-devel lib64Qt6Sql-devel lib64Qt6DBus-devel lib64Qt6Gui-devel lib64Qt6Widgets-devel lib64Qt6Test-devel qt6-cmake qt6-qtbase-tools qt6-qttools-linguist desktop-file-utils appstream appstream-util hicolor-icon-theme - name: Remove files run: rm -rf /usr/lib64/qt6/lib/cmake/Qt6Sql/{Qt6QMYSQL*,Qt6QODBCD*,Qt6QPSQL*,Qt6QIBase*} - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories working-directory: build run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz ~/rpmbuild/SOURCES/ - name: Build RPM env: RPM_BUILD_NCPUS: "2" working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Upload artifacts if: matrix.openmandriva_version != 'cooker' uses: actions/upload-artifact@v4 with: name: openmandriva-${{matrix.openmandriva_version}} path: | /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm build-mageia: name: Build Mageia if: github.repository != 'strawberrymusicplayer/strawberry-private' runs-on: ubuntu-latest strategy: fail-fast: false matrix: mageia_version: [ '9' ] container: image: mageia:${{matrix.mageia_version}} steps: - name: Set media run: | urpmi.removemedia "Core Release" urpmi.removemedia "Core Updates" urpmi.addmedia "Core Release" "https://mirrors.kernel.org/mageia/distrib/${{matrix.mageia_version}}/x86_64/media/core/release/" urpmi.addmedia "Core Updates" "https://mirrors.kernel.org/mageia/distrib/${{matrix.mageia_version}}/x86_64/media/core/updates/" - name: Update repositories run: urpmi.update -a - name: Upgrade packages run: urpmi --auto --auto-update - name: Install dependencies run: > urpmi --auto --force urpmi-debuginfo-install git glibc gcc-c++ binutils make cmake man tar rpmdevtools gettext rsync lib64boost-devel lib64protobuf-devel lib64sqlite3-devel lib64alsa2-devel lib64pulseaudio-devel lib64gstreamer1.0-devel lib64gstreamer-plugins-base1.0-devel lib64cdio-devel lib64gpod-devel lib64mtp-devel lib64taglib-devel lib64chromaprint-devel lib64ebur128-devel lib64icu-devel lib64fftw-devel lib64dbus-devel lib64appstream-devel lib64qt6core-devel lib64qt6gui-devel lib64qt6widgets-devel lib64qt6network-devel lib64qt6concurrent-devel lib64qt6sql-devel lib64qt6dbus-devel lib64qt6help-devel lib64qt6test-devel protobuf-compiler desktop-file-utils appstream-util hicolor-icon-theme - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Create source tarball working-directory: build run: ../dist/scripts/maketarball.sh - name: Create RPM build sources directories working-directory: build run: mkdir -p ~/rpmbuild/SOURCES /usr/src/packages/SOURCES - name: Copy source tarball working-directory: build run: cp strawberry-*.tar.xz ~/rpmbuild/SOURCES/ - name: Build RPM env: RPM_BUILD_NCPUS: "2" working-directory: build run: rpmbuild -ba ../dist/unix/strawberry.spec - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: mageia-${{matrix.mageia_version}} path: | /github/home/rpmbuild/SRPMS/*.rpm /github/home/rpmbuild/RPMS/x86_64/*.rpm build-debian: name: Build Debian if: github.repository != 'strawberrymusicplayer/strawberry-private' runs-on: ubuntu-latest strategy: fail-fast: false matrix: debian_version: [ 'bullseye', 'bookworm', 'trixie' ] container: image: debian:${{matrix.debian_version}} steps: - name: Update packages run: apt update -y - name: Upgrade packages run: apt upgrade -y - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: > apt install -y build-essential dh-make git make cmake gcc g++ pkg-config fakeroot gettext lsb-release dpkg-dev libglib2.0-dev libdbus-1-dev libboost-dev libprotobuf-dev protobuf-compiler libsqlite3-dev libasound2-dev libpulse-dev libtag1-dev libicu-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-alsa gstreamer1.0-pulseaudio libchromaprint-dev libebur128-dev libfftw3-dev libcdio-dev libmtp-dev libgpod-dev - name: Install Qt 5 if: matrix.debian_version == 'bullseye' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools libqt5x11extras5-dev - name: Install Qt 6 if: matrix.debian_version != 'bullseye' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: make deb run: dpkg-buildpackage -b -d -uc -us -nc -j2 - name: Copy deb run: cp ../*.deb . - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: debian-${{matrix.debian_version}} path: "*.deb" build-ubuntu: name: Build Ubuntu if: github.repository != 'strawberrymusicplayer/strawberry-private' runs-on: ubuntu-latest strategy: fail-fast: false matrix: ubuntu_version: [ 'focal', 'jammy', 'mantic', 'noble' ] container: image: ubuntu:${{matrix.ubuntu_version}} steps: - name: Update packages run: apt update -y - name: Upgrade packages run: apt upgrade -y - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: > apt install -y build-essential dh-make git make cmake pkg-config gcc g++ fakeroot wget curl gettext lsb-release dpkg-dev libglib2.0-dev libboost-dev libdbus-1-dev libprotobuf-dev protobuf-compiler libsqlite3-dev libasound2-dev libpulse-dev libtag1-dev libicu-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev gstreamer1.0-alsa gstreamer1.0-pulseaudio libchromaprint-dev libebur128-dev libfftw3-dev libcdio-dev libmtp-dev libgpod-dev - name: Install Qt 5 if: matrix.ubuntu_version == 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools libqt5x11extras5-dev - name: Install Qt 6 if: matrix.ubuntu_version != 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: make deb run: dpkg-buildpackage -b -d -uc -us -nc -j2 - name: Copy deb run: cp ../*.deb ../*.ddeb . - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ubuntu-${{matrix.ubuntu_version}} path: | *.deb *.ddeb upload-ubuntu-ppa: name: Upload Ubuntu PPA if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && (github.event_name == 'release' || (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci'))) runs-on: ubuntu-latest strategy: fail-fast: false matrix: ubuntu_version: [ 'focal', 'jammy', 'mantic', 'noble' ] container: image: ubuntu:${{matrix.ubuntu_version}} steps: - name: Update packages run: apt update -y - name: Upgrade packages run: apt upgrade -y - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: > apt install -y git build-essential dh-make make cmake pkg-config gcc g++ fakeroot gettext lsb-release gpg dput dpkg-dev libglib2.0-dev libboost-dev libdbus-1-dev libprotobuf-dev libsqlite3-dev libasound2-dev libpulse-dev libtag1-dev libicu-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libchromaprint-dev libebur128-dev libfftw3-dev libcdio-dev libmtp-dev libgpod-dev gstreamer1.0-alsa gstreamer1.0-pulseaudio protobuf-compiler - name: Install keyboxd if: matrix.ubuntu_version == 'noble' env: DEBIAN_FRONTEND: noninteractive run: apt install -y keyboxd - name: Install Qt 5 if: matrix.ubuntu_version == 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools libqt5x11extras5-dev - name: Install Qt 6 if: matrix.ubuntu_version != 'focal' env: DEBIAN_FRONTEND: noninteractive run: apt install -y qt6-base-dev qt6-base-dev-tools qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_WERROR=ON - name: Delete build directory run: rm -rf build - name: Import Ubuntu PPA GPG private key uses: crazy-max/ghaction-import-gpg@v6 with: gpg_private_key: ${{secrets.UBUNTU_PPA_GPG_PRIVATE_KEY}} - name: dpkg-buildpackage run: dpkg-buildpackage -S -d -k573D197B5EA20EDF - name: Upload Unstable PPA if: github.event_name == 'push' run: dput ppa:jonaski/strawberry-unstable ../*_source.changes - name: Upload Stable PPA if: github.event_name == 'release' run: dput ppa:jonaski/strawberry ../*_source.changes build-macos-public: name: Build macOS Public if: github.repository != 'strawberrymusicplayer/strawberry-private' strategy: fail-fast: false matrix: runner: [ 'macos-11' ] buildtype: [ 'release' ] runs-on: ${{ matrix.runner }} steps: - name: Set arch shell: bash run: echo "arch=$(uname -m)" >> $GITHUB_ENV - name: Set buildtype run: echo "buildtype=$(echo ${{matrix.buildtype}} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - name: Set cmake buildtype run: echo "cmake_buildtype=$(echo ${{env.buildtype}} | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')" >> $GITHUB_ENV - name: Uninstall homebrew run: | curl -sfLO https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh chmod +x ./uninstall.sh sudo ./uninstall.sh --force rm -f uninstall.sh - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Import certificate file if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false uses: apple-actions/import-codesign-certs@v2 with: p12-file-base64: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE }} p12-password: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE_PASSWORD }} - name: Download macOS dependencies run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-macos-dependencies/releases/latest/download/strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz - name: Extract macOS dependencies run: sudo tar -C / -xf strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz - name: Set prefix path run: echo "prefix_path=/opt/strawberry_macos_${{env.arch}}_${{env.buildtype}}" >> $GITHUB_ENV - name: Update PATH run: echo "${{env.prefix_path}}/bin" >> $GITHUB_PATH - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake env: MACOSX_DEPLOYMENT_TARGET: 11.0 PKG_CONFIG_PATH: ${{env.prefix_path}}/lib/pkgconfig LDFLAGS: -L${{env.prefix_path}}/lib -Wl,-rpath,${{env.prefix_path}}/lib run: > cmake --log-level="DEBUG" -S . -B build -DCMAKE_BUILD_TYPE="${{env.cmake_buildtype}}" -DCMAKE_PREFIX_PATH="${{env.prefix_path}}/lib/cmake" -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DUSE_BUNDLE=ON -DENABLE_DBUS=OFF -DICU_ROOT="${{env.prefix_path}}" -DFFTW3_DIR="${{env.prefix_path}}" -DAPPLE_DEVELOPER_ID=$(test '${{github.repository}}' = 'strawberrymusicplayer/strawberry' && test '${{github.event.pull_request.base.repo.full_name}}' = '${{github.event.pull_request.head.repo.full_name}}' && echo "383J84DVB6" || echo "") - name: Build run: cmake --build build --config Release --parallel 4 - name: Install working-directory: build run: make install - name: Deploy env: GIO_EXTRA_MODULES: ${{env.prefix_path}}/lib/gio/modules GST_PLUGIN_SCANNER: ${{env.prefix_path}}/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH: ${{env.prefix_path}}/lib/gstreamer-1.0 LIBSOUP_LIBRARY_PATH: ${{env.prefix_path}}/lib/libsoup-3.0.0.dylib working-directory: build run: make deploy - name: Manually Codesign if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false working-directory: build run: codesign -s 383J84DVB6 -f strawberry.app/Contents/Frameworks/{libsoup-3.0.0.dylib,libnghttp2.14.dylib,libpsl.5.dylib,libpcre2-16.0.dylib,libpng16.16.dylib,libzstd.1.dylib} strawberry.app/Contents/Frameworks/png.framework/png strawberry.app - name: Deploy check working-directory: build run: make deploycheck - name: Verify code-signing if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false working-directory: build run: codesign --deep -v strawberry.app - name: Create DMG working-directory: build run: make dmg - name: SSH key setup if: github.repository == 'strawberrymusicplayer/strawberry' && (github.event_name == 'release' || (github.event_name == 'push' && github.event.pull_request.head.repo.fork == false && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' || github.ref == 'refs/heads/macos'))) uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{ secrets.SSH_KEY }} - name: Set Upload path id: set-upload-path if: github.repository == 'strawberrymusicplayer/strawberry' && (github.event_name == 'release' || (github.event_name == 'push' && github.event.pull_request.head.repo.fork == false && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci' || github.ref == 'refs/heads/macos'))) run: | if [ "${{github.event_name}}" = "release" ]; then echo "upload_path=${{secrets.DOWNLOADS_PATH}}/stable_releases/macos" >> $GITHUB_OUTPUT else echo "upload_path=${{secrets.DOWNLOADS_PATH}}/development_releases/macos" >> $GITHUB_OUTPUT fi - name: Create server path if: steps.set-upload-path.outputs.upload_path != '' run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{steps.set-upload-path.outputs.upload_path}} - name: rsync if: steps.set-upload-path.outputs.upload_path != '' run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/*.dmg ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{steps.set-upload-path.outputs.upload_path}}/ build-macos-private: name: Build macOS Private if: github.repository == 'strawberrymusicplayer/strawberry-private' strategy: fail-fast: false matrix: runner: [ 'macos-arm64' ] buildtype: [ 'release' ] runs-on: ${{ matrix.runner }} steps: - name: Set arch shell: bash run: echo "arch=$(uname -m)" >> $GITHUB_ENV - name: Set buildtype run: echo "buildtype=$(echo ${{matrix.buildtype}} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV - name: Set cmake buildtype run: echo "cmake_buildtype=$(echo ${{env.buildtype}} | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Unlock keychain run: security unlock-keychain -p ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - name: Set prefix path run: echo "prefix_path=/opt/strawberry_macos_${{env.arch}}_${{env.buildtype}}" >> $GITHUB_ENV - name: Update PATH run: echo "${{env.prefix_path}}/bin" >> $GITHUB_PATH - name: Create Build Environment run: cmake -E make_directory build - name: Configure CMake env: MACOSX_DEPLOYMENT_TARGET: 11.0 PKG_CONFIG_PATH: ${{env.prefix_path}}/lib/pkgconfig LDFLAGS: -L${{env.prefix_path}}/lib -Wl,-rpath,${{env.prefix_path}}/lib run: > cmake --log-level="DEBUG" -S . -B build -DCMAKE_BUILD_TYPE="${{env.cmake_buildtype}}" -DCMAKE_PREFIX_PATH="${{env.prefix_path}}/lib/cmake" -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DUSE_BUNDLE=ON -DENABLE_DBUS=OFF -DICU_ROOT="${{env.prefix_path}}" -DFFTW3_DIR="${{env.prefix_path}}" -DAPPLE_DEVELOPER_ID="383J84DVB6" - name: Build run: cmake --build build --config Release --parallel 4 - name: Install working-directory: build run: make install - name: Deploy env: GIO_EXTRA_MODULES: ${{env.prefix_path}}/lib/gio/modules GST_PLUGIN_SCANNER: ${{env.prefix_path}}/libexec/gstreamer-1.0/gst-plugin-scanner GST_PLUGIN_PATH: ${{env.prefix_path}}/lib/gstreamer-1.0 LIBSOUP_LIBRARY_PATH: ${{env.prefix_path}}/lib/libsoup-3.0.0.dylib working-directory: build run: make deploy - name: Manually Codesign working-directory: build run: codesign -s 383J84DVB6 -f strawberry.app/Contents/Frameworks/png.framework/png strawberry.app - name: Deploy check working-directory: build run: make deploycheck - name: Verify code-signing working-directory: build run: codesign --deep -v strawberry.app - name: Create DMG working-directory: build run: make dmg - name: Set Upload path id: set-upload-path run: | if [ "${{github.event_name}}" = "release" ]; then echo "upload_path=${{secrets.DOWNLOADS_PATH}}/stable_releases/macos" >> $GITHUB_OUTPUT else echo "upload_path=${{secrets.DOWNLOADS_PATH}}/development_releases/macos" >> $GITHUB_OUTPUT fi - name: Create server path run: ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${{steps.set-upload-path.outputs.upload_path}} - name: rsync run: rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/*.dmg ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{steps.set-upload-path.outputs.upload_path}}/ build-windows-mingw: name: Build Windows MinGW if: github.repository != 'strawberrymusicplayer/strawberry-private' runs-on: ubuntu-latest strategy: fail-fast: false matrix: arch: [ 'i686', 'x86_64' ] buildtype: [ 'debug', 'release' ] container: image: jonaski/strawberry-mxe-${{matrix.arch}}-${{matrix.buildtype}} steps: - name: Set cmake buildtype shell: bash run: echo "cmake_buildtype=$(echo ${{matrix.buildtype}} | sed 's/.*/\u&/')" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment run: cmake -E make_directory build - name: Link MXE directory run: ln -s /strawberry-mxe ~/mxe-shared - name: Run CMake env: PKG_CONFIG_PATH: /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/lib/pkgconfig run: > cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE="../cmake/Toolchain-${{matrix.arch}}-w64-mingw32-shared.cmake" -DCMAKE_BUILD_TYPE="${{env.cmake_buildtype}}" -DCMAKE_PREFIX_PATH="/strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6" -DBUILD_WITH_QT6=ON -DBUILD_WERROR=OFF -DARCH="${{matrix.arch}}" -DENABLE_WIN32_CONSOLE=$(test "${{matrix.buildtype}}" = "debug" && echo "ON" || echo "OFF") -DENABLE_DBUS=OFF -DENABLE_LIBGPOD=OFF -DENABLE_LIBMTP=OFF -DENABLE_AUDIOCD=OFF -DProtobuf_PROTOC_EXECUTABLE="/strawberry-mxe/usr/x86_64-pc-linux-gnu/bin/protoc" - name: Run Make run: cmake --build build --config "${{env.cmake_buildtype}}" --parallel $(nproc) - name: Create directories working-directory: build run: mkdir -p gio-modules platforms sqldrivers tls imageformats styles gstreamer-plugins nsisplugins - name: Copy GIO modules working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/lib/gio/modules/{libgiognutls.dll,libgioopenssl.dll} ${GITHUB_WORKSPACE}/build/gio-modules/ - name: Copy Qt platform plugins working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/platforms/qwindows.dll ${GITHUB_WORKSPACE}/build/platforms/ - name: Copy Qt styles working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/styles/qmodernwindowsstyle.dll ${GITHUB_WORKSPACE}/build/styles/ - name: Copy Qt TLS plugins working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/tls/{qschannelbackend.dll,qopensslbackend.dll} ${GITHUB_WORKSPACE}/build/tls/ - name: Copy Qt SQL drivers working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/sqldrivers/qsqlite.dll ${GITHUB_WORKSPACE}/build/sqldrivers/ - name: Copy Qt imageformats working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/qt6/plugins/imageformats/{qgif.dll,qico.dll,qjpeg.dll} ${GITHUB_WORKSPACE}/build/imageformats/ - name: Copy gstreamer plugins working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/bin/gstreamer-1.0/*.dll ${GITHUB_WORKSPACE}/build/gstreamer-plugins/ - name: Copy extra binaries working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/bin/{sqlite3.exe,gst-launch-1.0.exe,gst-play-1.0.exe,gst-discoverer-1.0.exe,libsoup-3.0-0.dll,libnghttp2.dll} . - name: Copy extra binaries (debug) if: matrix.buildtype == 'debug' working-directory: build run: cp /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared/bin/{gdb.exe,libreadline8.dll} . - name: Copy dependencies working-directory: build run: > /strawberry-mxe/tools/copydlldeps.sh -c -d . -F . -F ./platforms -F ./styles -F ./imageformats -F ./tls -F ./sqldrivers -F ./gstreamer-plugins -R /strawberry-mxe/usr/${{matrix.arch}}-w64-mingw32.shared - name: Strip binaries if: matrix.buildtype == 'release' working-directory: build run: find . -type f \( -iname \*.dll -o -iname \*.exe \) -exec /strawberry-mxe/usr/bin/${{matrix.arch}}-w64-mingw32.shared-strip {} \; - name: Strip gdb.exe if: matrix.buildtype == 'debug' working-directory: build run: /strawberry-mxe/usr/bin/${{matrix.arch}}-w64-mingw32.shared-strip gdb.exe - name: Copy nsis files working-directory: build run: cp ${GITHUB_WORKSPACE}/dist/windows/*.nsi ${GITHUB_WORKSPACE}/dist/windows/*.nsh ${GITHUB_WORKSPACE}/dist/windows/*.ico . - name: Copy COPYING license file working-directory: build run: cp ${GITHUB_WORKSPACE}/COPYING . - name: List files working-directory: build run: ls - name: Check that all files are included in nsi shell: bash working-directory: build run: | files_missing= for i in $(ls -1 *.dll *.exe); do nsi_file_entry=$(grep -i "^\s\+File\s\+\"$i\"$" strawberry.nsi || true) if [ "${nsi_file_entry}" = "" ]; then echo "File ${i} is missing File entry." fi nsi_file_delete_entry=$(grep -i "^\s\+Delete\s\+\"\$INSTDIR\\\\$i\"$" strawberry.nsi || true) if [ "${nsi_file_delete_entry}" = "" ] ; then echo "File ${i} is missing Delete entry." fi if [ "${nsi_file_entry}" = "" ] || [ "${nsi_file_delete_entry}" = "" ] ; then if [ "${files_missing}" = "" ]; then files_missing="${i}" else files_missing="${files_missing} $i" fi fi done if ! [ "${files_missing}" = "" ]; then echo "Files missing in nsi: ${files_missing}" exit 1 fi - name: Build Windows installer working-directory: build run: makensis strawberry.nsi - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: windows-mingw-${{matrix.arch}}-${{matrix.buildtype}} path: build/StrawberrySetup*.exe build-windows-msvc: name: Build Windows MSVC if: github.repository != 'strawberrymusicplayer/strawberry-private' runs-on: windows-2022 strategy: fail-fast: false matrix: arch: [ 'x86', 'x86_64' ] buildtype: [ 'debug', 'release' ] steps: - name: Set prefix path shell: bash run: | echo "prefix_path_backslash=c:\strawberry_msvc_${{matrix.arch}}_${{matrix.buildtype}}" >> $GITHUB_ENV echo "prefix_path_forwardslash=c:/strawberry_msvc_${{matrix.arch}}_${{matrix.buildtype}}" >> $GITHUB_ENV echo "prefix_path_unix=/c/strawberry_msvc_${{matrix.arch}}_${{matrix.buildtype}}" >> $GITHUB_ENV - name: Set cmake buildtype shell: bash run: echo "cmake_buildtype=$(echo ${{matrix.buildtype}} | sed 's/.*/\u&/')" >> $GITHUB_ENV - name: Create downloads directory shell: cmd run: mkdir downloads - name: Download Windows MSVC dependencies shell: cmd working-directory: downloads run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-msvc-dependencies/releases/latest/download/strawberry-msvc-${{matrix.arch}}-${{matrix.buildtype}}.tar.xz - name: Extract Windows MSVC dependencies shell: bash working-directory: downloads run: tar -C /c -xf strawberry-msvc-${{matrix.arch}}-${{matrix.buildtype}}.tar.xz - name: Update PATH run: echo "${{env.prefix_path_backslash}}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Copy bin files shell: bash run: cp /c/strawberry/c/bin/{patch.exe,strip.exe,strings.exe,objdump.exe} ${{env.prefix_path_unix}}/bin - name: Delete conflicting files shell: bash run: rm -rf /c/msys64 /c/mingw32 /c/mingw64 /c/strawberry/c "/c/program files/OpenSSL" "/c/program files/postgresql" - name: Delete conflicting icu shell: bash run: | find "/c/program files (x86)/windows kits/" -iname 'icu*.lib' -delete find "/c/program files (x86)/windows kits/" -iname 'icu*.h' -delete - name: Download NSIS LockedList plugin shell: cmd working-directory: downloads run: curl -f -O -L https://nsis.sourceforge.io/mediawiki/images/d/d3/LockedList.zip - name: Extract NSIS LockedList plugin shell: cmd working-directory: downloads run: 7z x LockedList.zip - name: Download NSIS Registry plugin shell: cmd working-directory: downloads run: curl -f -O -L https://nsis.sourceforge.io/mediawiki/images/4/47/Registry.zip - name: Extract NSIS Registry plugin shell: cmd working-directory: downloads run: 7z x Registry.zip - name: Download NSIS Inetc plugin shell: cmd working-directory: downloads run: curl -f -O -L https://nsis.sourceforge.io/mediawiki/images/c/c9/Inetc.zip - name: Extract NSIS Inetc plugin shell: cmd working-directory: downloads run: 7z x Inetc.zip - name: Install NSIS plugins shell: cmd working-directory: downloads run: | copy "Plugins\LockedList64.dll" "C:\Program Files (x86)\NSIS\Plugins\" copy "Plugins\x86-unicode\LockedList.dll" "C:\Program Files (x86)\NSIS\Plugins\x86-unicode\" copy "Desktop\Plugin\registry.dll" "C:\Program Files (x86)\NSIS\Plugins\" copy "Desktop\Plugin\registry.dll" "C:\Program Files (x86)\NSIS\Plugins\x86-unicode\" copy "Plugins\x86-unicode\INetC.dll" "C:\Program Files (x86)\NSIS\Plugins\x86-unicode\" - name: Setup MSVC Environment uses: ilammy/msvc-dev-cmd@v1 with: arch: ${{matrix.arch}} sdk: 10.0.20348.0 vsversion: 2022 toolset: 14.3 - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive - name: Add safe git directory shell: bash run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - name: Create Build Environment shell: cmd run: cmake -E make_directory build - name: Set ENABLE_WIN32_CONSOLE (debug) if: matrix.build_type == 'debug' shell: bash run: echo "win32_console=ON" >> $GITHUB_ENV - name: Set ENABLE_WIN32_CONSOLE (release) if: matrix.build_type == 'release' shell: bash run: echo "win32_console=OFF" >> $GITHUB_ENV - name: Run CMake shell: cmd run: > cmake -S . -B build -G "Ninja" -DCMAKE_BUILD_TYPE="${{env.cmake_buildtype}}" -DCMAKE_PREFIX_PATH="${{env.prefix_path_forwardslash}}/lib/cmake" -DBUILD_WITH_QT6=ON -DARCH="${{matrix.arch}}" -DENABLE_WIN32_CONSOLE=${{env.win32_console}} -DUSE_TAGLIB=ON -DPKG_CONFIG_EXECUTABLE="${{env.prefix_path_forwardslash}}/bin/pkg-config.exe" -DICU_ROOT="${{env.prefix_path_forwardslash}}" -DFFTW3_DIR="${{env.prefix_path_forwardslash}}" - name: Run Make shell: cmd env: CL: "/MP" run: cmake --build build --config "${{env.cmake_buildtype}}" --parallel 4 - name: Copy extra binaries shell: cmd working-directory: build run: | copy ${{env.prefix_path_backslash}}\bin\libssl-3*.dll copy ${{env.prefix_path_backslash}}\bin\libcrypto-3*.dll copy ${{env.prefix_path_backslash}}\bin\soup-3.0-0.dll copy ${{env.prefix_path_backslash}}\bin\gst-launch-1.0.exe copy ${{env.prefix_path_backslash}}\bin\gst-play-1.0.exe copy ${{env.prefix_path_backslash}}\bin\gst-discoverer-1.0.exe copy ${{env.prefix_path_backslash}}\bin\sqlite3.exe - name: Create directories shell: cmd working-directory: build run: | mkdir gio-modules mkdir platforms mkdir styles mkdir tls mkdir sqldrivers mkdir imageformats mkdir gstreamer-plugins mkdir nsisplugins - name: Copy GIO modules shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\lib\gio\modules\*.dll .\gio-modules\ - name: Copy Qt platform plugins shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\platforms\qwindows*.dll .\platforms\ - name: Copy Qt styles shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\styles\qmodernwindowsstyle*.dll .\styles\ - name: Copy Qt TLS plugins shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\tls\*.dll .\tls\ - name: Copy Qt SQL drivers shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\sqldrivers\qsqlite*.dll .\sqldrivers\ - name: Copy Qt imageformats plugins shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\plugins\imageformats\*.dll .\imageformats\ - name: Copy gstreamer plugins shell: cmd working-directory: build run: copy ${{env.prefix_path_backslash}}\lib\gstreamer-1.0\*.dll .\gstreamer-plugins\ - name: Download copydlldeps.sh shell: bash working-directory: build run: curl -f -O -L https://raw.githubusercontent.com/strawberrymusicplayer/strawberry-mxe/master/tools/copydlldeps.sh - name: Copy dependencies shell: bash working-directory: build run: > ./copydlldeps.sh -c -d . -F . -F ./platforms -F ./styles -F ./tls -F ./sqldrivers -F ./imageformats -F ./gio-modules -F ./gstreamer-plugins -R ${{env.prefix_path_unix}}/bin - name: Copy nsis files shell: cmd working-directory: build run: | copy ..\dist\windows\*.nsi . copy ..\dist\windows\*.nsh . copy ..\dist\windows\*.ico . - name: Copy COPYING license file shell: cmd working-directory: build run: copy ..\COPYING . - name: List files shell: cmd working-directory: build run: dir - name: Check that all files are included in nsi shell: bash working-directory: build run: | files_missing= for i in $(ls -1 *.dll *.exe); do nsi_file_entry=$(grep -i "^\s\+File\s\+\"$i\"$" strawberry.nsi || true) if [ "${nsi_file_entry}" = "" ]; then echo "File ${i} is missing File entry." fi nsi_file_delete_entry=$(grep -i "^\s\+Delete\s\+\"\$INSTDIR\\\\$i\"$" strawberry.nsi || true) if [ "${nsi_file_delete_entry}" = "" ] ; then echo "File ${i} is missing Delete entry." fi if [ "${nsi_file_entry}" = "" ] || [ "${nsi_file_delete_entry}" = "" ] ; then if [ "${files_missing}" = "" ]; then files_missing="${i}" else files_missing="${files_missing} $i" fi fi done if ! [ "${files_missing}" = "" ]; then echo "Files missing in nsi: ${files_missing}" exit 1 fi - name: Create nsis installer shell: cmd working-directory: build run: makensis strawberry.nsi - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: windows-msvc-${{matrix.arch}}-${{matrix.buildtype}} path: build/StrawberrySetup*.exe upload: name: Upload if: (success() || failure()) && github.repository == 'strawberrymusicplayer/strawberry' && (github.event_name == 'release' || (github.event_name == 'push' && github.event.pull_request.head.repo.fork == false && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/ci'))) runs-on: ubuntu-latest needs: - build-opensuse - build-fedora - build-debian - build-ubuntu - build-windows-mingw - build-windows-msvc steps: - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: sudo apt install -y git rsync - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: SSH key setup uses: shimataro/ssh-key-action@v2 with: known_hosts: ${{secrets.SSH_KNOWN_HOSTS}} key: ${{secrets.SSH_KEY}} - name: Upload run: | for i in $(find artifacts -type f); do if [ "${{github.event_name}}" = "release" ]; then upload_path="${{secrets.RELEASES_PATH}}/" else distro=$(echo "$i" | cut -d '/' -f 2) if [ "$(echo "$i" | grep '-' || true)" = "" ]; then upload_path="${{secrets.BUILDS_PATH}}/${distro}/" else distro_name=$(echo "${distro}" | cut -d '-' -f 1) distro_version=$(echo "${distro}" | cut -d '-' -f 2) upload_path="${{secrets.BUILDS_PATH}}/${distro_name}/${distro_version}/" fi fi ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}} mkdir -p ${upload_path} rsync -e "ssh -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var $i ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${upload_path}/ done attach: name: Attach to release if: (success() || failure()) && github.event_name == 'release' runs-on: ubuntu-latest needs: - build-opensuse - build-fedora - build-mageia - build-debian - build-ubuntu - build-windows-mingw - build-windows-msvc steps: - name: Install packages env: DEBIAN_FRONTEND: noninteractive run: sudo apt install -y git jq gh - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Show release assets env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} run: gh release view "${{github.event.release.tag_name}}" --json assets | jq -r '.assets[].name' - name: Download artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Add artifacts to release env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} run: | echo "Release version: ${{github.event.release.tag_name}}" filenames=() files=() for i in $(find artifacts -type f); do filename=$(basename $i) if [[ ${filenames[@]} =~ ${filename} ]]; then echo "Skipping duplicate file: ${filename}" continue fi filenames+=("${filename}") existing_asset=$(gh release view "${{github.event.release.tag_name}}" --json assets | jq -r '.assets[].name' | tr -d '[:blank:]' | grep ".*/${filename}\$" 2>/dev/null || true) if [ "${existing_asset}" = "" ]; then echo "Adding file: ${filename}" files+=("${i}") else echo "Release already has file: ${filename}" fi done files_list="${files[@]}" if ! [ "${files_list}" = "" ]; then echo "Adding files to GitHub release" gh release upload "${{github.event.release.tag_name}}" ${files_list} fi