From fefce0337928d72d4a947b074e41035a1854bd8b Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Mon, 23 Aug 2021 10:56:03 +0800 Subject: [PATCH] GHA CI: Backport latest changes (#15361) By having unified github workflows, the building cache would be utilized more efficiently as the total cache size will be smaller (no more vcpkg caching on macOS CI) and will stop thrashing the build cache (large vcpkg cache evicts other smaller cache). Relevant PRs: #15321 #15340 #15342 #15355 --- .github/workflows/ci.yaml | 240 -------------------------- .github/workflows/ci_file_health.yaml | 20 +++ .github/workflows/ci_macos.yaml | 73 ++++++++ .github/workflows/ci_ubuntu.yaml | 84 +++++++++ .github/workflows/ci_webui.yaml | 32 ++++ .github/workflows/ci_windows.yaml | 85 +++++++++ .github/workflows/file_health.yaml | 22 --- .github/workflows/webui_ci.yaml | 31 ---- 8 files changed, 294 insertions(+), 293 deletions(-) delete mode 100644 .github/workflows/ci.yaml create mode 100644 .github/workflows/ci_file_health.yaml create mode 100644 .github/workflows/ci_macos.yaml create mode 100644 .github/workflows/ci_ubuntu.yaml create mode 100644 .github/workflows/ci_webui.yaml create mode 100644 .github/workflows/ci_windows.yaml delete mode 100644 .github/workflows/file_health.yaml delete mode 100644 .github/workflows/webui_ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 79df9e671..000000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,240 +0,0 @@ -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: [pull_request, push] - -env: - VCPKG_COMMIT: e4ce66eecfd3e5cca5eac06c971921bf8e37cf88 - VCPKG_DEST_MACOS: /Users/runner/qbt_tools/vcpkg - VCPKG_DEST_WIN: C:\qbt_tools\vcpkg - LIBTORRENT_VERSION_TAG: v1.2.12 - -jobs: - - ci_ubuntu: - name: Ubuntu - - strategy: - matrix: - os: [ubuntu-20.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 - - - name: install all build dependencies except libtorrent from Ubuntu repos - run: | - sudo apt update - 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.LIBTORRENT_VERSION_TAG }} - 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 - with: - name: qBittorrent-CI_${{ matrix.os }}-x64_${{ 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 - - # - 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@v4 - 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" - ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe upgrade ` - --overlay-triplets=${{ github.workspace }}/triplets_overlay ` - --overlay-ports=${{ github.workspace }}/vcpkg ` - --no-dry-run - foreach($package in $packages) - { - ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe install $package ` - --overlay-triplets=${{ github.workspace }}/triplets_overlay ` - --overlay-ports=${{ github.workspace }}/vcpkg ` - --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 - - - 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 ^ - -DMSVC_RUNTIME_DYNAMIC=OFF ^ - --graphviz=build\target_graph.dot - cmake --build build - - - name: upload artifact as zip - uses: actions/upload-artifact@v2 - with: - name: qBittorrent-CI_Windows-x64 - 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 - - # - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement) - # - automake is needed for the installation the vcpkg installation of fontconfig, a dependency of qt5-base - - name: install additional required packages with homebrew - shell: bash - run: | - brew install automake ninja - - - name: setup vcpkg (cached, if possible) - uses: lukka/run-vcpkg@v4 - 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)","set(VCPKG_OSX_DEPLOYMENT_TARGET 10.15)" - - - 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" - ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg upgrade ` - --overlay-triplets=${{ github.workspace }}/triplets_overlay ` - --overlay-ports=${{ github.workspace }}/vcpkg ` - --no-dry-run - foreach($package in $packages) - { - ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg install $package ` - --overlay-triplets=${{ github.workspace }}/triplets_overlay ` - --overlay-ports=${{ github.workspace }}/vcpkg ` - --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 - with: - name: qBittorrent-CI_macOS_${{ matrix.qbt_gui }} - path: | - build/compile_commands.json - build/target_graph.dot - build/qbittorrent.app - build/qbittorrent-nox.app diff --git a/.github/workflows/ci_file_health.yaml b/.github/workflows/ci_file_health.yaml new file mode 100644 index 000000000..07bd98ec2 --- /dev/null +++ b/.github/workflows/ci_file_health.yaml @@ -0,0 +1,20 @@ +name: CI - File health + +on: [pull_request, push] + +jobs: + ci: + name: Check + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install tools + run: | + sudo apt update + sudo apt install zsh + + - name: Check files + run: | + ./.github/workflows/file_health.sh diff --git a/.github/workflows/ci_macos.yaml b/.github/workflows/ci_macos.yaml new file mode 100644 index 000000000..a86844a03 --- /dev/null +++ b/.github/workflows/ci_macos.yaml @@ -0,0 +1,73 @@ +name: CI - macOS +on: [pull_request, push] + +jobs: + ci: + name: Build + runs-on: macos-10.15 + + strategy: + matrix: + libt_version: ["v1.2.12"] + qbt_gui: ["GUI=ON", "GUI=OFF"] + fail-fast: false + + env: + openssl_root: /usr/local/opt/openssl@1.1 + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Setup ccache + uses: hendrikmuhs/ccache-action@v1 + with: + key: ${{ runner.os }} + + - name: Install dependencies + run: | + brew update > /dev/null + brew install \ + cmake ninja \ + boost openssl@1.1 qt@5 zlib + brew link --force \ + qt@5 + # workaround for cmake + Qt + sudo ln -s /usr/local/opt/qt@5/mkspecs /usr/local/mkspecs + sudo ln -s /usr/local/opt/qt@5/plugins /usr/local/plugins + + - name: Install libtorrent + run: | + git clone --branch ${{ matrix.libt_version }} --depth 1 https://github.com/arvidn/libtorrent.git + cd libtorrent + git submodule update --init --recursive + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + cmake \ + -B build \ + -G "Ninja" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_CXX_STANDARD=17 \ + -Ddeprecated-functions=OFF \ + -DOPENSSL_ROOT_DIR="${{ env.openssl_root }}" + cmake --build build + sudo cmake --install build + + - name: Build qBittorrent + run: | + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + cmake \ + -B build \ + -G "Ninja" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -D${{ matrix.qbt_gui }} \ + -DVERBOSE_CONFIGURE=ON \ + -DOPENSSL_ROOT_DIR="${{ env.openssl_root }}" + cmake --build build + + - name: Upload build artifacts + uses: actions/upload-artifact@v2 + with: + name: qBittorrent-CI_macOS_${{ matrix.qbt_gui }}_libtorrent-${{ matrix.libt_version }} + path: | + build/qbittorrent.app + build/qbittorrent-nox.app diff --git a/.github/workflows/ci_ubuntu.yaml b/.github/workflows/ci_ubuntu.yaml new file mode 100644 index 000000000..a696b4de2 --- /dev/null +++ b/.github/workflows/ci_ubuntu.yaml @@ -0,0 +1,84 @@ +name: CI - Ubuntu +on: [pull_request, push] + +jobs: + ci: + name: Build + runs-on: ubuntu-20.04 + + strategy: + matrix: + libt_version: ["v1.2.12"] + qbt_gui: ["GUI=ON", "GUI=OFF"] + fail-fast: false + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Setup ccache + uses: hendrikmuhs/ccache-action@v1 + with: + key: ${{ runner.os }} + + - name: Install dependencies + run: | + sudo apt update + 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 + # sudo apt install libqt5svg5-dev qtbase5-dev qttools5-dev # the Qt version in the standard repositories is too old... + + # this will be installed under /opt/qt515. CMake will still find it automatically without additional hints + # to speed up the process, only the required components are installed rather than the full qt515-meta-full metapackage + - name: Install Qt + run: | + sudo add-apt-repository ppa:beineri/opt-qt-5.15.2-focal + sudo apt install \ + qt515base qt515svg qt515tools + + - name: Install libtorrent + run: | + git clone --branch ${{ matrix.libt_version }} --depth 1 https://github.com/arvidn/libtorrent.git + cd libtorrent + git submodule update --init --recursive + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + cmake \ + -B build \ + -G "Ninja" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -Ddeprecated-functions=OFF \ + --graphviz=cmake-build-dir/target_graph.dot + cmake --build build + sudo cmake --install build + + - name: Build qBittorrent + run: | + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + cmake \ + -B build \ + -G "Ninja" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -D${{ matrix.qbt_gui }} \ + -DVERBOSE_CONFIGURE=ON \ + --graphviz=build/target_graph.dot + cmake --build build + + - name: Install qBittorrent + run: sudo cmake --install build + + - name: Upload build artifacts + uses: actions/upload-artifact@v2 + with: + name: qBittorrent-CI_ubuntu-20.04-x64_${{ matrix.qbt_gui }}_libtorrent-${{ matrix.libt_version }} + path: | + build/compile_commands.json + build/install_manifest.txt + build/target_graph.dot + build/qbittorrent + build/qbittorrent-nox + libtorrent/cmake-build-dir/compile_commands.json + libtorrent/cmake-build-dir/target_graph.dot diff --git a/.github/workflows/ci_webui.yaml b/.github/workflows/ci_webui.yaml new file mode 100644 index 000000000..0c234b270 --- /dev/null +++ b/.github/workflows/ci_webui.yaml @@ -0,0 +1,32 @@ +name: CI - WebUI + +on: [pull_request, push] + +jobs: + ci: + name: Check + runs-on: ubuntu-latest + + defaults: + run: + working-directory: src/webui/www + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Setup nodejs + uses: actions/setup-node@v2 + with: + node-version: 'lts/*' + + - name: Install tools + run: npm install + + - name: Lint code + run: npm run lint + + - name: Format code + run: | + npm run format + git diff --exit-code diff --git a/.github/workflows/ci_windows.yaml b/.github/workflows/ci_windows.yaml new file mode 100644 index 000000000..37e68342b --- /dev/null +++ b/.github/workflows/ci_windows.yaml @@ -0,0 +1,85 @@ +name: CI - Windows +on: [pull_request, push] + +jobs: + ci: + name: Build + runs-on: windows-2019 + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install build tools + run: | + choco install ninja + + # use the preinstalled vcpkg from image + # https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md#package-management + - name: Setup vcpkg + uses: lukka/run-vcpkg@v7 + with: + vcpkgDirectory: C:/vcpkg + doNotUpdateVcpkg: true # the preinstalled vcpkg is updated regularly + setupOnly: true + + # tell vcpkg to only build Release variants of the dependencies + - name: Configure vcpkg triplet overlay + 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 + 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" + ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe upgrade ` + --overlay-triplets="${{ github.workspace }}/triplets_overlay" ` + --no-dry-run + ${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe install ` + --overlay-triplets="${{ github.workspace }}/triplets_overlay" ` + --clean-after-build ` + $packages + + # 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 + + - name: Build qBittorrent + run: | + cmake ` + -B build ` + -G "Ninja" ` + -DCMAKE_BUILD_TYPE=RelWithDebInfo ` + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ` + -DCMAKE_TOOLCHAIN_FILE="${{ env.RUNVCPKG_VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" ` + -DMSVC_RUNTIME_DYNAMIC=OFF ` + -DVCPKG_TARGET_TRIPLET=x64-windows-static-release ` + -DVERBOSE_CONFIGURE=ON ` + --graphviz=build/target_graph.dot + cmake --build build + + - name: Upload build artifacts + uses: actions/upload-artifact@v2 + with: + name: qBittorrent-CI_Windows-x64 + path: | + build/compile_commands.json + build/qbittorrent.exe + build/qbittorrent.pdb + build/target_graph.dot + dist/windows/qt.conf diff --git a/.github/workflows/file_health.yaml b/.github/workflows/file_health.yaml deleted file mode 100644 index aeadcf31e..000000000 --- a/.github/workflows/file_health.yaml +++ /dev/null @@ -1,22 +0,0 @@ -name: GitHub Actions file health check - -on: [pull_request, push] - -jobs: - check_file_health: - name: Check file health - - runs-on: ubuntu-20.04 - - steps: - - name: checkout repository - uses: actions/checkout@v2 - - - name: install zsh - run: | - sudo apt update - sudo apt install zsh - - - name: run check file health script - run: | - ./.github/workflows/file_health.sh diff --git a/.github/workflows/webui_ci.yaml b/.github/workflows/webui_ci.yaml deleted file mode 100644 index aa836523d..000000000 --- a/.github/workflows/webui_ci.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: WebUI CI - -on: [pull_request, push] - -jobs: - check_webui: - name: Check WebUI - runs-on: ubuntu-20.04 - defaults: - run: - working-directory: src/webui/www - - steps: - - name: checkout repository - uses: actions/checkout@v2 - - - name: setup nodejs - uses: actions/setup-node@v2 - with: - node-version: '14' - - - name: install tools - run: npm install - - - name: lint code - run: npm run lint - - - name: format code - run: | - npm run format - git diff --exit-code