Unbreak Github Actions #181
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
name: build | |
on: | |
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 | |
jobs: | |
workflow_setup: | |
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: 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 | |
# 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 | |
# 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: | | |
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 | |
- name: Show version information summary | |
run: | | |
set -eux | |
cat dist/versions.env | |
- name: Upload | |
uses: actions/upload-artifact@v3 | |
with: | |
name: versions.env | |
path: dist/ | |
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' }} | |
release: | |
needs: [ workflow_setup, build ] | |
if: needs.workflow_setup.outputs.assemble_release == 'true' | |
runs-on: ubuntu-latest | |
steps: | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
path: artifacts | |
- name: Move release archives to dist/ | |
shell: bash | |
run: | | |
set -eux | |
mkdir dist/ | |
mv artifacts/*_release/* dist/ | |
- name: Delete Latest Release and Tag | |
if: github.ref == 'refs/heads/master' | |
uses: dev-drprasad/[email protected] | |
with: | |
delete_release: true | |
tag_name: "latest" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Checkout Repo | |
if: github.ref == 'refs/heads/master' | |
uses: actions/checkout@v3 | |
with: | |
path: source | |
fetch-depth: 1 | |
sparse-checkout: 'README.md' | |
- name: Create Latest Tag | |
if: github.ref == 'refs/heads/master' | |
working-directory: source | |
run: | | |
git tag -d latest || true | |
git tag latest | |
git push origin latest | |
- id: release_latest | |
name: Release Latest | |
if: github.ref == 'refs/heads/master' | |
uses: ncipollo/release-action@v1 | |
with: | |
artifactErrorsFailBuild: true | |
artifacts: dist/* | |
generateReleaseNotes: true | |
makeLatest: true | |
name: "Latest (unstable)" | |
prerelease: true | |
tag: "latest" | |
- id: release_tag | |
name: Release Tag | |
uses: ncipollo/release-action@v1 | |
if: startsWith(github.ref, 'refs/tags/v') | |
with: | |
allowUpdates: true | |
artifactErrorsFailBuild: true | |
artifacts: dist/* | |
draft: false | |
generateReleaseNotes: true | |
makeLatest: true | |
omitBodyDuringUpdate: true | |
omitDraftDuringUpdate: true | |
omitNameDuringUpdate: true | |
omitPrereleaseDuringUpdate: true | |
- name: Show release outputs | |
shell: bash | |
run: | | |
echo 'id: ' | |
echo -n '${{ steps.release_tag.outputs.id }}' | |
echo -n '${{ steps.release_latest.outputs.id }}' | |
echo '' | |
echo '' | |
echo 'url:' | |
echo -n '${{ steps.release_tag.outputs.html_url }}' | |
echo -n '${{ steps.release_latest.outputs.html_url }}' | |
echo '' |