mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-22 22:13:35 +02:00
74a4a10f48
- Markdown will now be validated as part of Github CI - Applied auto-fix to most common issues (mostly whitespace related) - Fixed manually some of more complex cases Some valid markdownlint rules are currently disabled, to avoid failing CI, can be enabled in future
411 lines
15 KiB
YAML
411 lines
15 KiB
YAML
name: VCMI
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- beta
|
|
- master
|
|
- develop
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
|
BUILD_TYPE: Release
|
|
|
|
jobs:
|
|
build:
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- platform: linux-qt6
|
|
os: ubuntu-24.04
|
|
test: 0
|
|
before_install: linux_qt6.sh
|
|
preset: linux-clang-test
|
|
- platform: linux
|
|
os: ubuntu-24.04
|
|
test: 1
|
|
before_install: linux_qt5.sh
|
|
preset: linux-gcc-test
|
|
- platform: linux
|
|
os: ubuntu-20.04
|
|
test: 0
|
|
before_install: linux_qt5.sh
|
|
preset: linux-gcc-debug
|
|
- platform: mac-intel
|
|
os: macos-13
|
|
test: 0
|
|
pack: 1
|
|
upload: 1
|
|
pack_type: Release
|
|
extension: dmg
|
|
before_install: macos.sh
|
|
preset: macos-conan-ninja-release
|
|
conan_profile: macos-intel
|
|
conan_prebuilts: dependencies-mac-intel
|
|
conan_options: --options with_apple_system_libs=True
|
|
artifact_platform: intel
|
|
- platform: mac-arm
|
|
os: macos-13
|
|
test: 0
|
|
pack: 1
|
|
upload: 1
|
|
pack_type: Release
|
|
extension: dmg
|
|
before_install: macos.sh
|
|
preset: macos-arm-conan-ninja-release
|
|
conan_profile: macos-arm
|
|
conan_prebuilts: dependencies-mac-arm
|
|
conan_options: --options with_apple_system_libs=True
|
|
artifact_platform: arm
|
|
- platform: ios
|
|
os: macos-13
|
|
test: 0
|
|
pack: 1
|
|
upload: 1
|
|
pack_type: Release
|
|
extension: ipa
|
|
before_install: macos.sh
|
|
preset: ios-release-conan-ccache
|
|
conan_profile: ios-arm64
|
|
conan_prebuilts: dependencies-ios
|
|
conan_options: --options with_apple_system_libs=True
|
|
- platform: msvc-x64
|
|
os: windows-latest
|
|
test: 0
|
|
pack: 1
|
|
upload: 1
|
|
pack_type: RelWithDebInfo
|
|
extension: exe
|
|
before_install: msvc.sh
|
|
preset: windows-msvc-release
|
|
- platform: msvc-x86
|
|
os: windows-latest
|
|
test: 0
|
|
pack: 1
|
|
pack_type: RelWithDebInfo
|
|
extension: exe
|
|
before_install: msvc.sh
|
|
preset: windows-msvc-release-x86
|
|
- platform: mingw_x86_64
|
|
os: ubuntu-24.04
|
|
test: 0
|
|
pack: 1
|
|
pack_type: Release
|
|
extension: exe
|
|
cmake_args: -G Ninja
|
|
before_install: mingw.sh
|
|
preset: windows-mingw-conan-linux
|
|
conan_profile: mingw64-linux.jinja
|
|
conan_prebuilts: dependencies-mingw-x86-64
|
|
- platform: mingw_x86
|
|
os: ubuntu-24.04
|
|
test: 0
|
|
pack: 1
|
|
pack_type: Release
|
|
extension: exe
|
|
cmake_args: -G Ninja
|
|
before_install: mingw.sh
|
|
preset: windows-mingw-conan-linux
|
|
conan_profile: mingw32-linux.jinja
|
|
conan_prebuilts: dependencies-mingw-x86
|
|
- platform: android-32
|
|
os: ubuntu-24.04
|
|
upload: 1
|
|
extension: apk
|
|
preset: android-conan-ninja-release
|
|
before_install: android.sh
|
|
conan_profile: android-32-ndk
|
|
conan_prebuilts: dependencies-android-armeabi-v7a
|
|
artifact_platform: armeabi-v7a
|
|
- platform: android-64
|
|
os: ubuntu-24.04
|
|
upload: 1
|
|
extension: apk
|
|
preset: android-conan-ninja-release
|
|
before_install: android.sh
|
|
conan_profile: android-64-ndk
|
|
conan_prebuilts: dependencies-android-arm64-v8a
|
|
artifact_platform: arm64-v8a
|
|
runs-on: ${{ matrix.os }}
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Prepare CI
|
|
if: "${{ matrix.before_install != '' }}"
|
|
run: source '${{github.workspace}}/CI/before_install/${{matrix.before_install}}'
|
|
env:
|
|
VCMI_BUILD_PLATFORM: x64
|
|
|
|
- name: Install Conan Dependencies
|
|
if: "${{ matrix.conan_prebuilts != '' }}"
|
|
run: source '${{github.workspace}}/CI/install_conan_dependencies.sh' '${{matrix.conan_prebuilts}}'
|
|
|
|
- name: Install vcpkg Dependencies
|
|
if: ${{ startsWith(matrix.platform, 'msvc') }}
|
|
run: source '${{github.workspace}}/CI/install_vcpkg_dependencies.sh' '${{matrix.platform}}'
|
|
|
|
# ensure the ccache for each PR is separate so they don't interfere with each other
|
|
# fall back to ccache of the vcmi/vcmi repo if no PR-specific ccache is found
|
|
- name: ccache for PRs
|
|
uses: hendrikmuhs/ccache-action@v1.2
|
|
if: ${{ github.event.number != '' }}
|
|
with:
|
|
key: ${{ matrix.preset }}-PR-${{ github.event.number }}
|
|
restore-keys: |
|
|
${{ matrix.preset }}-PR-${{ github.event.number }}
|
|
${{ matrix.preset }}-no-PR
|
|
# actual cache takes up less space, at most ~1 GB
|
|
max-size: "5G"
|
|
verbose: 2
|
|
|
|
- name: ccache for everything but PRs
|
|
uses: hendrikmuhs/ccache-action@v1.2
|
|
if: ${{ (github.repository == 'vcmi/vcmi' && github.event.number == '' && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/beta' || github.ref == 'refs/heads/master')) || github.repository != 'vcmi/vcmi' }}
|
|
with:
|
|
key: ${{ matrix.preset }}-no-PR
|
|
restore-keys: |
|
|
${{ matrix.preset }}-no-PR
|
|
# actual cache takes up less space, at most ~1 GB
|
|
max-size: "5G"
|
|
verbose: 2
|
|
|
|
- name: Prepare Heroes 3 data
|
|
env:
|
|
HEROES_3_DATA_PASSWORD: ${{ secrets.HEROES_3_DATA_PASSWORD }}
|
|
if: ${{ env.HEROES_3_DATA_PASSWORD != '' && matrix.test == 1 }}
|
|
run: |
|
|
if [[ ${{github.repository_owner}} == vcmi ]]
|
|
then
|
|
data_url="https://github.com/vcmi-mods/vcmi-test-data/releases/download/v1.0/h3_assets.zip"
|
|
else
|
|
data_url="https://github.com/${{github.repository_owner}}/vcmi-test-data/releases/download/v1.0/h3_assets.zip"
|
|
fi
|
|
wget --progress=dot:giga "$data_url" -O h3_assets.zip
|
|
7za x h3_assets.zip -p$HEROES_3_DATA_PASSWORD
|
|
mkdir -p ~/.local/share/vcmi/
|
|
mv h3_assets/* ~/.local/share/vcmi/
|
|
|
|
- name: Install Conan
|
|
if: "${{ matrix.conan_profile != '' }}"
|
|
run: pipx install 'conan<2.0'
|
|
|
|
- name: Install Conan profile
|
|
if: "${{ matrix.conan_profile != '' }}"
|
|
run: |
|
|
conan profile new default --detect
|
|
conan install . \
|
|
--install-folder=conan-generated \
|
|
--no-imports \
|
|
--build=never \
|
|
--profile:build=default \
|
|
--profile:host=CI/conan/${{ matrix.conan_profile }} \
|
|
${{ matrix.conan_options }}
|
|
env:
|
|
GENERATE_ONLY_BUILT_CONFIG: 1
|
|
|
|
# Workaround for gradle not discovering SDK that was installed via conan
|
|
- name: Find Android NDK
|
|
if: ${{ startsWith(matrix.platform, 'android') }}
|
|
run: sudo ln -s -T /home/runner/.conan/data/android-ndk/r25c/_/_/package/4db1be536558d833e52e862fd84d64d75c2b3656/bin /usr/local/lib/android/sdk/ndk/25.2.9519653
|
|
|
|
- name: Install Java
|
|
uses: actions/setup-java@v4
|
|
if: ${{ startsWith(matrix.platform, 'android') }}
|
|
with:
|
|
distribution: 'temurin'
|
|
java-version: '11'
|
|
|
|
# a hack to build ID for x64 build in order for Google Play to allow upload of both 32 and 64 bit builds
|
|
- name: Bump Android x64 build ID
|
|
if: ${{ matrix.platform == 'android-64' }}
|
|
run: perl -i -pe 's/versionCode (\d+)/$x=$1+1; "versionCode $x"/e' android/vcmi-app/build.gradle
|
|
|
|
- name: Build Number
|
|
run: |
|
|
source '${{github.workspace}}/CI/get_package_name.sh'
|
|
if [ '${{ matrix.artifact_platform }}' ]; then
|
|
VCMI_PACKAGE_FILE_NAME+="-${{ matrix.artifact_platform }}"
|
|
fi
|
|
echo VCMI_PACKAGE_FILE_NAME="$VCMI_PACKAGE_FILE_NAME" >> $GITHUB_ENV
|
|
echo VCMI_PACKAGE_NAME_SUFFIX="$VCMI_PACKAGE_NAME_SUFFIX" >> $GITHUB_ENV
|
|
echo VCMI_PACKAGE_GOLDMASTER="$VCMI_PACKAGE_GOLDMASTER" >> $GITHUB_ENV
|
|
env:
|
|
PULL_REQUEST: ${{ github.event.pull_request.number }}
|
|
|
|
- name: Configure
|
|
run: |
|
|
if [[ ${{matrix.preset}} == linux-gcc-test ]]
|
|
then
|
|
cmake -DENABLE_CCACHE:BOOL=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 --preset ${{ matrix.preset }}
|
|
elif [[ (${{matrix.preset}} == android-conan-ninja-release) && (${{github.ref}} != 'refs/heads/master') ]]
|
|
then
|
|
cmake -DENABLE_CCACHE:BOOL=ON -DANDROID_GRADLE_PROPERTIES="applicationIdSuffix=.daily;signingConfig=dailySigning;applicationLabel=VCMI daily" --preset ${{ matrix.preset }}
|
|
elif [[ ${{startsWith(matrix.platform, 'msvc') }} ]]
|
|
then
|
|
cmake --preset ${{ matrix.preset }}
|
|
else
|
|
cmake -DENABLE_CCACHE:BOOL=ON --preset ${{ matrix.preset }}
|
|
fi
|
|
|
|
- name: Build
|
|
run: |
|
|
cmake --build --preset ${{matrix.preset}}
|
|
env:
|
|
ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
|
|
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
|
|
|
|
- name: Test
|
|
env:
|
|
HEROES_3_DATA_PASSWORD: ${{ secrets.HEROES_3_DATA_PASSWORD }}
|
|
if: ${{ env.HEROES_3_DATA_PASSWORD != '' && matrix.test == 1 }}
|
|
run: |
|
|
ctest --preset ${{matrix.preset}}
|
|
|
|
- name: Kill XProtect to work around CPack issue on macOS
|
|
if: ${{ startsWith(matrix.platform, 'mac') }}
|
|
run: |
|
|
# Cf. https://github.com/actions/runner-images/issues/7522#issuecomment-1556766641
|
|
echo Killing...; sudo pkill -9 XProtect >/dev/null || true;
|
|
echo "Waiting..."; counter=0; while pgrep XProtect && ((counter < 20)); do sleep 3; ((counter++)); done
|
|
pgrep XProtect || true
|
|
|
|
- name: Pack
|
|
id: cpack
|
|
if: ${{ matrix.pack == 1 }}
|
|
run: |
|
|
cd '${{github.workspace}}/out/build/${{matrix.preset}}'
|
|
|
|
# Workaround for CPack bug on macOS 13
|
|
counter=0
|
|
until cpack -C ${{matrix.pack_type}} || ((counter > 20)); do
|
|
sleep 3
|
|
((counter++))
|
|
done
|
|
rm -rf _CPack_Packages
|
|
|
|
- name: Artifacts
|
|
if: ${{ matrix.pack == 1 }}
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }}
|
|
compression-level: 0
|
|
path: |
|
|
${{github.workspace}}/out/build/${{matrix.preset}}/${{ env.VCMI_PACKAGE_FILE_NAME }}.${{ matrix.extension }}
|
|
|
|
- name: Find Android package
|
|
if: ${{ startsWith(matrix.platform, 'android') }}
|
|
run: |
|
|
builtApkPath="$(ls ${{ github.workspace }}/out/build/${{ matrix.preset }}/android-build/vcmi-app/build/outputs/apk/release/*.${{ matrix.extension }})"
|
|
builtAabPath="$(ls ${{ github.workspace }}/out/build/${{ matrix.preset }}/android-build/vcmi-app/build/outputs/bundle/release/*.aab)"
|
|
ANDROID_APK_PATH="${{ github.workspace }}/$VCMI_PACKAGE_FILE_NAME.${{ matrix.extension }}"
|
|
ANDROID_AAB_PATH="${{ github.workspace }}/$VCMI_PACKAGE_FILE_NAME.aab"
|
|
mv "$builtApkPath" "$ANDROID_APK_PATH"
|
|
mv "$builtAabPath" "$ANDROID_AAB_PATH"
|
|
echo "ANDROID_APK_PATH=$ANDROID_APK_PATH" >> $GITHUB_ENV
|
|
echo "ANDROID_AAB_PATH=$ANDROID_AAB_PATH" >> $GITHUB_ENV
|
|
|
|
- name: Upload android apk artifacts
|
|
if: ${{ startsWith(matrix.platform, 'android') }}
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }}
|
|
compression-level: 0
|
|
path: |
|
|
${{ env.ANDROID_APK_PATH }}
|
|
|
|
- name: Upload Android aab artifacts
|
|
if: ${{ startsWith(matrix.platform, 'android') && github.ref == 'refs/heads/master' }}
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }} - aab
|
|
compression-level: 0
|
|
path: |
|
|
${{ env.ANDROID_AAB_PATH }}
|
|
|
|
- name: Upload debug symbols
|
|
if: ${{ startsWith(matrix.platform, 'msvc') }}
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }} - symbols
|
|
compression-level: 9
|
|
path: |
|
|
${{github.workspace}}/**/*.pdb
|
|
|
|
- name: Upload build
|
|
if: ${{ (matrix.upload == 1) && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/beta' || github.ref == 'refs/heads/master') }}
|
|
continue-on-error: true
|
|
run: |
|
|
if [ -z '${{ env.ANDROID_APK_PATH }}' ] ; then
|
|
cd '${{github.workspace}}/out/build/${{matrix.preset}}'
|
|
fi
|
|
source '${{github.workspace}}/CI/upload_package.sh'
|
|
env:
|
|
DEPLOY_RSA: ${{ secrets.DEPLOY_RSA }}
|
|
PACKAGE_EXTENSION: ${{ matrix.extension }}
|
|
|
|
deploy-src:
|
|
if: always() && github.ref == 'refs/heads/master'
|
|
runs-on: ubuntu-latest
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Build Number
|
|
run: |
|
|
source '${{github.workspace}}/CI/get_package_name.sh'
|
|
echo VCMI_PACKAGE_FILE_NAME="$VCMI_PACKAGE_FILE_NAME" >> $GITHUB_ENV
|
|
|
|
- name: Create source code archive (including submodules)
|
|
run: |
|
|
git archive HEAD -o "release.tar" --worktree-attributes -v
|
|
git submodule update --init --recursive
|
|
git submodule --quiet foreach 'cd "$toplevel"; tar -rvf "release.tar" "$sm_path"'
|
|
gzip release.tar
|
|
|
|
- name: Upload source code archive
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ env.VCMI_PACKAGE_FILE_NAME }}
|
|
path: |
|
|
./release.tar.gz
|
|
|
|
validate-code:
|
|
if: always()
|
|
runs-on: ubuntu-24.04
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Ensure LF line endings
|
|
run: |
|
|
find . -path ./.git -prune -o -path ./AI/FuzzyLite -prune -o -path ./test/googletest \
|
|
-o -path ./osx -prune -o -type f \
|
|
-not -name '*.png' -and -not -name '*.ttf' -and -not -name '*.wav' -and -not -name '*.webm' -and -not -name '*.ico' -and -not -name '*.bat' -print0 | \
|
|
{ ! xargs -0 grep -l -z -P '\r\n'; }
|
|
|
|
- name: Validate JSON
|
|
run: |
|
|
sudo apt install python3-jstyleson
|
|
python3 CI/validate_json.py
|
|
|
|
- name: Validate Markdown
|
|
uses: DavidAnson/markdownlint-cli2-action@v18
|
|
with:
|
|
config: 'CI/example.markdownlint-cli2.jsonc'
|
|
globs: '**/*.md'
|