forked from 1dot13/source
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
52 additions
and
414 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,219 +1,73 @@ | ||
name: build | ||
|
||
on: | ||
pull_request: | ||
push: | ||
branches: | ||
- '**' | ||
tags: | ||
- 'v*' | ||
# allows to manually trigger a build | ||
workflow_dispatch: | ||
inputs: | ||
build_all_languages: | ||
description: build all languages | ||
required: false | ||
default: false | ||
type: boolean | ||
assemble_release: | ||
description: create release | ||
required: false | ||
default: false | ||
type: boolean | ||
|
||
permissions: | ||
contents: write | ||
manualTrigger: | ||
description: trigger a PR or release run | ||
required: true | ||
default: pr | ||
type: choice | ||
options: | ||
- pr | ||
- release | ||
|
||
jobs: | ||
workflow_setup: | ||
compile: | ||
if: > | ||
(github.event_name == 'pull_request') || | ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.manualTrigger == 'pr') | ||
runs-on: ubuntu-latest | ||
outputs: | ||
languages_json_array: ${{ steps.global_vars.outputs.languages_json_array }} | ||
assemble_release: ${{ steps.global_vars.outputs.assemble_release }} | ||
steps: | ||
- id: global_vars | ||
name: Set global variables | ||
run: | | ||
set -eux | ||
full_release='${{ ( github.repository == '1dot13/source' && github.ref_name == 'master' ) || startsWith(github.ref, 'refs/tags/v') }}' | ||
if [[ '${{ inputs.build_all_languages }}' == 'true' || ( '${{ inputs.build_all_languages }}' == '' && "$full_release" == 'true' ) ]] | ||
then | ||
languages_json_array='["Chinese", "German", "English", "French", "Polish", "Italian", "Dutch", "Russian"]'; | ||
else | ||
# English + some other language for compilation testing | ||
languages_json_array='["German", "English"]' | ||
fi | ||
echo "languages_json_array=$languages_json_array" >> $GITHUB_OUTPUT | ||
if [[ '${{ inputs.assemble_release }}' == 'true' || ( '${{ inputs.assemble_release }}' == '' && "$full_release" == 'true' ) ]] | ||
then | ||
assemble_release='true' | ||
else | ||
assemble_release='false' | ||
fi | ||
echo "assemble_release=$assemble_release" >> $GITHUB_OUTPUT | ||
- name: Install needed packages | ||
run: >- | ||
sudo apt-get update && | ||
sudo apt-get install -y --no-install-recommends --no-install-suggests --no-upgrade | ||
msitools libgcab-dev winbind ninja-build wine-stable | ||
- name: Clone repos metadata | ||
run: | | ||
set -eux | ||
GAMEDIR_REPOSITORY=1dot13/gamedir | ||
GAMEDIR_LANGUAGES_REPOSITORY=1dot13/gamedir-languages | ||
# filter tree is what makes this fast | ||
git clone --config transfer.fsckobjects=false --tags --no-checkout --filter=tree:0 \ | ||
"https://github.com/$GITHUB_REPOSITORY" \ | ||
source | ||
git clone --config transfer.fsckobjects=false --no-checkout --filter=tree:0 \ | ||
https://github.com/$GAMEDIR_REPOSITORY \ | ||
gamedir | ||
git clone --config transfer.fsckobjects=false --no-checkout --filter=tree:0 \ | ||
https://github.com/$GAMEDIR_LANGUAGES_REPOSITORY \ | ||
gamedir-languages | ||
mkdir dist/ | ||
echo -n " | ||
GAMEDIR_REPOSITORY=$GAMEDIR_REPOSITORY | ||
GAMEDIR_LANGUAGES_REPOSITORY=$GAMEDIR_LANGUAGES_REPOSITORY | ||
" > dist/versions.env | ||
- name: Generate source version information | ||
working-directory: source | ||
run: | | ||
set -eux | ||
SOURCE_COMMIT_DATETIME=$(TZ=UTC0 git log -1 --date=iso-strict-local --format=%cd $GITHUB_SHA) | ||
SOURCE_COMMIT_DATE=$(TZ=UTC0 git log -1 --date=short-local --format=%cd $GITHUB_SHA) | ||
# GAME_VERSION is used to detect outdated save games and is the main version used for tracking | ||
if [[ "$GITHUB_REF_TYPE" == 'tag' ]] | ||
then | ||
# if we build for a specific tag, use that as the game version | ||
# examples: | ||
# - v1.13.1 | ||
# - v1.13.2-rc2 | ||
GAME_VERSION="$GITHUB_REF_NAME" | ||
else | ||
# uses `git describe`, which tries to find a tag in the commit hierarchy. or fall back to a v1.13 version | ||
# example five (5) commits after v1.13: | ||
# - v1.13-5-7g7ffa | ||
GAME_VERSION="$(git describe --tags --match='v[0-9]*' $GITHUB_SHA || echo v0-$(git rev-list --skip 1 --count $GITHUB_SHA)-g${GITHUB_SHA:0:8})" | ||
fi | ||
# max 15 CHAR8 | ||
GAME_VERSION="${GAME_VERSION:0:15}" | ||
GAME_BUILD_INFORMATION="$SOURCE_COMMIT_DATE GitHub $GITHUB_REPOSITORY" | ||
# in case of a branch or if the tag is truncated | ||
if [[ "$GAME_VERSION" != *"$GITHUB_REF_NAME"* ]] | ||
then | ||
GAME_BUILD_INFORMATION="$GAME_BUILD_INFORMATION $GITHUB_REF_TYPE $GITHUB_REF_NAME" | ||
fi | ||
# max 255 CHAR16 | ||
GAME_BUILD_INFORMATION="${GAME_BUILD_INFORMATION:0:255}" | ||
echo -n " | ||
SOURCE_COMMIT_DATETIME=$SOURCE_COMMIT_DATETIME | ||
GAME_VERSION=$GAME_VERSION | ||
GAME_BUILD_INFORMATION=$GAME_BUILD_INFORMATION | ||
" >> ../dist/versions.env | ||
- name: Cache msvc-wine | ||
id: msvc-wine-cache | ||
uses: actions/cache@v4 | ||
with: | ||
path: msvc-wine | ||
key: msvc-wine-cache-key | ||
|
||
# due to building everything in parallel, versions should be pinned at the start so everything builds based on the same versions | ||
- name: Generate gamedir version information | ||
working-directory: gamedir | ||
run: | | ||
- name: Download and install msvc-wine | ||
if: steps.msvc-wine-cache.outputs.cache-hit != 'true' | ||
run: |- | ||
set -eux | ||
GAMEDIR_COMMIT_SHA=$(git rev-parse HEAD) | ||
GAMEDIR_COMMIT_DATETIME=$(TZ=UTC0 git log -1 --date=iso-strict-local --format=%cd $GAMEDIR_COMMIT_SHA) | ||
echo -n " | ||
GAMEDIR_COMMIT_SHA=$GAMEDIR_COMMIT_SHA | ||
GAMEDIR_COMMIT_DATETIME=$GAMEDIR_COMMIT_DATETIME | ||
" >> ../dist/versions.env | ||
git clone https://github.com/mstorsjo/msvc-wine.git msvc-wine | ||
cd msvc-wine | ||
./vsdownload.py --dest msvc --accept-license | ||
./install.sh msvc | ||
# due to building everything in parallel, versions should be pinned at the start so everything builds based on the same versions | ||
- name: Generate gamedir-languages version information | ||
working-directory: gamedir-languages | ||
run: | | ||
- name: Add msvc-wine to path | ||
run: |- | ||
set -eux | ||
GAMEDIR_LANGUAGES_COMMIT_SHA=$(git rev-parse HEAD) | ||
GAMEDIR_LANGUAGES_COMMIT_DATETIME=$(TZ=UTC0 git log -1 --date=iso-strict-local --format=%cd $GAMEDIR_LANGUAGES_COMMIT_SHA) | ||
echo -n " | ||
GAMEDIR_LANGUAGES_COMMIT_SHA=$GAMEDIR_LANGUAGES_COMMIT_SHA | ||
GAMEDIR_LANGUAGES_COMMIT_DATETIME=$GAMEDIR_LANGUAGES_COMMIT_DATETIME | ||
" >> ../dist/versions.env | ||
cd msvc-wine/msvc/bin/x86 | ||
echo "$PWD" >> "$GITHUB_PATH" | ||
- name: Show version information summary | ||
run: | | ||
set -eux | ||
cat dist/versions.env | ||
- name: Checkout source | ||
uses: actions/checkout@v4 | ||
|
||
- name: Upload | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: versions.env | ||
path: dist/ | ||
- name: Configure | ||
run: >- | ||
touch CMakePresets.json && | ||
CC=cl CXX=cl cmake -S . -B build -G"Ninja Multi-Config" -DCMAKE_SYSTEM_NAME=Windows | ||
build: | ||
needs: [ workflow_setup ] | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
language: ${{ fromJson(needs.workflow_setup.outputs.languages_json_array) }} | ||
uses: ./.github/workflows/build_language.yml | ||
with: | ||
language: ${{ matrix.language }} | ||
assemble: ${{ needs.workflow_setup.outputs.assemble_release == 'true' }} | ||
# at least English and some other lang have to work | ||
continue-on-error: ${{ matrix.language != 'English' && matrix.language != 'German' }} | ||
- name: Build | ||
run: |- | ||
cmake --build build/ --config Release -- -v | ||
release: | ||
needs: [ workflow_setup, build ] | ||
if: needs.workflow_setup.outputs.assemble_release == 'true' | ||
assemble: | ||
if: > | ||
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') == 'true') || | ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.manualTrigger == 'release') | ||
needs: [ compile ] | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- name: Download artifacts | ||
uses: actions/download-artifact@v4 | ||
with: | ||
path: dist | ||
pattern: '*_release' | ||
merge-multiple: true | ||
|
||
- name: Checkout Repo | ||
if: github.ref == 'refs/heads/master' | ||
uses: actions/checkout@v4 | ||
with: | ||
path: source | ||
fetch-depth: 1 | ||
sparse-checkout: 'README.md' | ||
- name: Create latest pre-release | ||
if: github.ref == 'refs/heads/master' | ||
working-directory: source | ||
run: | | ||
gh release delete latest --cleanup-tag || true | ||
git tag -d latest || true | ||
git push --delete origin refs/tags/latest || true | ||
git tag latest | ||
git push --force origin refs/tags/latest | ||
gh release create latest ../dist/* \ | ||
--generate-notes \ | ||
--title "Latest (unstable)" \ | ||
--verify-tag \ | ||
--prerelease | ||
env: | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
|
||
- name: Upload to tagged release | ||
if: startsWith(github.ref, 'refs/tags/v') | ||
working-directory: source | ||
run: | | ||
exit 0 | ||
gh release upload "$GITHUB_REF_NAME" ../dist/* --clobber | ||
env: | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
- name: Test manual release | ||
run: >- | ||
echo ${{github.event.inputs.manualTrigger}} |
Oops, something went wrong.