name: CI on: push: paths-ignore: - '.editorconfig' - '.gitattributes' - '.github/*_TEMPLATE/**' - '.github/workflows/localisation.yml' - '.gitignore' - '.vscode/**' pull_request: paths-ignore: - '.editorconfig' - '.gitattributes' - '.github/*_TEMPLATE/**' - '.github/workflows/localisation.yml' - '.gitignore' - '.vscode/**' defaults: run: shell: bash env: OPENRCT2_BUILD_SERVER: GitHub OPENRCT2_ORG_TOKEN: ${{ secrets.OPENRCT2_ORG_TOKEN }} BACKTRACE_IO_TOKEN: ${{ secrets.BACKTRACE_IO_TOKEN }} OPENRCT2_VERSION: 0.4.10 # https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value concurrency: group: ${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: lint-commit: name: Lint Commit Message if: github.event_name == 'pull_request' runs-on: ubuntu-latest env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Lint Commit Messages uses: wagoid/commitlint-github-action@v5 with: configFile: .commitlint.json check-code-formatting: name: Check code formatting runs-on: ubuntu-latest container: openrct2/openrct2-build:4-format defaults: run: shell: sh steps: - name: Checkout uses: actions/checkout@v4 - name: Run clang-format run: scripts/check-code-formatting check-changelog-formatting: name: Check changelog formatting runs-on: ubuntu-latest defaults: run: shell: bash steps: - name: Checkout uses: actions/checkout@v4 - name: Run check-changelog-formatting run: scripts/check-changelog-formatting g2dat: name: g2.dat runs-on: ubuntu-latest steps: - name: Checkout OpenRCT2 uses: actions/checkout@v4 with: path: OpenRCT2 - name: Download gxc run: | curl -Lo tools.tar.gz https://github.com/IntelOrca/libsawyer/releases/download/v1.3.0/libsawyer-tools-linux-x64.tar.gz mkdir -p "$GITHUB_WORKSPACE/bin" tar -C "$GITHUB_WORKSPACE/bin" -xf tools.tar.gz echo "$GITHUB_WORKSPACE/bin" >> $GITHUB_PATH - name: Build g2.dat run: | gxc build g2.dat OpenRCT2/resources/g2/sprites.json - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: g2.dat path: g2.dat windows: name: Windows runs-on: windows-latest needs: check-code-formatting strategy: fail-fast: false matrix: platform: [win32, x64, arm64] env: PLATFORM: ${{ matrix.platform }} steps: - name: Setup environment run: | BRANCH=$(echo $GITHUB_REF | cut -d'/' -f 3) if [[ $BRANCH == 'develop' || $BRANCH == 'master' ]]; then echo "CONFIGURATION=ReleaseLTCG" >> "$GITHUB_ENV" else echo "CONFIGURATION=Release" >> "$GITHUB_ENV" fi - name: Checkout uses: actions/checkout@v4 - name: Git describe for shallow checkout id: ghd uses: proudust/gh-describe@v2 - name: Update GA environment run: echo "OPENRCT2_DESCRIBE=${{ steps.ghd.outputs.describe }}" >> $GITHUB_ENV - name: Install MSVC problem matcher uses: ammaraskar/msvc-problem-matcher@master - name: Build OpenRCT2 run: . scripts/setenv && build - name: Build artifacts run: | . scripts/setenv -q build-portable build-symbols build-installer -i - name: Upload artifacts (CI) uses: actions/upload-artifact@v4 with: name: OpenRCT2-${{ runner.os }}-${{ matrix.platform }} path: artifacts if-no-files-found: error - name: Run Tests if: matrix.platform != 'arm64' run: . scripts/setenv -q && run-tests - name: Test Summary uses: test-summary/action@v2 with: paths: "artifacts/test-**.xml" if: matrix.platform != 'arm64' - name: Upload artifacts (openrct2.org) run: | . scripts/setenv if [[ "$OPENRCT2_PUSH" == "true" ]]; then upload-build artifacts/openrct2-portable-*.zip "windows-portable-$PLATFORM.zip" $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH upload-build artifacts/openrct2-installer-*.exe "windows-installer-$PLATFORM.exe" $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH upload-build artifacts/openrct2-symbols-*.zip "windows-symbols-$PLATFORM.zip" $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH upload-backtrace-symbols artifacts/openrct2-symbols-*.zip else echo 'Not going to push build' fi windows-mingw: name: Windows (${{ matrix.platform_name }}) using mingw runs-on: ubuntu-latest needs: check-code-formatting container: openrct2/openrct2-build:14-mingw strategy: fail-fast: false matrix: platform: [win32] include: - platform: win32 platform_name: win32 cache_key: windows-mingw build_flags: -DBUILD_SHARED_LIBS=ON -DENABLE_SCRIPTING=ON steps: - name: Checkout uses: actions/checkout@v4 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.11 # https://github.com/hendrikmuhs/ccache-action/issues/181 with: key: ${{ matrix.cache_key }} - name: Install GCC problem matcher uses: ammaraskar/gcc-problem-matcher@master - name: Build OpenRCT2 run: | sudo su cmake -B bin -G Ninja -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Release -DDISABLE_IPO=on -DFORCE32=on ${{ matrix.build_flags }} cd bin ninja -k0 - name: Upload artifacts (CI) if: matrix.platform == 'NT5.1' uses: actions/upload-artifact@v4 with: name: OpenRCT2-Windows-${{ matrix.platform }} path: bin/openrct2.exe if-no-files-found: error macos-cmake: name: macOS (${{ matrix.arch }}) using CMake runs-on: macos-12 needs: check-code-formatting strategy: fail-fast: false matrix: arch: [x64, arm64] include: - arch: x64 cache_key: macos-x64 # Note: only build/run tests on the native architecture of the CI agent # GitHub macos-12 agents are all Intel, but as of 2024-04-25 new images, e.g. macos-14 (current macos-latest) are arm64 # See https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories build_flags: -DARCH="x86_64" -DWITH_TESTS=on run_tests: true - arch: arm64 cache_key: macos-arm64 build_flags: -DARCH="arm64" run_tests: false steps: - name: Checkout uses: actions/checkout@v4 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.11 # https://github.com/hendrikmuhs/ccache-action/issues/181 with: key: ${{ matrix.cache_key }} - name: Configure ccache run: | # See https://github.com/hendrikmuhs/ccache-action/issues/146 ccache --set-config=compiler_check=content - name: Install GCC problem matcher uses: ammaraskar/gcc-problem-matcher@master - name: Build OpenRCT2 run: | HOMEBREW_NO_ANALYTICS=1 brew install ninja pkg-config . scripts/setenv -q && build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=on ${{ matrix.build_flags }} - name: Build artifacts run: | . scripts/setenv mkdir -p artifacts mv bin/OpenRCT2.app artifacts echo -e "\033[0;36mCompressing OpenRCT2.app...\033[0m" cd artifacts zip -rqy openrct2-macos.zip OpenRCT2.app - name: Upload artifacts (CI) uses: actions/upload-artifact@v4 with: name: OpenRCT2-${{ runner.os }}-${{ matrix.arch }}-cmake path: artifacts/openrct2-macos.zip if-no-files-found: error - name: Run Tests if: ${{matrix.run_tests}} run: . scripts/setenv -q && run-tests - name: Test Summary uses: test-summary/action@v2 with: paths: "artifacts/test-**.xml" if: ${{matrix.run_tests}} macos-universal: name: macOS universal app bundle runs-on: macos-12 needs: macos-cmake steps: - name: Checkout uses: actions/checkout@v4 - name: download x64 app bundle uses: actions/download-artifact@v4 with: name: OpenRCT2-${{ runner.os }}-x64-cmake path: macos_universal/x64 - name: download arm64 app bundle uses: actions/download-artifact@v4 with: name: OpenRCT2-${{ runner.os }}-arm64-cmake path: macos_universal/arm64 - name: Make Universal app bundle run: | . scripts/setenv cd macos_universal unzip x64/openrct2-macos.zip -d x64 unzip arm64/openrct2-macos.zip -d arm64 create-macos-universal - name: Create artifact run: | . scripts/setenv mkdir -p artifacts mv macos_universal/OpenRCT2-universal.app artifacts/OpenRCT2.app echo -e "\033[0;36mCompressing OpenRCT2.app...\033[0m" cd artifacts zip -rqy openrct2-macos.zip OpenRCT2.app - name: Upload artifacts (CI) uses: actions/upload-artifact@v4 with: name: OpenRCT2-${{ runner.os }}-universal path: artifacts/openrct2-macos.zip if-no-files-found: error - name: Upload artifacts (openrct2.org) run: | . scripts/setenv if [[ "$OPENRCT2_PUSH" == "true" ]]; then upload-build artifacts/openrct2-macos.zip macos-universal.zip $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH else echo 'Not going to push build' fi linux-portable: name: ${{ matrix.distro }} Linux (${{ matrix.release }}, ${{ matrix.platform }}, portable) runs-on: ubuntu-latest needs: check-code-formatting container: ${{ matrix.image }} strategy: fail-fast: false matrix: include: # Use `-fno-var-tracking-assignments` to reduce amount of produced debug information. This is necessary due to 100MiB limit of GitHub / openrct2.org API. - platform: x86_64 distro: Ubuntu release: jammy image: openrct2/openrct2-build:14-jammy build_flags: -DCMAKE_POSITION_INDEPENDENT_CODE=on -DCMAKE_CXX_FLAGS="-g -gz -fno-var-tracking-assignments" - platform: x86_64 distro: Debian release: bullseye image: openrct2/openrct2-build:14-bullseye build_flags: -DCMAKE_POSITION_INDEPENDENT_CODE=on -DCMAKE_CXX_FLAGS="-g -gz -fno-var-tracking-assignments" -DWITH_TESTS=off - platform: i686 distro: Ubuntu release: jammy image: openrct2/openrct2-build:14-jammy32 build_flags: -DFORCE32=ON -DENABLE_SCRIPTING=OFF -DCMAKE_CXX_FLAGS="-m32 -g -gz" -DWITH_TESTS=off steps: - name: Checkout uses: actions/checkout@v4 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.11 # https://github.com/hendrikmuhs/ccache-action/issues/181 with: key: linux-${{ matrix.platform }}-${{ matrix.distro }} - name: Get pre-reqs run: . scripts/setenv && get-discord-rpc - name: Install GCC problem matcher uses: ammaraskar/gcc-problem-matcher@master - name: Build OpenRCT2 run: . scripts/setenv -q && build -DWITH_TESTS=on -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DPORTABLE=ON ${{ matrix.build_flags }} - name: Build artifacts run: . scripts/setenv -q && build-portable artifacts/OpenRCT2-${{ runner.os }}-${{ matrix.distro }}-${{ matrix.platform }}.tar.gz bin/install/usr - name: Upload artifacts (CI) uses: actions/upload-artifact@v4 with: name: OpenRCT2-${{ runner.os }}-${{ matrix.distro }}-${{ matrix.platform }} path: artifacts if-no-files-found: error - name: Run Tests run: . scripts/setenv -q && run-tests - name: Upload artifacts (openrct2.org) run: | # Build identification code: https://github.com/Limetric/OpenRCT2.org/blob/e5b738f3dadcc5a3b78e8dfd434756ff31eaa1d3/src/misc/releaseAsset.js#L94-L116 . scripts/setenv -q if [[ "$OPENRCT2_PUSH" == "true" ]]; then upload-build artifacts/OpenRCT2-${{ runner.os }}-${{ matrix.distro }}-${{ matrix.platform }}.tar.gz linux-${{ matrix.platform }}-${{ matrix.distro }}.tar.gz $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH else echo 'Not going to push build' fi linux-appimage: name: Ubuntu Linux (AppImage, x86_64) runs-on: ubuntu-latest needs: check-code-formatting container: openrct2/openrct2-build:14-jammy steps: - name: Checkout uses: actions/checkout@v4 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.11 # https://github.com/hendrikmuhs/ccache-action/issues/181 with: key: linux-appimage - name: Get pre-reqs run: . scripts/setenv -q && get-discord-rpc - name: Build OpenRCT2 run: . scripts/setenv -q && build -DCMAKE_BUILD_TYPE=Release -DAPPIMAGE=ON -DOPENRCT2_USE_CCACHE=on - name: Build AppImage run: . scripts/setenv -q && build-appimage - name: Upload artifacts (CI) uses: actions/upload-artifact@v4 with: name: OpenRCT2-AppImage path: artifacts if-no-files-found: error - name: Upload artifacts (openrct2.org) run: | # Build identification code: https://github.com/Limetric/OpenRCT2.org/blob/e5b738f3dadcc5a3b78e8dfd434756ff31eaa1d3/src/misc/releaseAsset.js#L94-L116 . scripts/setenv -q if [[ "$OPENRCT2_PUSH" == "true" ]]; then upload-build artifacts/OpenRCT2-x86_64.AppImage linux.AppImage $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH else echo 'Not going to push build' fi linux-docker: name: Ubuntu Linux (Docker) needs: check-code-formatting if: github.repository == 'OpenRCT2/OpenRCT2' runs-on: ubuntu-latest steps: - name: Checkout image uses: actions/checkout@v4 with: repository: OpenRCT2/openrct2-docker - name: Build image run: docker build -t openrct2/openrct2-cli:develop develop/cli - name: Push image env: OPENRCT2_DOCKER_USER: ${{ secrets.OPENRCT2_DOCKER_USER }} OPENRCT2_DOCKER_PASS: ${{ secrets.OPENRCT2_DOCKER_PASS }} run: | OPENRCT2_BRANCH=$(echo "$GITHUB_REF" | sed 's/refs\/heads\///') echo "Current branch is $OPENRCT2_BRANCH" if [ "$OPENRCT2_BRANCH" = 'develop' ]; then docker login -u "$OPENRCT2_DOCKER_USER" -p "$OPENRCT2_DOCKER_PASS" docker push openrct2/openrct2-cli:develop else echo 'Image not pushed' fi linux-clang: name: Ubuntu Linux (jammy, debug, [http, network, flac, vorbis OpenGL] disabled) using clang runs-on: ubuntu-latest needs: check-code-formatting container: openrct2/openrct2-build:14-jammy steps: - name: Checkout uses: actions/checkout@v4 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.11 # https://github.com/hendrikmuhs/ccache-action/issues/181 with: key: linux-clang - name: Install GCC problem matcher uses: ammaraskar/gcc-problem-matcher@master - name: Build OpenRCT2 run: . scripts/setenv && build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Debug -DDISABLE_NETWORK=ON -DDISABLE_HTTP=ON -DDISABLE_FLAC=ON -DDISABLE_VORBIS=ON -DDISABLE_OPENGL=ON linux-clang-tests: name: Ubuntu Linux (debug) using clang, coverage enabled runs-on: ubuntu-latest needs: check-code-formatting container: openrct2/openrct2-build:14-jammy steps: - name: Checkout uses: actions/checkout@v4 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.11 # https://github.com/hendrikmuhs/ccache-action/issues/181 with: key: linux-clang - name: Install GCC problem matcher uses: ammaraskar/gcc-problem-matcher@master - name: Build OpenRCT2 run: . scripts/setenv && build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fprofile-instr-generate -fcoverage-mapping" -DWITH_TESTS=on - name: Run Tests run: . scripts/setenv -q && LLVM_PROFILE_FILE="openrct2-coverage-%p.profraw" run-tests - name: Test Summary uses: test-summary/action@v2 with: paths: "artifacts/test-**.xml" if: always() - name: Process coverage information run: | cd bin llvm-profdata merge -sparse openrct2-coverage*profraw -o openrct2.profdata llvm-cov export -instr-profile=openrct2.profdata ./OpenRCT2Tests > coverage.json llvm-cov report ./OpenRCT2Tests -instr-profile=openrct2.profdata xz -1v openrct2.profdata xz -1v coverage.json xz -1v OpenRCT2Tests - name: Upload artifacts (CI) uses: actions/upload-artifact@v4 with: name: OpenRCT2-${{ runner.os }}-coverage path: | bin/*profdata* bin/coverage.json* bin/OpenRCT2Tests.xz if-no-files-found: error android: name: Android runs-on: ubuntu-latest needs: check-code-formatting container: openrct2/openrct2-build:14-android steps: - name: Checkout uses: actions/checkout@v4 - name: ccache uses: hendrikmuhs/ccache-action@v1.2.11 # https://github.com/hendrikmuhs/ccache-action/issues/181 with: key: android - name: Install GCC problem matcher uses: ammaraskar/gcc-problem-matcher@master - name: Build OpenRCT2 run: | . scripts/setenv pushd src/openrct2-android ./gradlew app:assembleRelease popd mkdir -p artifacts mv src/openrct2-android/app/build/outputs/apk/release/app-release.apk artifacts/openrct2-arm.apk - name: Upload artifacts (CI) uses: actions/upload-artifact@v4 with: name: OpenRCT2-Android path: artifacts if-no-files-found: error - name: Upload artifacts (openrct2.org) run: | . scripts/setenv -q if [[ "$OPENRCT2_PUSH" == "true" ]]; then upload-build artifacts/openrct2-arm.apk android-arm.apk $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH else echo 'Not going to push build' fi