Skip to content

ETLBuild

ETLBuild #21

Workflow file for this run

# ______ _______ _
#| ____| |__ __| | |
#| |__ | | | | ___ __ _ __ _ ___ _ _
#| __| | | | | / _ \ / _` | / _` | / __| | | | |
#| |____ | | | |____ | __/ | (_| | | (_| | | (__ | |_| |
#|______| |_| |______| \___| \__, | \__,_| \___| \__, |
# __/ | __/ |
# |___/ |___/
# 2024 Legacy team
name: ETLBuild
on:
push:
tags:
- "v*"
workflow_dispatch:
schedule:
- cron: "0 0 * * FRI"
jobs:
# Try to figure out the build version information only once
pre-build:
runs-on: ubuntu-latest
outputs:
describe: ${{ steps.git.outputs.describe }}
tag: ${{ steps.git.outputs.tag }}
uid: ${{ steps.git.outputs.uid }}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0
fetch-tags: true
- name: Fetch git version information
id: git
run: |
git fetch --tags --force
git_describe=$(git describe --abbrev=7 2>/dev/null | awk '{$1=$1};1')
git_tag=$(git describe --abbrev=0 2>/dev/null | awk '{$1=$1};1')
ci_id=$(uuidgen)
echo "Version info: $git_describe ?? $git_tag"
{
echo "describe=$git_describe"
echo "tag=$git_tag"
echo "uid=$ci_id"
} >> "$GITHUB_OUTPUT"
# __ __ _ _ _
# | \/ | | | | | (_)
# | \ / | ___ __| | __ _ ___ _ __ ___ _ __ __ _ | |_ _ ___ _ __
# | |\/| | / _ \ / _` | / _` | / _ \ | '_ \ / _ \ | '__| / _` | | __| | | / _ \ | '_ \
# | | | | | (_) | | (_| | | (_| | | __/ | | | | | __/ | | | (_| | | |_ | | | (_) | | | | |
# |_| |_| \___/ \__,_| \__, | \___| |_| |_| \___| |_| \__,_| \__| |_| \___/ |_| |_|
# __/ |
# |___/
lnx64-mod:
runs-on: ubuntu-24.04
needs: pre-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
uses: addnab/docker-run-action@4f65fabd2431ebc8d299f8e5a018d79a769ae185 # v3
with:
image: etlegacy/lnx-build:latest
options: -v ${{ github.workspace }}:/code -e CI_ETL_DESCRIBE=${{needs.pre-build.outputs.describe}} -e CI_ETL_TAG=${{needs.pre-build.outputs.tag}} -e CI_ETL_UID=${{needs.pre-build.outputs.uid}} -e CI=true
run: |
git config --global --add safe.directory /code
./easybuild.sh build -64 -mod
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: lnx64-mod
path: |
build/legacy/cgame*.so
build/legacy/ui*.so
build/legacy/qagame*.so
build/legacy/tvgame*.so
if-no-files-found: error
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: incomplete-mod-pk3
path: build/legacy/legacy_*.pk3
if-no-files-found: error
lnx32-mod:
runs-on: ubuntu-24.04
needs: pre-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
uses: addnab/docker-run-action@4f65fabd2431ebc8d299f8e5a018d79a769ae185 # v3
with:
image: etlegacy/lnx-build:latest
options: -v ${{ github.workspace }}:/code -e CI_ETL_DESCRIBE=${{needs.pre-build.outputs.describe}} -e CI_ETL_TAG=${{needs.pre-build.outputs.tag}} -e CI_ETL_UID=${{needs.pre-build.outputs.uid}} -e CI=true
run: |
git config --global --add safe.directory /code
./easybuild.sh build -mod
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: lnx32-mod
path: |
build/legacy/cgame*.so
build/legacy/ui*.so
build/legacy/qagame*.so
build/legacy/tvgame*.so
if-no-files-found: error
lnx-aarch64-mod:
runs-on: ubuntu-24.04
needs: pre-build
container:
image: etlegacy/lnx-aarch64-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
./easybuild.sh build -RPIT -mod -ninja
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: lnx-aarch64-mod
path: |
build/legacy/cgame*.so
build/legacy/ui*.so
build/legacy/qagame*.so
build/legacy/tvgame*.so
if-no-files-found: error
osx-mod:
runs-on: macos-14
needs: pre-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Install dependencies
run: brew bundle
- name: List dev tools
run: |
# shellcheck disable=SC2010
ls -la /Applications/ | grep Xcode
ls -la /Library/Developer/CommandLineTools/SDKs/
xcode-select --print-path
xcrun -sdk macosx --show-sdk-path
- name: Build
env:
SDKROOT: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
DEVELOPER_DIR: /Library/Developer/CommandLineTools
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
shell: bash
run: |
./easybuild.sh build -64 -mod --osx=10.10 --osx-arc="x86_64;arm64" -j
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: osx-mod
path: |
build/legacy/cgame_mac
build/legacy/ui_mac
build/legacy/qagame_mac
build/legacy/tvgame_mac
if-no-files-found: error
win-mod:
runs-on: windows-2022
needs: pre-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
shell: cmd
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
run: |
call .\easybuild.bat build -mod
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: win-mod
path: |
build/legacy/cgame*.dll
build/legacy/ui*.dll
build/legacy/qagame*.dll
build/legacy/tvgame*.dll
if-no-files-found: error
win64-mod:
runs-on: windows-2022
needs: pre-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
shell: cmd
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
run: |
call .\easybuild.bat build -mod -64
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: win64-mod
path: |
build/legacy/cgame*.dll
build/legacy/ui*.dll
build/legacy/qagame*.dll
build/legacy/tvgame*.dll
if-no-files-found: error
android-mod:
runs-on: ubuntu-24.04
needs: pre-build
env:
SIGNING_KEY_ALIAS: ${{ secrets.ANDROID_SIGN_APK_ALLIAS }}
SIGNING_KEY_PASSWORD: ${{ secrets.ANDROID_SIGN_APK_PASS }}
SIGNING_STORE_PASSWORD: ${{ secrets.ANDROID_SIGN_APK_PASS }}
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
ANDROID_SDK_ROOT: /opt/android-sdk
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=4 -Dkotlin.incremental=false
container:
image: etlegacy/android-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
fetch-depth: 0
- name: Setup JDK
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4
with:
distribution: "temurin"
java-version: "21"
cache: "gradle"
cache-dependency-path: |
**/*.gradle*
app/libs/joystick/**/*.gradle*
- name: Build JoyStick Dependency
working-directory: ./app/libs/joystick
run: |
./gradlew --no-daemon clean --stacktrace --warning-mode all
./gradlew --no-daemon assembleRelease --stacktrace --warning-mode all
./gradlew --no-daemon publishToMavenLocal --stacktrace --warning-mode all
- name: Upload JoyStick Dependency Artifacts
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: android-joystick-packages
path: "/root/.m2/repository/com/etlegacy/android/joystick/"
if-no-files-found: error
- name: Build Release
if: github.repository == 'etlegacy/etlegacy'
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
./gradlew --no-daemon lintDebug testDebugUnitTest --stacktrace --warning-mode all
./gradlew --no-daemon clean assembleRelease --stacktrace --warning-mode all
ls -R
- name: Build Debug
if: github.repository != 'etlegacy/etlegacy'
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
./gradlew --no-daemon lintDebug testDebugUnitTest --stacktrace --warning-mode all
./gradlew --no-daemon clean assembleDebug --stacktrace --warning-mode all
ls -R
- name: Prepare artifacts
run: |
set -euo pipefail
for arch in arm64-v8a x86 x86_64; do
for kind in libcgame libui; do
f="$(find app/build/intermediates/merged_native_libs -path "*/out/lib/${arch}/${kind}*.so" -print -quit)"
if [[ -z "${f}" ]]; then
echo "Missing merged native lib ${kind}*.so for ${arch}" >&2
exit 1
fi
mv "${f}" .
done
done
ls -ltrah
- name: Upload arm64-v8a
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: android-arm64-mod
path: |
libcgame*arm64*.so
libui*arm64*.so
if-no-files-found: error
- name: Upload x86
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: android-x86-mod
path: |
libcgame*i386.so
libui*i386.so
if-no-files-found: error
- name: Upload x86_64
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: android-x86_64-mod
path: |
libcgame*x86_64.so
libui*x86_64.so
if-no-files-found: error
# __ __ _
# | \/ | | |
# | \ / | ___ _ __ __ _ ___ _ __ ___ ___ __| | ___
# | |\/| | / _ \ | '__| / _` | / _ \ | '_ ` _ \ / _ \ / _` | / __|
# | | | | | __/ | | | (_| | | __/ | | | | | | | (_) | | (_| | \__ \
# |_| |_| \___| |_| \__, | \___| |_| |_| |_| \___/ \__,_| |___/
# __/ |
# |___/
# Since lnx32 is installing the most, use it as the step that combines all the other steps mod files.
# This step also generates the final packages for 32 bit lnx.
mod-merger:
runs-on: ubuntu-24.04
needs:
[
pre-build,
lnx64-mod,
lnx32-mod,
osx-mod,
win-mod,
win64-mod,
lnx-aarch64-mod,
android-mod,
]
steps:
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: incomplete-mod-pk3
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
pattern: "*-mod"
path: platforms
merge-multiple: true
- name: Create supported platform manifest
shell: bash
run: |
echo "win_x86 win_x86_64 lnx_x86 lnx_x86_64 macos_x86_64 macos_aarch64 lnx_armv8_64 android_aarch64 android_x86 android_x86_64" > platforms.manifest
- name: Merge mod files
shell: bash
run: |
zip -rvj -MM legacy_*.pk3 platforms.manifest platforms/cgame* platforms/ui* platforms/libcgame* platforms/libui*
- name: Create mod zip
shell: bash
run: |
zip -rvj -MM etlegacy-mod-${{needs.pre-build.outputs.describe}}.zip legacy_*.pk3 platforms/qagame* platforms/tvgame*
- name: Remove old artifacts
uses: geekyeggo/delete-artifact@65041433121f7239077fa20be14c0690f70569de # v4
with:
failOnError: false
name: |
incomplete-mod-pk3
*-mod
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: All-mods
path: legacy_*.pk3
if-no-files-found: error
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: mod-zip
path: etlegacy-mod-*.zip
if-no-files-found: error
# ______ _ _ _
# | ____| (_) | | | |
# | |__ _ _ __ __ _ | | _ __ __ _ ___ | | __ __ _ __ _ ___ ___
# | __| | | | '_ \ / _` | | | | '_ \ / _` | / __| | |/ / / _` | / _` | / _ \ / __|
# | | | | | | | | | (_| | | | | |_) | | (_| | | (__ | < | (_| | | (_| | | __/ \__ \
# |_| |_| |_| |_| \__,_| |_| | .__/ \__,_| \___| |_|\_\ \__,_| \__, | \___| |___/
# | | __/ |
# |_| |___/
# Generate the final packages for Lnx, macOS, Windows and Android
lnx64:
runs-on: ubuntu-24.04
needs: [pre-build, mod-merger]
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
uses: addnab/docker-run-action@4f65fabd2431ebc8d299f8e5a018d79a769ae185 # v3
with:
image: etlegacy/lnx-build:latest
options: -v ${{ github.workspace }}:/code -e CI_ETL_DESCRIBE=${{needs.pre-build.outputs.describe}} -e CI_ETL_TAG=${{needs.pre-build.outputs.tag}} -e CI_ETL_UID=${{needs.pre-build.outputs.uid}} -e CI=true
run: |
git config --global --add safe.directory /code
./easybuild.sh build -64
- name: Change Owner of Container Working Directory
run: |
action_name=$(whoami)
action_group=$(groups "$action_name" | awk '{print $3}')
sudo chown "${action_name}:${action_group}" -R .
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: All-mods
path: build/legacy
- name: Display structure of downloaded files
run: ls -R
working-directory: build/legacy
- name: Generate packages
uses: addnab/docker-run-action@4f65fabd2431ebc8d299f8e5a018d79a769ae185 # v3
with:
image: etlegacy/lnx-build:latest
options: -v ${{ github.workspace }}:/code -e CI_ETL_DESCRIBE=${{needs.pre-build.outputs.describe}} -e CI_ETL_TAG=${{needs.pre-build.outputs.tag}} -e CI=true
run: |
cd build/
cpack
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: lnx64-packages
path: |
build/etlegacy-*.tar.gz
build/etlegacy-*.sh
if-no-files-found: error
lnx32:
runs-on: ubuntu-24.04
needs: [pre-build, mod-merger]
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
uses: addnab/docker-run-action@4f65fabd2431ebc8d299f8e5a018d79a769ae185 # v3
with:
image: etlegacy/lnx-build:latest
options: -v ${{ github.workspace }}:/code -e CI_ETL_DESCRIBE=${{needs.pre-build.outputs.describe}} -e CI_ETL_TAG=${{needs.pre-build.outputs.tag}} -e CI_ETL_UID=${{needs.pre-build.outputs.uid}} -e CI=true
run: |
git config --global --add safe.directory /code
./easybuild.sh build -32
- name: Change Owner of Container Working Directory
run: |
action_name=$(whoami)
action_group=$(groups "$action_name" | awk '{print $3}')
sudo chown "${action_name}:${action_group}" -R .
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: All-mods
path: build/legacy
- name: Display structure of downloaded files
run: ls -R
working-directory: build/legacy
- name: Generate packages
uses: addnab/docker-run-action@4f65fabd2431ebc8d299f8e5a018d79a769ae185 # v3
with:
image: etlegacy/lnx-build:latest
options: -v ${{ github.workspace }}:/code -e CI_ETL_DESCRIBE=${{needs.pre-build.outputs.describe}} -e CI_ETL_TAG=${{needs.pre-build.outputs.tag}} -e CI=true
run: |
cd build/
cpack
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: lnx32-packages
path: |
build/etlegacy-*.tar.gz
build/etlegacy-*.sh
if-no-files-found: error
lnx-aarch64:
runs-on: ubuntu-latest
needs: [pre-build, mod-merger]
container:
image: etlegacy/lnx-aarch64-build
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
run: |
./easybuild.sh build -RPIT -ninja
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: All-mods
path: build/legacy
- name: Display structure of downloaded files
run: ls -R
working-directory: build/legacy
- name: Generate packages
shell: bash
working-directory: build
run: cpack
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: lnx-aarch64-packages
path: |
build/etlegacy-*.tar.gz
build/etlegacy-*.sh
if-no-files-found: error
osx:
runs-on: macos-14
needs: [pre-build, mod-merger]
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Install dependencies
run: |
brew bundle
brew install freetype librsvg graphicsmagick imagemagick
- name: Build
env:
SDKROOT: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
DEVELOPER_DIR: /Library/Developer/CommandLineTools
shell: bash
run: |
./easybuild.sh build -64 --osx=10.10 --osx-arc="x86_64;arm64" -j
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: All-mods
path: build/legacy
- name: Display structure of downloaded files
run: ls -R
working-directory: build/legacy
- name: Generate packages
shell: bash
run: ./easybuild.sh package -64 --osx=10.10 --osx-arc="x86_64;arm64" -j
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: osx-packages
path: |
build/etlegacy-*.tar.gz
build/etlegacy-*.dmg
if-no-files-found: error
win:
runs-on: windows-2022
needs: [pre-build, mod-merger]
outputs:
win: ${{ steps.artifact-upload-step.outputs.artifact-id }}
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
shell: cmd
run: |
call .\easybuild.bat build
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: All-mods
path: build/legacy
- name: Display structure of downloaded files
run: dir
working-directory: build/legacy
- name: Upload Win etl.exe
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
id: artifact-exe-upload-step
with:
name: win-exe
path: |
build/etl.exe
if-no-files-found: error
- name: SignPath Win Exe Snapshot
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "test-signing"
github-artifact-id: "${{steps.artifact-exe-upload-step.outputs.artifact-id}}"
wait-for-completion: true
output-artifact-directory: "win-exe"
- name: SignPath Win Exe Release
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
if: github.ref_type == 'tag'
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "release-signing"
github-artifact-id: "${{steps.artifact-exe-upload-step.outputs.artifact-id}}"
wait-for-completion: true
output-artifact-directory: "win-exe"
- name: Generate packages
shell: cmd
working-directory: build
run: |
cp D:\a\etlegacy\etlegacy\win-exe\etl.exe .
cpack
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
id: artifact-upload-step
with:
name: win-packages
path: |
build/etlegacy-*.exe
build/etlegacy-*.zip
if-no-files-found: error
win64:
runs-on: windows-2022
needs: [pre-build, mod-merger]
outputs:
win64: ${{ steps.artifact-upload-step.outputs.artifact-id }}
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
- name: Build
shell: cmd
run: |
call .\easybuild.bat build -64
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: All-mods
path: build/legacy
- name: Display structure of downloaded files
run: dir
working-directory: build/legacy
- name: Upload Win64 etl.exe
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
id: artifact-exe-upload-step
with:
name: win64-exe
path: |
build/etl.exe
if-no-files-found: error
- name: SignPath Win64 Exe Snapshot
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "test-signing"
github-artifact-id: "${{steps.artifact-exe-upload-step.outputs.artifact-id}}"
wait-for-completion: true
output-artifact-directory: "win64-exe"
- name: SignPath Win64 Exe Release
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
if: github.ref_type == 'tag'
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "release-signing"
github-artifact-id: "${{steps.artifact-exe-upload-step.outputs.artifact-id}}"
wait-for-completion: true
output-artifact-directory: "win64-exe"
- name: Generate packages
shell: cmd
working-directory: build
run: |
cp D:\a\etlegacy\etlegacy\win64-exe\etl.exe .
cpack
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
id: artifact-upload-step
with:
name: win64-packages
path: |
build/etlegacy-*.exe
build/etlegacy-*.zip
if-no-files-found: error
android:
runs-on: ubuntu-24.04
env:
SIGNING_KEY_ALIAS: ${{ secrets.ANDROID_SIGN_APK_ALLIAS }}
SIGNING_KEY_PASSWORD: ${{ secrets.ANDROID_SIGN_APK_PASS }}
SIGNING_STORE_PASSWORD: ${{ secrets.ANDROID_SIGN_APK_PASS }}
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
CI_ETL_UID: ${{needs.pre-build.outputs.uid}}
ANDROID_SDK_ROOT: /opt/android-sdk
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=4 -Dkotlin.incremental=false
needs: [pre-build, mod-merger]
container:
image: etlegacy/android-build
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: true
fetch-depth: 0
fetch-tags: true
- name: Setup JDK
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4
with:
distribution: "temurin"
java-version: "21"
cache: "gradle"
cache-dependency-path: |
**/*.gradle*
app/libs/joystick/**/*.gradle*
- name: Download JoyStick Dependency Artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: android-joystick-packages
path: "/root/.m2/repository/com/etlegacy/android/joystick/"
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: All-mods
path: app/src/main/assets
- name: Display structure of downloaded files
run: ls -R
working-directory: app/src/main/assets
- name: Build Release and Generate Package
if: github.repository == 'etlegacy/etlegacy'
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
./gradlew --no-daemon lintDebug testDebugUnitTest --stacktrace --warning-mode all
./gradlew --no-daemon clean assembleRelease --stacktrace --warning-mode all
ls -R
- name: Build Debug and Generate Package
if: github.repository != 'etlegacy/etlegacy'
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
./gradlew --no-daemon lintDebug testDebugUnitTest --stacktrace --warning-mode all
./gradlew --no-daemon clean assembleDebug --stacktrace --warning-mode all
ls -R
- name: Rename APK
shell: bash
run: |
shopt -s nullglob globstar
for FILE in ./app/build/outputs/apk/**/*.apk; do mv "$FILE" "${FILE%-*}.apk"; done
ls -R app/build/outputs/apk
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: android-packages
path: app/build/outputs/apk/*/etlegacy*.apk
if-no-files-found: error
# ____ _ ____ _ _
# / ___|(_) __ _ _ __ | _ \ __ _| |_| |__
# \___ \| |/ _` | '_ \| |_) / _` | __| '_ \
# ___) | | (_| | | | | __/ (_| | |_| | | |
# |____/|_|\__, |_| |_|_| \__,_|\__|_| |_|
# |___/
sign:
if: github.repository == 'etlegacy/etlegacy'
runs-on: ubuntu-24.04
needs: [pre-build, win, win64]
steps:
- name: Get version status
id: vars
run: |
echo "hash_exists=$(curl -s -o /dev/null -w "%{http_code}" ${{ secrets.LEGACY_UPLOAD_CHECK_URL }}${{ github.sha }} 2>/dev/null)" >> "$GITHUB_OUTPUT"
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
if: ${{ steps.vars.outputs.hash_exists == '404' }}
with:
pattern: win*
- name: SignPath Win Snapshot
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
if: ${{ steps.vars.outputs.hash_exists == '404' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') }}
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "test-signing"
github-artifact-id: "${{needs.win.outputs.win}}"
wait-for-completion: true
output-artifact-directory: "win-packages"
- name: SignPath Win64 Snapshot
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
if: ${{ steps.vars.outputs.hash_exists == '404' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') }}
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "test-signing"
github-artifact-id: "${{needs.win64.outputs.win64}}"
wait-for-completion: true
output-artifact-directory: "win64-packages"
- name: SignPath Win Release
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
if: github.ref_type == 'tag'
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "release-signing"
github-artifact-id: "${{needs.win.outputs.win}}"
wait-for-completion: true
output-artifact-directory: "win-packages"
- name: SignPath Win64 Release
uses: signpath/github-action-submit-signing-request@ced31329c0317e779dad2eec2a7c3bb46ea1343e # v1.3
if: github.ref_type == 'tag'
with:
api-token: "${{ secrets.SIGNPATH_API_TOKEN }}"
organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}"
project-slug: "etlegacy"
signing-policy-slug: "release-signing"
github-artifact-id: "${{needs.win64.outputs.win64}}"
wait-for-completion: true
output-artifact-directory: "win64-packages"
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
if: ${{ steps.vars.outputs.hash_exists == '404' }}
with:
name: win-packages
path: |
win-packages/etlegacy-*-x86.exe
win-packages/etlegacy-*-x86.zip
overwrite: true
if-no-files-found: error
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
if: ${{ steps.vars.outputs.hash_exists == '404' }}
with:
name: win64-packages
path: |
win64-packages/etlegacy-*-x64.exe
win64-packages/etlegacy-*-x64.zip
overwrite: true
if-no-files-found: error
# _ _ _ _ _ _____ _
# | | | | | | | | | | / ____| | |
# | | | | _ __ | | ___ __ _ __| | __ _ _ __ __| | | | | | ___ __ _ _ __ _ _ _ __
# | | | | | '_ \ | | / _ \ / _` | / _` | / _` | | '_ \ / _` | | | | | / _ \ / _` | | '_ \ | | | | | '_ \
# | |__| | | |_) | | | | (_) | | (_| | | (_| | | (_| | | | | | | (_| | | |____ | | | __/ | (_| | | | | | | |_| | | |_) |
# \____/ | .__/ |_| \___/ \__,_| \__,_| \__,_| |_| |_| \__,_| \_____| |_| \___| \__,_| |_| |_| \__,_| | .__/
# | | | |
# |_| |_|
upload:
runs-on: ubuntu-24.04
needs: [pre-build, sign, lnx32, lnx64, osx, lnx-aarch64, android]
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')
steps:
- uses: geekyeggo/delete-artifact@65041433121f7239077fa20be14c0690f70569de # v4
with:
name: |
All-mods
- name: Get version status
id: vars
run: |
echo "hash_exists=$(curl -s -o /dev/null -w "%{http_code}" ${{ secrets.LEGACY_UPLOAD_CHECK_URL }}${{ github.sha }} 2>/dev/null)" >> "$GITHUB_OUTPUT"
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
if: ${{ steps.vars.outputs.hash_exists == '404' }}
with:
path: packages
- name: Register version
if: ${{ steps.vars.outputs.hash_exists == '404' }}
run: |
curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -F"sha=${{ github.sha }}" -F"uid=${{needs.pre-build.outputs.uid}}" -F"desc=${{needs.pre-build.outputs.describe}}" ${{ secrets.LEGACY_VERSION_REGISTER_URL }}
- name: Upload packages
if: ${{ steps.vars.outputs.hash_exists == '404' }}
shell: bash
working-directory: packages
run: |
find lnx64-packages/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=ouJ8LoD4tpFE" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
find lnx32-packages/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=3Eib0F0HiVcY" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
find osx-packages/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=zrm0gXDJ0vvQ" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
find win-packages/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=qkKkqKmiKHul" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
find win64-packages/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=1EM7l2e6pqpA" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
find android-packages/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=pqxx51ioaosg" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
find lnx-aarch64-packages/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=r3tqepamenlf" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
find mod-zip/ -name '*' -type f -exec curl --fail -H "Authorization: Bearer ${{ secrets.LEGACY_AUTH }}" -X POST -H "Content-Type: multipart/form-data" -F "data=@{}" -F "upload_id=eacan4jn14wt" -F"sha=${{ github.sha }}" ${{ secrets.LEGACY_UPLOAD_URL }} \;
- name: Discord notification
if: ${{ steps.vars.outputs.hash_exists == '404' && needs.pre-build.outputs.describe != needs.pre-build.outputs.tag }}
env:
DISCORD_WEBHOOK: ${{ secrets.PUBLISH_DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@0c4b27844ba47cb1c7bee539c8eead5284ce9fa9 # 0.3.2
with:
args: "<@&673533235887865879> Build from ETLegacy: ${{ needs.pre-build.outputs.describe }} (${{ github.sha }}) has been published.\nDownload at: https://www.etlegacy.com/workflow-files"
docker:
runs-on: ubuntu-24.04
needs: [pre-build, upload] # only upload to docker if the upload to the site was successfully completed
# only run on main/master default branch
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')
env:
CI_ETL_DESCRIBE: ${{needs.pre-build.outputs.describe}}
CI_ETL_TAG: ${{needs.pre-build.outputs.tag}}
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
submodules: false
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: lnx64-packages
path: build/package
- name: Setup folder
working-directory: build/package
run: |
cp ../../misc/docker/dedicated.Dockerfile ./Dockerfile
cp ../../misc/docker/entrypoint.sh ./entrypoint.sh
- name: Package folder contents
working-directory: build/package
run: |
ls -R
- name: Login to DockerHub Registry
run: echo ${{ secrets.DOCKERHUB_PASSWORD }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
- name: Get the version
id: vars
run: |
tag_missing=$(docker manifest inspect "etlegacy/server:${CI_ETL_DESCRIBE}" > /dev/null ; echo $?)
echo "Current tag ${{needs.pre-build.outputs.describe}} is missing from Docker: $tag_missing"
echo "tag_missing=$tag_missing" >> "$GITHUB_OUTPUT"
# If we are on any build version then we create the latest-patch version
- name: Build the server container
working-directory: build/package
run: |
docker build . --file Dockerfile --tag etlegacy/server:latest-patch
docker push etlegacy/server:latest-patch
# Create weekly tag when scheduled and update when triggered on docker hub
- name: Build and push the weekly Docker image
if: ${{ github.event_name == 'schedule' }}
working-directory: build/package
run: |
docker tag etlegacy/server:latest-patch etlegacy/server:weekly
docker push etlegacy/server:weekly
# If we are on a release tag, then also create the 'latest' tag on docker hub
- name: Build and push the latest Docker image
if: needs.pre-build.outputs.describe == needs.pre-build.outputs.tag && steps.vars.outputs.tag_missing == '1' && github.event_name != 'schedule'
working-directory: build/package
run: |
docker tag etlegacy/server:latest-patch "etlegacy/server:${CI_ETL_DESCRIBE}"
docker tag etlegacy/server:latest-patch "etlegacy/server:latest"
docker push "etlegacy/server:${CI_ETL_DESCRIBE}"
docker push "etlegacy/server:latest"
cleanup:
runs-on: ubuntu-24.04
if: always()
needs: [upload, docker]
steps:
- uses: geekyeggo/delete-artifact@65041433121f7239077fa20be14c0690f70569de # v4
with:
failOnError: false
name: |
All-mods
mod-zip
incomplete-mod-pk3
*-packages
*-mod
*-exe
ci-discord-notify-on-failure:
needs:
- pre-build
- lnx64-mod
- lnx32-mod
- lnx-aarch64-mod
- osx-mod
- win-mod
- win64-mod
- android-mod
- mod-merger
- lnx64
- lnx32
- lnx-aarch64
- osx
- win
- win64
- android
- sign
- upload
- docker
- cleanup
if: |
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') &&
failure()
runs-on: ubuntu-latest
steps:
- name: Notify Discord
env:
DISCORD_WEBHOOK: ${{ secrets.LEGACY_CI_WEBHOOK }}
COMMIT_SHA: ${{ github.sha }}
REPO: ${{ github.repository }}
RUN_ID: ${{ github.run_id }}
DEVS_ROLE_ID: "260752921698762752"
run: |
RUN_URL="https://github.com/${REPO}/actions/runs/${RUN_ID}"
MESSAGE="❌ ETLBuild **[failed on commit](<${RUN_URL}>)** \`${COMMIT_SHA}\` <@&${DEVS_ROLE_ID}>"
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"$MESSAGE\", \"allowed_mentions\": {\"roles\": [\"$DEVS_ROLE_ID\"]}}" \
"$DISCORD_WEBHOOK"