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
57 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,78 @@ | ||
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: 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: Checkout source | ||
uses: actions/checkout@v4 | ||
with: | ||
path: src | ||
|
||
- 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: 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 git | ||
# 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: | | ||
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 | ||
- name: Cache msvc-wine | ||
id: msvc-wine-cache | ||
uses: actions/cache@v4 | ||
with: | ||
path: .msvc | ||
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-languages version information | ||
working-directory: gamedir-languages | ||
run: | | ||
- name: Download and install msvc-wine | ||
if: steps.msvc-wine-cache.outputs.cache-hit != 'true' | ||
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 | ||
git clone https://github.com/mstorsjo/msvc-wine.git | ||
./msvc-wine/vsdownload.py --dest .msvc --accept-license --architecture x86 | ||
./msvc-wine/install.sh .msvc | ||
- name: Show version information summary | ||
run: | | ||
- name: Add msvc-wine to path | ||
run: |- | ||
set -eux | ||
cat dist/versions.env | ||
echo "$GITHUB_WORKSPACE/.msvc/bin/x86" >> "$GITHUB_PATH" | ||
- name: check everything | ||
run: |- | ||
echo $PATH | ||
find "$GITHUB_WORKSPACE/.msvc" | ||
- name: Upload | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: versions.env | ||
path: dist/ | ||
- name: Configure | ||
if: false | ||
run: >- | ||
touch CMakePresets.json && CC=cl CXX=cl cmake -S src -B build -DCMAKE_SYSTEM_NAME=Windows -G"Ninja Multi-Config" | ||
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 | ||
if: false | ||
run: >- | ||
cmake --build build -- -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.