Files @ r28360:bb1633c75235
Branch filter:

Location: cpp/openttd-patchpack/source/.github/workflows/release-linux.yml

Patric Stout
Change: [CI] use vcpkg built-in caching mechanism
name: Release (Linux)

on:
  workflow_call:
    inputs:
      survey_key:
        required: false
        type: string
        default: ""

jobs:
  linux:
    name: Linux (Generic)

    runs-on: ubuntu-latest
    container:
      # manylinux2014 is based on CentOS 7, but already has a lot of things
      # installed and preconfigured. It makes it easier to build OpenTTD.
      image: quay.io/pypa/manylinux2014_x86_64

    steps:
    - name: Download source
      uses: actions/download-artifact@v3
      with:
        name: internal-source

    - name: Unpack source
      run: |
        tar -xf source.tar.gz --strip-components=1

    # curl is too old for most of the tools to work properly. For example,
    # rust-toolchain doesn't work properly, neither vcpkg caching.
    # The easier solution here is to upgrade curl.
    - name: Update curl
      run: |
        yum install -y \
          openssl-devel \
          # EOF

        mkdir /curl
        cd /curl
        curl -o curl-7.81.0.zip https://curl.se/download/curl-7.81.0.zip
        unzip curl-7.81.0.zip
        cd curl-7.81.0
        ./configure --with-ssl --with-zlib --prefix=/usr --libdir=/usr/lib64
        make -j $(nproc)
        make install

    - name: Install Rust toolchain
      uses: dtolnay/rust-toolchain@stable

    - name: Enable Rust cache
      uses: Swatinem/rust-cache@v2

    - name: Setup vcpkg caching
      uses: actions/github-script@v6
      with:
        script: |
          core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
          core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
          core.exportVariable('VCPKG_BINARY_SOURCES', 'clear;x-gha,readwrite')

    - name: Install dependencies
      run: |
        echo "::group::Install system dependencies"
        # perl-IPC-Cmd, wget, and zip are needed to run vcpkg.
        # autoconf-archive is needed to build ICU.
        yum install -y \
          autoconf-archive \
          perl-IPC-Cmd \
          wget \
          zip \
          # EOF

        # aclocal looks first in /usr/local/share/aclocal, and if that doesn't
        # exist only looks in /usr/share/aclocal. We have files in both that
        # are important. So copy the latter to the first, and we are good to
        # go.
        cp /usr/share/aclocal/* /usr/local/share/aclocal/
        echo "::endgroup::"

        # The yum variant of fluidsynth depends on all possible audio drivers,
        # like jack, ALSA, pulseaudio, etc. This is not really useful for us,
        # as we route the output of fluidsynth back via our sound driver, and
        # as such do not use these audio driver outputs at all.
        # The vcpkg variant of fluidsynth depends on ALSA. Similar issue here.
        # So instead, we compile fluidsynth ourselves, with as few
        # dependencies as possible. We do it before anything else is installed,
        # to make sure it doesn't pick up on any of the drivers.
        echo "::group::Install fluidsynth"
        wget https://github.com/FluidSynth/fluidsynth/archive/v2.3.3.tar.gz
        tar xf v2.3.3.tar.gz
        (
          cd fluidsynth-2.3.3
          mkdir build
          cd build
          cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
          cmake --build . -j $(nproc)
          cmake --install .
        )

        # The container we use is old enough, that it doesn't know SHF_COMPRESSED.
        # But, breakpad needs this symbol to exist. So we patch it in our system
        # libraries.
        (
          cd /
          patch -p1 < ${GITHUB_WORKSPACE}/os/linux/shf-compressed.patch
        )
        echo "::endgroup::"

        echo "::group::Install audio drivers"
        # These audio libs are to make sure the SDL version of vcpkg adds
        # sound-support; these libraries are not added to the resulting
        # binary, but the headers are used to enable them in SDL.
        yum install -y \
          alsa-lib-devel \
          jack-audio-connection-kit-devel \
          pulseaudio-libs-devel \
          # EOF
        echo "::endgroup::"

        # We use vcpkg for our dependencies, to get more up-to-date version.
        echo "::group::Install vcpkg and dependencies"

        git clone https://github.com/microsoft/vcpkg /vcpkg

        (
          cd /vcpkg
          ./bootstrap-vcpkg.sh -disableMetrics
        )

        # Make Python3 available for other packages. This needs to be done
        # first, as otherwise dependencies fail to build because Python3 is
        # not available.
        /vcpkg/vcpkg install python3
        ln -sf /vcpkg/installed/x64-linux/tools/python3/python3.[0-9][0-9] /usr/bin/python3

        # SDL2 needs dbus, but dbus default install comes with libsystemd
        # and some of libsystemd deps fail to build on our quite old linux.
        # So just install basic dbus without any extra deps.
        /vcpkg/vcpkg install dbus[core]

        # Now we can install OpenTTD dependencies
        /vcpkg/vcpkg install \
          breakpad \
          curl[http2] \
          fontconfig \
          freetype \
          harfbuzz \
          icu \
          liblzma \
          libpng \
          lzo \
          sdl2 \
          zlib \
          # EOF
        echo "::endgroup::"

        echo "::group::Install breakpad dependencies"
        cargo install dump_syms
        echo "::endgroup::"

    - name: Install GCC problem matcher
      uses: ammaraskar/gcc-problem-matcher@master

    - name: Build
      run: |
        mkdir -p build
        cd build

        echo "::group::CMake"
        cmake ${GITHUB_WORKSPACE} \
          -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \
          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
          -DOPTION_SURVEY_KEY=${{ inputs.survey_key }} \
          -DOPTION_PACKAGE_DEPENDENCIES=ON \
          # EOF
        echo "::endgroup::"

        echo "::group::Build"
        echo "Running on $(nproc) cores"
        cmake --build . -j $(nproc) --target openttd
        echo "::endgroup::"

    - name: Create breakpad symbols
      run: |
        cd build
        dump_syms ./openttd --inlines --store symbols

    - name: Create bundles
      run: |
        cd ${GITHUB_WORKSPACE}/build
        echo "::group::Run CPack"
        cpack
        echo "::endgroup::"

        echo "::group::Cleanup"
        # Remove the sha256 files CPack generates; we will do this ourself at
        # the end of this workflow.
        rm -f bundles/*.sha256
        echo "::endgroup::"

    - name: Store bundles
      uses: actions/upload-artifact@v3
      with:
        name: openttd-linux-generic
        path: build/bundles
        retention-days: 5

    - name: Store symbols
      uses: actions/upload-artifact@v3
      with:
        name: symbols-linux-generic
        path: build/symbols
        retention-days: 5