name: CI
on: [push, pull_request]
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.3.5.1
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@v2
        with:
          fetch-depth: 0
      - name: Lint Commit Messages
        uses: wagoid/commitlint-github-action@v3
        with:
          configFile: .commitlint.json
  check-code-formatting:
    name: Check code formatting
    runs-on: ubuntu-latest
    container:
      image: openrct2/openrct2-build:0.3.1-format
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Run clang-format
        shell: sh
        run: scripts/check-code-formatting
  windows:
    name: Windows
    runs-on: windows-latest
    needs: check-code-formatting
    strategy:
      fail-fast: false
      matrix:
        platform: [win32, x64]
    env:
      CONFIGURATION: Release
      PLATFORM: ${{ matrix.platform }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - 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@v2
        with:
          name: OpenRCT2-${{ runner.os }}-${{ matrix.platform }}
          path: artifacts
          if-no-files-found: error
      - name: Run Tests
        run: . scripts/setenv -q && run-tests
      - name: Upload artifacts (openrct2.org)
        run: |
          . scripts/setenv -q
          if [[ "$OPENRCT2_PUSH" == "true" ]]; then
              upload-build artifacts/openrct2-portable-*.zip "windows-portable-$PLATFORM" $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH
              upload-build artifacts/openrct2-installer-*.exe "windows-installer-$PLATFORM" $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH
              upload-build artifacts/openrct2-symbols-*.zip "windows-symbols-$PLATFORM" $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:
      image: openrct2/openrct2-build:0.3.1-mingw
    strategy:
      fail-fast: false
      matrix:
        platform: [win32, NT5.1]
        include:
          - platform: win32
            platform_name: win32
            cache_key: windows-mingw
            build_flags: -DBUILD_SHARED_LIBS=ON -DENABLE_SCRIPTING=OFF
          - platform: NT5.1
            platform_name: win32, NT5.1
            cache_key: windows-mingw-nt51
            build_flags: -DDISABLE_HTTP=Off -DENABLE_SCRIPTING=ON -DCMAKE_CXX_FLAGS="-Wno-error=cast-function-type -Wno-error=unused-function" -DSTATIC=on -DMINGW_TARGET_NT5_1=ON
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: ccache
        uses: hendrikmuhs/ccache-action@v1
        with:
          key: ${{ matrix.cache_key }}
      - name: Build OpenRCT2
        run: |
          sudo su
          mkdir bin && cd bin
          cmake .. -G Ninja -DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DCMAKE_BUILD_TYPE=Release -DDISABLE_IPO=on -DFORCE32=on ${{ matrix.build_flags }}
          ninja -k0
      - name: Upload artifacts (CI)
        if: matrix.platform == 'NT5.1'
        uses: actions/upload-artifact@v2
        with:
          name: OpenRCT2-${{ matrix.platform }}
          path: bin/openrct2.exe
          if-no-files-found: error
  macos-cmake:
    name: macOS (${{ matrix.arch }}) using CMake
    runs-on: macos-latest
    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-latest agents are currently all Intel
            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@v2
      - name: ccache
        uses: hendrikmuhs/ccache-action@v1
        with:
          key: ${{ matrix.cache_key }}
      - name: Build OpenRCT2
        run: |
          HOMEBREW_NO_ANALYTICS=1 brew install ninja
          . scripts/setenv -q && build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=on ${{ matrix.build_flags }}
      - name: Run Tests
        if: ${{matrix.run_tests}}
        run: . scripts/setenv -q && run-tests
      - 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@v2
        with:
          name: OpenRCT2-${{ runner.os }}-${{ matrix.arch }}-cmake
          path: artifacts/openrct2-macos.zip
          if-no-files-found: error
  macos-universal:
    name: macOS universal app bundle
    runs-on: macos-latest
    needs: macos-cmake
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: download x64 app bundle
        uses: actions/download-artifact@v2
        with:
          name: OpenRCT2-${{ runner.os }}-x64-cmake
          path: macos_universal/x64
      - name: download arm64 app bundle
        uses: actions/download-artifact@v2
        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@v2
        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 $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH
          else
              echo 'Not going to push build'
          fi
  linux-portable:
    name: Linux (${{ matrix.platform }}, portable)
    runs-on: ubuntu-latest
    needs: check-code-formatting
    container:
      image: ${{ matrix.image }}
    strategy:
      fail-fast: false
      matrix:
        platform: [x86_64, i686]
        include:
          - platform: x86_64
            image: openrct2/openrct2-build:0.3.1-bionic
            cache_key: linux-portable
            build_flags: -DCMAKE_POSITION_INDEPENDENT_CODE=on -DCMAKE_CXX_FLAGS="-g -gz"
          - platform: i686
            image: openrct2/openrct2-build:0.3.1-bionic32
            cache_key: linux-portable-32
            build_flags: -DFORCE32=ON -DENABLE_SCRIPTING=OFF -DCMAKE_CXX_FLAGS="-m32 -gz"
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: ccache
        uses: hendrikmuhs/ccache-action@v1
        with:
          key: ${{ matrix.cache_key }}
      - name: Get pre-reqs
        run: . scripts/setenv && get-discord-rpc
      - 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.platform }}.tar.gz bin/install/usr
      - name: Upload artifacts (CI)
        uses: actions/upload-artifact@v2
        with:
          name: OpenRCT2-${{ runner.os }}-${{ matrix.platform }}
          path: artifacts
          if-no-files-found: error
      - name: Run Tests
        run: . scripts/setenv -q && run-tests
      - name: Upload artifacts (openrct2.org)
        run: |
          . scripts/setenv -q
          if [[ "$OPENRCT2_PUSH" == "true" ]]; then
              upload-build artifacts/OpenRCT2-${{ runner.os }}-${{ matrix.platform }}.tar.gz linux-${{ matrix.platform }} $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH
          else
              echo 'Not going to push build'
          fi
  linux-appimage:
    name: Linux (x64, AppImage)
    runs-on: ubuntu-latest
    needs: check-code-formatting
    container:
      image: openrct2/openrct2-build:0.3.1-bionic
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: ccache
        uses: hendrikmuhs/ccache-action@v1
        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@v2
        with:
          name: OpenRCT2-AppImage
          path: artifacts
          if-no-files-found: error
  linux-flathub-beta:
    name: Linux (Flathub beta channel)
    if: github.repository == 'OpenRCT2/OpenRCT2' && github.ref == 'refs/heads/develop' && github.event_name == 'push'
    runs-on: ubuntu-latest
    steps:
      - name: Send dispatch event to OpenRCT2 Flathub repository
        uses: peter-evans/repository-dispatch@v1
        with:
          token: ${{ secrets.OPENRCT2_FLATHUB_TOKEN }}
          repository: flathub/io.openrct2.OpenRCT2
          event-type: openrct2_develop_push
          client-payload: '{ "commit": "${{ github.sha }}" }'
  linux-docker:
    name: Linux (docker)
    needs: check-code-formatting
    if: github.repository == 'OpenRCT2/OpenRCT2'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout image
        uses: actions/checkout@v2
        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: Linux (Debug, [http, network, OpenGL] disabled) using clang
    runs-on: ubuntu-latest
    needs: check-code-formatting
    container:
      image: openrct2/openrct2-build:0.3.1-bionic
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: ccache
        uses: hendrikmuhs/ccache-action@v1
        with:
          key: linux-clang
      - 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_OPENGL=ON
  android:
    name: Android
    runs-on: ubuntu-latest
    needs: check-code-formatting
    container:
      image: openrct2/openrct2-build:0.3.1-android
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: ccache
        uses: hendrikmuhs/ccache-action@v1
        with:
          key: android
      - name: Build OpenRCT2
        run: |
          . scripts/setenv
          pushd src/openrct2-android
            ./gradlew app:assemblePR
          popd
          mkdir -p artifacts
          mv src/openrct2-android/app/build/outputs/apk/arm/pr/app-arm-pr.apk artifacts/openrct2-arm.apk
      - name: Upload artifacts (CI)
        uses: actions/upload-artifact@v2
        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 $OPENRCT2_VERSION $OPENRCT2_SHA1 $OPENRCT2_BRANCH
          else
              echo 'Not going to push build'
          fi
