From eed50c48931a7f91592a59e7fead14f9b67d1f2d Mon Sep 17 00:00:00 2001 From: FranciscoPombal Date: Wed, 29 Jul 2020 15:20:04 +0100 Subject: [PATCH] Add GitHub Actions CI workflow - Ubuntu 18.04/20.04, GUI ON/OFF - Windows 2019 - macOS 10.15 GUI ON/OFF --- .github/workflows/ci.yaml | 242 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 000000000..92aaa4ace --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,242 @@ +name: GitHub Actions CI + +# Cache is used for all Windows and macOS dependencies (size approx. 1230 * 2 + 1850 = 4310 MiB) +# Cache is not used for Ubuntu builds, because it already has all dependencies except +# the appropriate libtorrent version, which only takes 3-5 minutes to build from source anyway + +on: + push: + branches: [ master ] + pull_request: + types: [edited, opened, reopened, synchronize] + branches: [ master ] + +env: + # Qt: 5.15.0 + # libtorrent: RC_1_2 HEAD, 1.2.10 + VCPKG_COMMIT: 32eccc18191fbb57b159784a1724d2d00613ae82 + VCPKG_DEST_MACOS: /Users/runner/qbt_tools/vcpkg + VCPKG_DEST_WIN: C:\qbt_tools\vcpkg + UBUNTU_LIBTORRENT_VERSION: libtorrent-1.2.10 + +jobs: + + ci_ubuntu: + name: Ubuntu + + strategy: + matrix: + os: [ubuntu-20.04, ubuntu-18.04] + qbt_gui: ["GUI=ON", "GUI=OFF"] + fail-fast: false + + runs-on: ${{ matrix.os }} + + defaults: + run: + shell: bash + + steps: + - name: checkout repository + uses: actions/checkout@v2.3.2 + + - name: install all build dependencies except libtorrent from Ubuntu repos + run: | + sudo apt install \ + build-essential cmake git ninja-build pkg-config \ + libssl-dev libgeoip-dev zlib1g-dev \ + libboost-dev libboost-chrono-dev libboost-random-dev libboost-system-dev \ + libqt5svg5-dev qtbase5-dev qttools5-dev + + - name: install libtorrent from source + run: | + git clone https://github.com/arvidn/libtorrent && cd libtorrent + git checkout ${{ env.UBUNTU_LIBTORRENT_VERSION }} + cmake -B cmake-build-dir -G "Ninja" \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -Ddeprecated-functions=OFF \ + --graphviz=cmake-build-dir/target_graph.dot + cmake --build cmake-build-dir + sudo cmake --install cmake-build-dir --prefix /usr/local + + - name: build qBittorrent + run: | + cmake -B build -G "Ninja" \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -D${{ matrix.qbt_gui }} \ + -DVERBOSE_CONFIGURE=ON \ + --graphviz=build/target_graph.dot + cmake --build build + + - name: upload artifact as zip + uses: actions/upload-artifact@v2.1.3 + with: + name: qBittorrent-CI-Ubuntu_${{ matrix.os }}-${{ matrix.qbt_gui }} + path: | + build/compile_commands.json + build/target_graph.dot + build/qbittorrent + build/qbittorrent-nox + libtorrent/cmake-build-dir/compile_commands.json + libtorrent/cmake-build-dir/target_graph.dot + + ci_windows: + name: Windows + vcpkg + + runs-on: windows-2019 + + defaults: + run: + shell: pwsh + + steps: + - name: checkout repository + uses: actions/checkout@v2.3.2 + + # - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement) + - name: install additional required packages with chocolatey + run: | + choco install ninja + + - name: setup vcpkg (cached, if possible) + uses: lukka/run-vcpkg@v3.3 + with: + vcpkgDirectory: ${{ env.VCPKG_DEST_WIN }} + vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }} + setupOnly: true + + # Tell vcpkg to only build Release variants of the dependencies + - name: configure vcpkg triplet overlay for release builds only + run: | + New-Item -Path ${{ github.workspace }} -Name "triplets_overlay" -ItemType Directory + Copy-Item ${{ env.RUNVCPKG_VCPKG_ROOT }}/triplets/x64-windows-static.cmake ` + ${{ github.workspace }}/triplets_overlay/x64-windows-static-release.cmake + Add-Content ${{ github.workspace }}/triplets_overlay/x64-windows-static-release.cmake ` + -Value "set(VCPKG_BUILD_TYPE release)" + + # clear buildtrees after each package installation to reduce disk space requirements + - name: install dependencies via vcpkg + run: | + $packages = ` + "boost-circular-buffer:x64-windows-static-release", + "libtorrent:x64-windows-static-release", + "qt5-base:x64-windows-static-release", + "qt5-svg:x64-windows-static-release", + "qt5-tools:x64-windows-static-release", + "qt5-winextras:x64-windows-static-release" + foreach($package in $packages) + { + ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe install $package ` + --overlay-triplets=${{ github.workspace }}/triplets_overlay ` + --clean-after-build + } + + # NOTE: this is necessary to correctly find and use cl.exe with the Ninja generator for now + - name: setup devcmd + uses: ilammy/msvc-dev-cmd@v1.3.0 + + - name: build qBittorrent + shell: cmd + run: | + cmake -B build -G "Ninja" ^ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo ^ + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_DEST_WIN }}\scripts\buildsystems\vcpkg.cmake ^ + -DVCPKG_TARGET_TRIPLET=x64-windows-static-release ^ + -DVERBOSE_CONFIGURE=ON ^ + --graphviz=build\target_graph.dot + cmake --build build + + - name: upload artifact as zip + uses: actions/upload-artifact@v2.1.3 + with: + name: qBittorrent-CI-Windows_x64-static-release + path: | + build/compile_commands.json + build/target_graph.dot + build/qbittorrent.exe + build/qbittorrent.pdb + dist/windows/qt.conf + + ci_macos: + name: macOS + vcpkg + + strategy: + matrix: + qbt_gui: ["GUI=ON", "GUI=OFF"] + fail-fast: false + + runs-on: macos-10.15 + + defaults: + run: + shell: pwsh + + steps: + - name: checkout repository + uses: actions/checkout@v2.3.2 + + # - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement) + # - pkg-config is needed for some vcpkg installations + - name: install additional required packages with homebrew + shell: bash + run: | + brew install ninja pkg-config + + - name: setup vcpkg (cached, if possible) + uses: lukka/run-vcpkg@v3.3 + with: + vcpkgDirectory: ${{ env.VCPKG_DEST_MACOS }} + vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }} + setupOnly: true + + - name: configure vcpkg triplet overlay for release builds only + run: | + New-Item -Path ${{ github.workspace }} -Name "triplets_overlay" -ItemType Directory + Copy-Item ${{ env.RUNVCPKG_VCPKG_ROOT }}/triplets/x64-osx.cmake ` + ${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake + Add-Content ${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake ` + -Value "set(VCPKG_BUILD_TYPE release)" + + # NOTE: Avoids a libtorrent ABI issue. See https://github.com/arvidn/libtorrent/issues/4965 + - name: force AppleClang to compile libtorrent with C++14 + run: | + (Get-Content -path ${{ env.RUNVCPKG_VCPKG_ROOT }}/ports/libtorrent/portfile.cmake).Replace( ` + '${FEATURE_OPTIONS}', '${FEATURE_OPTIONS} -DCMAKE_CXX_STANDARD=14') ` + | Set-Content -Path ${{ env.RUNVCPKG_VCPKG_ROOT }}/ports/libtorrent/portfile.cmake + + - name: install dependencies via vcpkg + run: | + $packages = ` + "boost-circular-buffer:x64-osx-release", + "libtorrent:x64-osx-release", + "qt5-base:x64-osx-release", + "qt5-svg:x64-osx-release", + "qt5-tools:x64-osx-release", + "qt5-macextras:x64-osx-release" + foreach($package in $packages) + { + ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg install $package ` + --overlay-triplets=${{ github.workspace }}/triplets_overlay ` + --clean-after-build + } + + - name: build qBittorrent + shell: bash + run: | + cmake -B build -G "Ninja" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_DEST_MACOS }}/scripts/buildsystems/vcpkg.cmake \ + -DVCPKG_TARGET_TRIPLET=x64-osx-release \ + -D${{ matrix.qbt_gui }} \ + -DVERBOSE_CONFIGURE=ON \ + --graphviz=build/target_graph.dot + cmake --build build + + - name: upload artifact as zip + uses: actions/upload-artifact@v2.1.3 + with: + name: qBittorrent-CI-macOS_x64-static-release_${{ matrix.qbt_gui }} + path: | + build/compile_commands.json + build/target_graph.dot + build/qbittorrent.app + build/qbittorrent-nox.app