name: Build on: push: branches: - master - develop pull_request: branches: - master - develop env: IS_ORIGINAL_REPO: ${{ github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') }} IS_FORK: ${{ github.repository != 'YACReader/yacreader' || (github.ref != 'refs/heads/master' && github.ref != 'refs/heads/develop') }} jobs: # Build number generation initialization: name: Initialization runs-on: windows-latest outputs: build_number: ${{ steps.build_number.outputs.build_number }} steps: - name: Generate Build Number id: build_number shell: pwsh run: | $date = (Get-Date).ToString("yyMMdd") $revision = "${{ github.run_number }}" $buildNumber = "$date$revision" echo "build_number=$buildNumber" >> $env:GITHUB_OUTPUT echo "Build Number: $buildNumber" # Code format validation code-format-validation: name: Code Format Validation runs-on: macos-latest needs: initialization steps: - uses: actions/checkout@v4 - name: Install dependencies run: brew install clang-format - name: Run clang-format run: | find . \( -name '*.h' -or -name '*.cpp' -or -name '*.c' -or -name '*.mm' -or -name '*.m' \) -print0 | xargs -0 clang-format -style=file -i git diff ${{ github.sha }} if [ "$(git diff ${{ github.sha }})" != "" ]; then exit 1; fi # Linux build (Qt5 with unarr) linux: name: Linux (Qt5) runs-on: ubuntu-22.04 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y qtchooser qtbase5-dev-tools qt5-qmake \ qtbase5-dev qtmultimedia5-dev libpoppler-qt5-dev qttools5-dev-tools \ libqt5opengl5-dev libunarr-dev qtdeclarative5-dev libqt5svg5-dev qtquickcontrols2-5-dev - name: Create tarball run: | VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" ./mktarball.sh $VERSION mkdir tarball cp yacreader-*-src.tar.xz* tarball/ - name: Build run: | export DEFINES_VAR=DEFINES+=\"BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"\" qmake CONFIG+="unarr" $DEFINES_VAR make - name: Run tests run: make check TESTARGS="-maxwarnings 100000" - name: Upload tarball uses: actions/upload-artifact@v4 with: name: src-${{ needs.initialization.outputs.build_number }}-tarball path: tarball/* # Linux Qt6 build linux-qt6: name: Linux (Qt6) runs-on: ubuntu-24.04 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools libgl-dev qt6-l10n-tools \ libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev libpoppler-qt6-dev - name: Build run: | qtchooser -list-versions export DEFINES_VAR=DEFINES+=\"BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"\" qmake6 CONFIG+="unarr" $DEFINES_VAR qmake6 -v make - name: Run tests run: make check TESTARGS="-maxwarnings 100000" # Linux Qt6 with 7zip linux-qt6-7zip: name: Linux (Qt6 + 7zip) runs-on: ubuntu-24.04 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Install dependencies run: | sudo apt-get update sudo apt-get install -y qtchooser qt6-tools-dev qt6-base-dev-tools qmake6 qmake6-bin \ qt6-base-dev qt6-multimedia-dev qt6-tools-dev-tools libgl-dev qt6-l10n-tools \ libqt6opengl6-dev libunarr-dev qt6-declarative-dev libqt6svg6-dev libqt6core5compat6-dev libpoppler-qt6-dev mkdir -p ${{ github.workspace }}/compressed_archive wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O ${{ github.workspace }}/compressed_archive/7z2301-src.7z 7z x ${{ github.workspace }}/compressed_archive/7z2301-src.7z -o${{ github.workspace }}/compressed_archive/lib7zip - name: Build run: | qtchooser -list-versions export DEFINES_VAR=DEFINES+=\"BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"\" qmake6 CONFIG+="7zip" $DEFINES_VAR qmake6 -v make - name: Run tests run: make check TESTARGS="-maxwarnings 100000" # macOS Qt6 Universal build macos-qt6-universal: name: macOS (Qt6 Universal) runs-on: macos-14 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Install dependencies run: | pip3 install --break-system-packages aqtinstall python3 -m aqt install-qt mac desktop 6.3.1 -m qt5compat qtmultimedia qtimageformats echo "${{ github.workspace }}/6.3.1/macos/bin" >> $GITHUB_PATH brew install create-dmg brew install node brew link --overwrite node npm install -g appdmg mkdir -p ${{ github.workspace }}/compressed_archive wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O ${{ github.workspace }}/compressed_archive/7z2301-src.7z 7z x ${{ github.workspace }}/compressed_archive/7z2301-src.7z -o${{ github.workspace }}/compressed_archive/lib7zip - name: Import Code Signing Certificate if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: apple-actions/import-codesign-certs@v2 with: p12-file-base64: ${{ secrets.MACOS_CERTIFICATE_P12_BASE64 }} p12-password: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} - name: Build env: MACOSX_DEPLOYMENT_TARGET: "11" run: | VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" SKIP_CODESIGN="${{ env.IS_FORK }}" SKIP_CODESIGN=$(echo "$SKIP_CODESIGN" | tr '[:upper:]' '[:lower:]') ./compileOSX.sh $VERSION ${{ needs.initialization.outputs.build_number }} $SKIP_CODESIGN Qt6 universal - name: Build and run tests run: | cd tests qmake make check TESTARGS="-maxwarnings 100000" - name: Notarize if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') run: | xcrun notarytool submit *.dmg --apple-id "${{ secrets.MACOS_APPLE_ID }}" --team-id "${{ secrets.MACOS_TEAM_ID }}" --password "${{ secrets.MACOS_APP_PASSWORD }}" --wait xcrun stapler staple *.dmg - name: Upload DMG uses: actions/upload-artifact@v4 with: name: macos-qt6-universal-${{ needs.initialization.outputs.build_number }}-dmg path: "*.dmg" # macOS Qt5 build macos: name: macOS (Qt5) runs-on: macos-13 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Install dependencies run: | brew install qt@5 brew link qt@5 --force brew install create-dmg brew install node brew link --overwrite node npm install -g appdmg mkdir -p ${{ github.workspace }}/compressed_archive wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O ${{ github.workspace }}/compressed_archive/7z2301-src.7z 7z x ${{ github.workspace }}/compressed_archive/7z2301-src.7z -o${{ github.workspace }}/compressed_archive/lib7zip - name: Import Code Signing Certificate if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: apple-actions/import-codesign-certs@v2 with: p12-file-base64: ${{ secrets.MACOS_CERTIFICATE_P12_BASE64 }} p12-password: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} - name: Build env: MACOSX_DEPLOYMENT_TARGET: "10.13" run: | VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" SKIP_CODESIGN="${{ env.IS_FORK }}" SKIP_CODESIGN=$(echo "$SKIP_CODESIGN" | tr '[:upper:]' '[:lower:]') ./compileOSX.sh $VERSION ${{ needs.initialization.outputs.build_number }} $SKIP_CODESIGN Qt5 x86_64 - name: Build and run tests run: | cd tests qmake make check TESTARGS="-maxwarnings 100000" - name: Notarize if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') run: | xcrun notarytool submit *.dmg --apple-id "${{ secrets.MACOS_APPLE_ID }}" --team-id "${{ secrets.MACOS_TEAM_ID }}" --password "${{ secrets.MACOS_APP_PASSWORD }}" --wait xcrun stapler staple *.dmg - name: Upload DMG uses: actions/upload-artifact@v4 with: name: macos-${{ needs.initialization.outputs.build_number }}-dmg path: "*.dmg" # Windows x64 Qt5 build windows-x64: name: Windows x64 (Qt5) runs-on: windows-2022 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.10' architecture: 'x64' - name: Install dependencies shell: cmd run: | pip install -U pip pip install aqtinstall mkdir C:\Qt python -m aqt install-qt windows desktop 5.15.2 win64_msvc2019_64 -O c:\Qt dir C:\Qt\5.15.2\msvc2019_64\bin choco install -y wget choco install innosetup mkdir %GITHUB_WORKSPACE%\compressed_archive wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z 7z x %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z -o%GITHUB_WORKSPACE%\compressed_archive\lib7zip wget "https://aka.ms/vs/17/release/vc_redist.x64.exe" -O %GITHUB_WORKSPACE%\vc_redist.x64.exe - name: Build shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" set PATH=C:\Qt\5.15.2\msvc2019_64\bin;%PATH% set DEFINES_VAR=DEFINES+="BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"" qmake CONFIG+="7zip" %DEFINES_VAR% nmake - name: Run tests shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" set PATH=C:\Qt\5.15.2\msvc2019_64\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" - name: Create installer shell: cmd working-directory: ci/win run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" set PATH=C:\Qt\5.15.2\msvc2019_64\bin;%PATH% .\create_installer.cmd x64 7z ${{ needs.initialization.outputs.build_number }} qt5 - name: Verify installer was created if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') shell: pwsh run: | if (-not (Test-Path "ci/win/Output/YACReader*.exe")) { throw "Installer file was not created" } Get-ChildItem "ci/win/Output/YACReader*.exe" - name: Upload unsigned installer if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: actions/upload-artifact@v4 id: upload_unsigned with: name: windows-x64-unsigned-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe - name: Submit to SignPath if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: signpath/github-action-submit-signing-request@v1 with: api-token: ${{ secrets.SIGNPATH_API_TOKEN }} organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} project-slug: 'yacreader' signing-policy-slug: ${{ github.ref == 'refs/heads/master' && 'release-signing' || 'test-signing' }} artifact-configuration-slug: 'windows-installer' github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }} wait-for-completion: true output-artifact-directory: ci/win/Output/signed - name: Replace with signed installer if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') shell: pwsh run: | $signedFiles = Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" foreach ($signedFile in $signedFiles) { $destPath = "ci/win/Output/$($signedFile.Name)" Move-Item -Path $signedFile.FullName -Destination $destPath -Force } Remove-Item -Path "ci/win/Output/signed" -Recurse -Force -ErrorAction SilentlyContinue - name: Upload installer uses: actions/upload-artifact@v4 with: name: windows-x64-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe # Windows x64 Qt6 build windows-x64-qt6: name: Windows x64 (Qt6) runs-on: windows-2022 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.10' architecture: 'x64' - name: Install dependencies shell: cmd run: | pip install -U pip pip install aqtinstall mkdir C:\Qt python -m aqt install-qt windows desktop 6.3.1 win64_msvc2019_64 -O c:\Qt -m qt5compat qtmultimedia qtimageformats dir C:\Qt\6.3.1\msvc2019_64\bin choco install -y wget choco install innosetup mkdir %GITHUB_WORKSPACE%\compressed_archive wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z 7z x %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z -o%GITHUB_WORKSPACE%\compressed_archive\lib7zip wget "https://aka.ms/vs/17/release/vc_redist.x64.exe" -O %GITHUB_WORKSPACE%\vc_redist.x64.exe - name: Check MSVC installations shell: pwsh run: | Write-Host "=== Checking for VS 2019 installation ===" if (Test-Path "C:\Program Files (x86)\Microsoft Visual Studio\2019") { Get-ChildItem "C:\Program Files (x86)\Microsoft Visual Studio\2019" -Recurse -Depth 2 } else { Write-Host "VS 2019 path does not exist" } Write-Host "`n=== Checking VS 2022 MSVC Tools ===" if (Test-Path "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC") { Get-ChildItem "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC" } Write-Host "`n=== Testing vcvars with -vcvars_ver=14.29 ===" cmd /c '"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=14.29 && set' | Select-String -Pattern "MSVC|VCTools" - name: Build shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=14.29 set PATH=C:\Qt\6.3.1\msvc2019_64\bin;%PATH% set DEFINES_VAR=DEFINES+="BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"" qmake CONFIG+="7zip" %DEFINES_VAR% nmake - name: Run tests shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=14.29 set PATH=C:\Qt\6.3.1\msvc2019_64\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" - name: Create installer shell: cmd working-directory: ci/win run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" -vcvars_ver=14.29 set PATH=C:\Qt\6.3.1\msvc2019_64\bin;%PATH% .\create_installer.cmd x64 7z ${{ needs.initialization.outputs.build_number }} qt6 - name: Verify installer was created if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') shell: pwsh run: | if (-not (Test-Path "ci/win/Output/YACReader*.exe")) { throw "Installer file was not created" } Get-ChildItem "ci/win/Output/YACReader*.exe" - name: Upload unsigned installer if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: actions/upload-artifact@v4 id: upload_unsigned with: name: windows-x64-qt6-unsigned-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe - name: Submit to SignPath if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: signpath/github-action-submit-signing-request@v1 with: api-token: ${{ secrets.SIGNPATH_API_TOKEN }} organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} project-slug: 'yacreader' signing-policy-slug: ${{ github.ref == 'refs/heads/master' && 'release-signing' || 'test-signing' }} artifact-configuration-slug: 'windows-installer-qt6' github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }} wait-for-completion: true output-artifact-directory: ci/win/Output/signed - name: Replace with signed installer if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') shell: pwsh run: | $signedFiles = Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" foreach ($signedFile in $signedFiles) { $destPath = "ci/win/Output/$($signedFile.Name)" Move-Item -Path $signedFile.FullName -Destination $destPath -Force } Remove-Item -Path "ci/win/Output/signed" -Recurse -Force -ErrorAction SilentlyContinue - name: Upload installer uses: actions/upload-artifact@v4 with: name: windows-x64-qt6-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe # Windows x86 Qt5 build windows-x86: name: Windows x86 (Qt5) runs-on: windows-2022 needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.10' architecture: 'x64' - name: Install dependencies shell: cmd run: | pip install -U pip pip install aqtinstall mkdir C:\Qt python -m aqt install-qt windows desktop 5.15.2 win32_msvc2019 -O c:\Qt dir C:\Qt\5.15.2\msvc2019\bin choco install -y wget choco install innosetup mkdir %GITHUB_WORKSPACE%\compressed_archive wget "https://github.com/YACReader/yacreader-7z-deps/blob/main/7z2301-src.7z?raw=true" -O %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z 7z x %GITHUB_WORKSPACE%\compressed_archive\7z2301-src.7z -o%GITHUB_WORKSPACE%\compressed_archive\lib7zip wget "https://aka.ms/vs/17/release/vc_redist.x86.exe" -O %GITHUB_WORKSPACE%\vc_redist.x86.exe - name: Build shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" set PATH=C:\Qt\5.15.2\msvc2019\bin;%PATH% set DEFINES_VAR=DEFINES+="BUILD_NUMBER=\\\\\\\"${{ needs.initialization.outputs.build_number }}\\\\\\\"" qmake CONFIG+="7zip" %DEFINES_VAR% nmake - name: Run tests shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" set PATH=C:\Qt\5.15.2\msvc2019\bin;%PATH% nmake check TESTARGS="-maxwarnings 100000" - name: Create installer shell: cmd working-directory: ci/win run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat" set PATH=C:\Qt\5.15.2\msvc2019\bin;%PATH% .\create_installer.cmd x86 7z ${{ needs.initialization.outputs.build_number }} qt5 - name: Verify installer was created if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') shell: pwsh run: | if (-not (Test-Path "ci/win/Output/YACReader*.exe")) { throw "Installer file was not created" } Get-ChildItem "ci/win/Output/YACReader*.exe" - name: Upload unsigned installer if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: actions/upload-artifact@v4 id: upload_unsigned with: name: windows-x86-unsigned-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe - name: Submit to SignPath if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') uses: signpath/github-action-submit-signing-request@v1 with: api-token: ${{ secrets.SIGNPATH_API_TOKEN }} organization-id: ${{ secrets.SIGNPATH_ORGANIZATION_ID }} project-slug: 'yacreader' signing-policy-slug: ${{ github.ref == 'refs/heads/master' && 'release-signing' || 'test-signing' }} artifact-configuration-slug: 'windows-installer-x86' github-artifact-id: ${{ steps.upload_unsigned.outputs.artifact-id }} wait-for-completion: true output-artifact-directory: ci/win/Output/signed - name: Replace with signed installer if: github.repository == 'YACReader/yacreader' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/develop') shell: pwsh run: | $signedFiles = Get-ChildItem -Path "ci/win/Output/signed" -Filter "*.exe" foreach ($signedFile in $signedFiles) { $destPath = "ci/win/Output/$($signedFile.Name)" Move-Item -Path $signedFile.FullName -Destination $destPath -Force } Remove-Item -Path "ci/win/Output/signed" -Recurse -Force -ErrorAction SilentlyContinue - name: Upload installer uses: actions/upload-artifact@v4 with: name: windows-x86-${{ needs.initialization.outputs.build_number }} path: ci/win/Output/YACReader*.exe # Docker amd64 build docker-amd64: name: Docker amd64 Image runs-on: ubuntu-latest needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build amd64 Image working-directory: docker run: | docker build --no-cache --platform linux/amd64 -f Dockerfile -t yacreader/yacreaderlibraryserver:develop-amd64 . docker save yacreader/yacreaderlibraryserver:develop-amd64 -o amd64.tar - name: Upload Docker Image uses: actions/upload-artifact@v4 with: name: docker-amd64 path: docker/amd64.tar # Docker arm64 build docker-arm64: name: Docker arm64 Image runs-on: ubuntu-latest needs: [initialization, code-format-validation] steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build arm64 Image working-directory: docker run: | docker buildx create --use docker buildx inspect --bootstrap docker buildx build --no-cache --platform linux/arm64 -f Dockerfile.aarch64 -t yacreader/yacreaderlibraryserver:develop-arm64 --load . docker save yacreader/yacreaderlibraryserver:develop-arm64 -o arm64.tar - name: Upload Docker Image uses: actions/upload-artifact@v4 with: name: docker-arm64 path: docker/arm64.tar # Publish dev builds publish-dev-builds: name: Publish Dev Builds if: github.repository == 'YACReader/yacreader' && github.ref == 'refs/heads/develop' runs-on: ubuntu-24.04 needs: - initialization - linux - linux-qt6 - linux-qt6-7zip - macos - macos-qt6-universal - windows-x86 - windows-x64 - windows-x64-qt6 - docker-amd64 - docker-arm64 steps: - uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Flatten artifacts run: | mkdir -p staging find artifacts -type f -exec cp {} staging/ \; - name: Get version id: version run: | VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' ).${{ needs.initialization.outputs.build_number }}" echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Push Docker Images run: | for arch in amd64 arm64; do docker load -i staging/${arch}.tar docker push yacreader/yacreaderlibraryserver:develop-${arch} rm staging/${arch}.tar done docker buildx imagetools create \ -t yacreader/yacreaderlibraryserver:develop \ yacreader/yacreaderlibraryserver:develop-amd64 \ yacreader/yacreaderlibraryserver:develop-arm64 - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: repository: YACReader/yacreader-dev-builds tag_name: ${{ steps.version.outputs.version }} name: ${{ steps.version.outputs.version }} target_commitish: 25313e3d4d03fcbe44d3943db23bc03bbd1a5205 files: staging/* env: GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} # Publish release builds publish-release: name: Publish Release if: github.repository == 'YACReader/yacreader' && github.ref == 'refs/heads/master' runs-on: ubuntu-24.04 needs: - initialization - linux - linux-qt6 - linux-qt6-7zip - macos - macos-qt6-universal - windows-x86 - windows-x64 - windows-x64-qt6 - docker-amd64 - docker-arm64 steps: - uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Flatten artifacts run: | mkdir -p staging find artifacts -type f -exec cp {} staging/ \; - name: Get version id: version run: | VERSION="$(cat common/yacreader_global.h | grep '#define VERSION "' | tr -d '#define VERSION' | tr -d '"' )" echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Push Docker Images run: | for arch in amd64 arm64; do docker load -i staging/${arch}.tar docker tag yacreader/yacreaderlibraryserver:develop-${arch} yacreader/yacreaderlibraryserver:latest-${arch} docker push yacreader/yacreaderlibraryserver:latest-${arch} rm staging/${arch}.tar done docker buildx imagetools create \ -t yacreader/yacreaderlibraryserver:latest \ yacreader/yacreaderlibraryserver:latest-amd64 \ yacreader/yacreaderlibraryserver:latest-arm64 docker buildx imagetools create \ -t yacreader/yacreaderlibraryserver:${{ steps.version.outputs.version }} \ yacreader/yacreaderlibraryserver:latest-amd64 \ yacreader/yacreaderlibraryserver:latest-arm64 - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ steps.version.outputs.version }} name: ${{ steps.version.outputs.version }} files: staging/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}