2024-02-29 21:44:53 -05:00
name : SPT Release Build
2024-03-12 18:38:04 -04:00
2024-02-29 21:25:58 -05:00
on :
2024-03-12 00:18:11 -04:00
schedule :
2024-11-04 11:45:46 -05:00
- cron : "* 17 * * *" # Every day at 1pm ET
2024-02-29 21:25:58 -05:00
push :
2024-04-25 23:54:08 -04:00
branches : [ trigger]
2024-03-12 18:38:04 -04:00
2024-02-29 21:25:58 -05:00
jobs :
2024-03-11 23:17:50 -04:00
prepare :
2024-03-02 22:46:27 -05:00
runs-on : ubuntu-latest
2024-03-11 23:52:56 -04:00
container :
2024-11-20 12:20:33 -05:00
image : refringe/spt-build-node:1.0.9
2024-03-02 22:46:27 -05:00
outputs :
2024-03-11 23:17:50 -04:00
proceed : ${{ steps.check-existence.outputs.proceed }}
is_nightly : ${{ steps.determine-context.outputs.is_nightly }}
branch_server : ${{ steps.determine-context.outputs.branch_server }}
branch_modules : ${{ steps.determine-context.outputs.branch_modules }}
branch_launcher : ${{ steps.determine-context.outputs.branch_launcher }}
2024-03-26 22:42:06 -04:00
target_tag : ${{ steps.determine-target-tag.outputs.target_tag }}
2024-03-14 17:27:16 -04:00
build_type : ${{ steps.determine-build-type.outputs.build_type }}
2024-03-11 23:50:58 -04:00
client_version : ${{ steps.versions.outputs.client_version }}
spt_version : ${{ steps.versions.outputs.spt_version }}
2024-03-14 11:58:11 -04:00
mod_enabled_bleeding : ${{ steps.mod-config.outputs.bleeding }}
2024-03-16 16:28:55 -04:00
mod_enabled_bleedingmods : ${{ steps.mod-config.outputs.bleedingmods }}
2024-03-14 11:58:11 -04:00
mod_enabled_debug : ${{ steps.mod-config.outputs.debug }}
mod_enabled_release : ${{ steps.mod-config.outputs.release }}
2024-03-02 22:46:27 -05:00
steps :
2024-04-25 23:54:08 -04:00
- name : Determine Build Context
id : determine-context
run : |
echo "Determining build context..."
if [[ "${{ github.event_name }}" == "schedule" ]]; then
echo "::set-output name=is_nightly::true"
2024-11-04 11:12:29 -05:00
echo "::set-output name=branch_server::3.10.0-DEV"
echo "::set-output name=branch_modules::310-dev"
echo "::set-output name=branch_launcher::3.10.0-DEV"
2024-04-25 23:54:08 -04:00
else
echo "::set-output name=is_nightly::false"
2024-03-14 17:27:16 -04:00
fi
2024-04-25 23:54:08 -04:00
shell : bash
- name : Determine Target Tag
id : determine-target-tag
if : steps.determine-context.outputs.is_nightly == 'false'
run : |
2024-06-03 13:37:30 -04:00
rm -rf /workspace/SPT/Build/trigger
if ! git clone https://${{ secrets.BUILD_USERNAME }}:${{ secrets.BUILD_ACCESS_TOKEN }}@dev.sp-tarkov.com/SPT/Build.git --branch "trigger" --depth 1 /workspace/SPT/Build/trigger; then
2024-04-25 23:54:08 -04:00
echo "Failed to clone the trigger branch. The branch may not exist."
echo "The trigger branch is critical to this workflow."
exit 1
fi
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/trigger
2024-04-25 23:54:08 -04:00
if [ ! -f .gitea/trigger ]; then
echo "Failed to find the .gitea/trigger file. It may not exist."
echo "The trigger file is critical to this workflow."
exit 1
fi
TAG_NAME=$(cat .gitea/trigger)
echo "::set-output name=target_tag::$TAG_NAME"
shell : bash
- name : Determine Build Type
id : determine-build-type
run : |
if [[ "${{ steps.determine-context.outputs.is_nightly }}" == "true" ]]; then
# Nightly builds are currently considered a "bleedingmods" type build
BUILD_TYPE="bleedingmods"
else
TARGET_TAG="${{ steps.determine-target-tag.outputs.target_tag }}"
TARGET_TAG_UPPER="${TARGET_TAG^^}" # Uppercase
# Debug build by default
# BleedingMods builds have "-BEM" in the target tag
# Bleeding builds have "-BE" in the target tag
# Release tags follow basic semantic versioning
BUILD_TYPE="debug"
if [[ "$TARGET_TAG_UPPER" =~ -BEM ]]; then
BUILD_TYPE="bleedingmods"
elif [[ "$TARGET_TAG_UPPER" =~ -BE ]]; then
BUILD_TYPE="bleeding"
elif [[ "$TARGET_TAG_UPPER" =~ v?[0-9]+\.[0-9]+\.[0-9]+ ]]; then
BUILD_TYPE="release"
2024-03-12 00:26:35 -04:00
fi
2024-04-25 23:54:08 -04:00
fi
echo "::set-output name=build_type::${BUILD_TYPE}"
shell : bash
- name : Check Existence
id : check-existence
run : |
PROCEED="true"
if [[ "${{ steps.determine-context.outputs.is_nightly }}" == "true" ]]; then
declare -A BRANCHES=(
2024-06-03 13:37:30 -04:00
[ Server]="https://dev.sp-tarkov.com/SPT/Server.git@${{ steps.determine-context.outputs.branch_server }}"
[ Modules]="https://dev.sp-tarkov.com/SPT/Modules.git@${{ steps.determine-context.outputs.branch_modules }}"
[ Launcher]="https://dev.sp-tarkov.com/SPT/Launcher.git@${{ steps.determine-context.outputs.branch_launcher }}"
2024-04-25 23:54:08 -04:00
)
for REPO_NAME in "${!BRANCHES[@]}"; do
REPO_URL="${BRANCHES[$REPO_NAME]%@*}"
BRANCH="${BRANCHES[$REPO_NAME]##*@}"
echo "Checking for branch $BRANCH in $REPO_NAME..."
if ! git ls-remote --heads $REPO_URL $BRANCH | grep -q $BRANCH; then
echo "Branch $BRANCH not found in $REPO_URL"
PROCEED="false"
break
fi
done
else
TAG="${{ steps.determine-target-tag.outputs.target_tag }}"
2024-06-03 13:37:30 -04:00
REPOS=("https://dev.sp-tarkov.com/SPT/Server.git" "https://dev.sp-tarkov.com/SPT/Modules.git" "https://dev.sp-tarkov.com/SPT/Launcher.git")
2024-04-25 23:54:08 -04:00
for REPO in "${REPOS[@]}"; do
echo "Checking for tag $TAG in $REPO..."
if ! git ls-remote --tags $REPO $TAG | grep -q $TAG; then
echo "Tag $TAG not found in $REPO"
PROCEED="false"
break
fi
done
fi
echo "::set-output name=proceed::${PROCEED}"
shell : bash
- name : Tag Not Found
if : steps.check-existence.outputs.proceed == 'false'
run : |
echo "Required branch/tag not found in one or more repositories, halting workflow."
exit 1
shell : bash
- name : Extract Versions
id : versions
run : |
2024-06-03 13:37:30 -04:00
rm -rf /workspace/SPT/Build/server-core
git init /workspace/SPT/Build/server-core
cd /workspace/SPT/Build/server-core
git remote add origin https://dev.sp-tarkov.com/SPT/Server.git
2024-04-25 23:54:08 -04:00
git config core.sparseCheckout true
echo "project/assets/configs/core.json" >> .git/info/sparse-checkout
if [[ "${{ steps.determine-context.outputs.is_nightly }}" == "true" ]]; then
REF=${{ steps.determine-context.outputs.branch_server }}
else
REF=${{ steps.determine-target-tag.outputs.target_tag }}
fi
# Fetch and checkout the specific reference (branch or tag)
git fetch --depth=1 origin "${REF}"
git checkout FETCH_HEAD
ls -la project/assets/configs
# Extract versions from core.json
cd project/assets/configs
2024-07-06 11:42:47 +01:00
SPT_VERSION=$(jq -r '.sptVersion' core.json)
2024-04-25 23:54:08 -04:00
FULL_VERSION=$(jq -r '.compatibleTarkovVersion' core.json)
CLIENT_VERSION=${FULL_VERSION##*.}
echo "::set-output name=client_version::${CLIENT_VERSION}"
echo "::set-output name=spt_version::${SPT_VERSION}"
shell : bash
- name : Extract Mod Configurations
id : mod-config
run : |
2024-06-03 13:37:30 -04:00
rm -rf /workspace/SPT/Build/server-mods-config
git init /workspace/SPT/Build/server-mods-config
cd /workspace/SPT/Build/server-mods-config
git remote add origin https://dev.sp-tarkov.com/SPT/Server.git
2024-04-25 23:54:08 -04:00
git config core.sparseCheckout true
echo "project/src/ide/BleedingEdgeEntry.ts" >> .git/info/sparse-checkout
echo "project/src/ide/BleedingEdgeModsEntry.ts" >> .git/info/sparse-checkout
echo "project/src/ide/DebugEntry.ts" >> .git/info/sparse-checkout
echo "project/src/ide/ReleaseEntry.ts" >> .git/info/sparse-checkout
if [[ "${{ steps.determine-context.outputs.is_nightly }}" == "true" ]]; then
REF=${{ steps.determine-context.outputs.branch_server }}
else
REF=${{ steps.determine-target-tag.outputs.target_tag }}
fi
# Fetch and checkout the specific reference (branch or tag)
git fetch --depth=1 origin "${REF}"
git checkout FETCH_HEAD
ls -la project/src/ide
# Function to parse G_MODS_ENABLED value
parse_mods_enabled() {
grep 'G_MODS_ENABLED' $1 | sed -e 's/.*G_MODS_ENABLED\s*=\s*\(.*\);/\1/'
}
# Extract the configuration options
MODS_BLEEDING=$(parse_mods_enabled "project/src/ide/BleedingEdgeEntry.ts")
MODS_BLEEDINGMODS=$(parse_mods_enabled "project/src/ide/BleedingEdgeModsEntry.ts")
MODS_DEBUG=$(parse_mods_enabled "project/src/ide/DebugEntry.ts")
MODS_RELEASE=$(parse_mods_enabled "project/src/ide/ReleaseEntry.ts")
echo "::set-output name=bleeding::${MODS_BLEEDING}"
echo "::set-output name=bleedingmods::${MODS_BLEEDINGMODS}"
echo "::set-output name=debug::${MODS_DEBUG}"
echo "::set-output name=release::${MODS_RELEASE}"
shell : bash
2024-03-14 11:58:11 -04:00
2024-03-02 22:46:27 -05:00
build-server :
2024-03-11 23:17:50 -04:00
needs : [ prepare]
if : needs.prepare.outputs.proceed == 'true'
2024-02-29 21:25:58 -05:00
runs-on : ubuntu-latest
2024-03-01 11:12:38 -05:00
container :
2024-11-20 12:20:33 -05:00
image : refringe/spt-build-node:1.0.9
2024-03-16 18:49:23 -04:00
outputs :
2024-03-29 13:30:14 -04:00
server_commit : ${{ steps.clone-server.outputs.server_commit }}
2024-02-29 21:25:58 -05:00
steps :
2024-04-25 23:54:08 -04:00
- name : Clone
id : clone-server
run : |
2024-06-03 13:37:30 -04:00
rm -rf /workspace/SPT/Build/server
2024-04-25 23:54:08 -04:00
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
BRANCH=${{ needs.prepare.outputs.branch_server }}
echo "Cloning branch $BRANCH"
2024-06-03 13:37:30 -04:00
git clone https://dev.sp-tarkov.com/SPT/Server.git --branch "$BRANCH" --depth 1 /workspace/SPT/Build/server
2024-04-25 23:54:08 -04:00
else
TAG=${{ needs.prepare.outputs.target_tag }}
echo "Cloning tag $TAG"
2024-06-03 13:37:30 -04:00
git clone https://dev.sp-tarkov.com/SPT/Server.git --branch "$TAG" --depth 1 /workspace/SPT/Build/server
2024-04-25 23:54:08 -04:00
fi
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/server
2024-04-25 23:54:08 -04:00
echo "::set-output name=server_commit::$(git rev-parse --short HEAD)"
shell : bash
- name : Pull LFS Files
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/server
2024-04-25 23:54:08 -04:00
git lfs pull && git lfs ls-files
shell : bash
- name : Runner Debug Information
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/server
2024-04-25 23:54:08 -04:00
echo "Git version: $(git --version)"
echo "Git LFS version: $(git-lfs --version)"
echo "Node.js version: $(node --version)"
echo "NPM version: $(npm --version)"
echo "Latest Commit Hash: $(git rev-parse HEAD)"
echo "Associated Tags: $(git tag --contains HEAD)"
echo "Last Commit Message:" && git log -1 --pretty=%B
shell : bash
- name : Cache NPM Dependencies
id : cache-npm-dependencies
uses : actions/cache@v4
with :
path : |
2024-06-03 13:37:30 -04:00
/workspace/SPT/Build/server/project/node_modules
key : npm-dependencies-${{ hashFiles('/workspace/SPT/Build/server/project/package.json') }}
2024-04-25 23:54:08 -04:00
- name : Install Dependencies
if : steps.cache-npm-dependencies.outputs.cache-hit != 'true'
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/server/project
2024-04-25 23:54:08 -04:00
rm -rf node_modules
npm install
shell : bash
- name : Cache Server Build
id : cache-server-build
uses : actions/cache@v4
with :
path : |
2024-06-03 13:37:30 -04:00
/workspace/SPT/Build/server/project/build
2024-04-25 23:54:08 -04:00
key : server-build-${{ steps.clone-server.outputs.server_commit }}-${{ needs.prepare.outputs.build_type }}
- name : Build Server
if : steps.cache-server-build.outputs.cache-hit != 'true'
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/server/project
2024-04-25 23:54:08 -04:00
BUILD_TYPE="${{ needs.prepare.outputs.build_type }}"
echo "Running build for $BUILD_TYPE"
npm run build:$BUILD_TYPE -- --arch=x64 --platform=win32
printf "\nBuilt!\n\n"
2024-06-03 13:37:30 -04:00
tree -C /workspace/SPT/Build/server/project/build
2024-04-25 23:54:08 -04:00
shell : bash
- name : Artifact Server
uses : actions/upload-artifact@v3
with :
name : server-artifact
2024-06-03 13:37:30 -04:00
path : /workspace/SPT/Build/server/project/build/
2024-04-25 23:54:08 -04:00
compression-level : 0
retention-days : 1
overwrite : true
2024-03-02 22:29:09 -05:00
2024-03-02 22:46:27 -05:00
build-modules :
2024-03-11 23:50:58 -04:00
needs : [ prepare]
2024-03-11 23:17:50 -04:00
if : needs.prepare.outputs.proceed == 'true'
2024-03-02 22:29:09 -05:00
runs-on : ubuntu-latest
container :
2024-03-08 12:21:08 -05:00
image : refringe/spt-build-dotnet:1.0.0
2024-03-02 22:29:09 -05:00
steps :
2024-04-25 23:54:08 -04:00
- name : Clone
id : clone-modules
run : |
2024-06-03 13:37:30 -04:00
rm -rf /workspace/SPT/Build/modules
2024-04-25 23:54:08 -04:00
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
BRANCH=${{ needs.prepare.outputs.branch_modules }}
echo "Cloning modules from branch $BRANCH"
2024-06-03 13:37:30 -04:00
git clone https://dev.sp-tarkov.com/SPT/Modules.git --branch "$BRANCH" --depth 1 /workspace/SPT/Build/modules
2024-04-25 23:54:08 -04:00
else
TAG=${{ needs.prepare.outputs.target_tag }}
echo "Cloning modules from tag $TAG"
2024-06-03 13:37:30 -04:00
git clone https://dev.sp-tarkov.com/SPT/Modules.git --branch "$TAG" --depth 1 /workspace/SPT/Build/modules
2024-04-25 23:54:08 -04:00
fi
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/modules
2024-04-25 23:54:08 -04:00
echo "::set-output name=modules_commit::$(git rev-parse --short HEAD)"
shell : bash
- name : Download Client Module Package
run : |
2024-06-03 13:37:30 -04:00
DIR_MANAGED="/workspace/SPT/Build/modules/project/Shared/Managed"
2024-04-25 23:54:08 -04:00
DOWNLOAD_PATH="$DIR_MANAGED/${{ needs.prepare.outputs.client_version }}.7z"
DOWNLOAD_URL="${{ secrets.MODULE_DOMAIN }}/${{ needs.prepare.outputs.client_version }}.7z"
echo "Downloading Client Module Package from $DOWNLOAD_URL to $DOWNLOAD_PATH"
mkdir -p "$DIR_MANAGED"
wget -q -O "$DOWNLOAD_PATH" "$DOWNLOAD_URL" || {
echo "Failed to download the module package."
exit 1
}
if [ ! -s "$DOWNLOAD_PATH" ]; then
echo "The module package does not exist or is empty."
exit 1
fi
echo "Download Successful: $DOWNLOAD_PATH"
shell : bash
- name : Decompress Client Module Package
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/modules/project/Shared/Managed
2024-04-25 23:54:08 -04:00
7z x ${{ needs.prepare.outputs.client_version }}.7z -aoa
echo "Client module package decompressed."
shell : bash
- name : Delete Client Module Package
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/modules/project/Shared/Managed
2024-04-25 23:54:08 -04:00
rm -f ${{ needs.prepare.outputs.client_version }}.7z
echo "Client module package deleted."
shell : bash
- name : Cache Modules Build
id : cache-modules-build
uses : actions/cache@v4
with :
path : |
2024-06-03 13:37:30 -04:00
/workspace/SPT/Build/modules/project/Build
2024-04-25 23:54:08 -04:00
key : modules-build-${{ steps.clone-modules.outputs.modules_commit }}
- name : Build Modules
if : steps.cache-modules-build.outputs.cache-hit != 'true'
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/modules/project
2024-04-25 23:54:08 -04:00
dotnet build -c Release -p:Version=${{ needs.prepare.outputs.spt_version }}
printf "\nBuilt!\n\n"
2024-06-03 13:37:30 -04:00
tree /workspace/SPT/Build/modules/project/Build
2024-04-25 23:54:08 -04:00
shell : bash
- name : Artifact Modules
uses : actions/upload-artifact@v3
with :
name : modules-artifact
2024-06-03 13:37:30 -04:00
path : /workspace/SPT/Build/modules/project/Build
2024-04-25 23:54:08 -04:00
compression-level : 0
retention-days : 1
overwrite : true
2024-03-04 21:12:10 -05:00
2024-03-02 22:46:27 -05:00
build-launcher :
2024-03-11 23:50:58 -04:00
needs : [ prepare]
2024-03-11 23:17:50 -04:00
if : needs.prepare.outputs.proceed == 'true'
2024-03-02 22:29:09 -05:00
runs-on : ubuntu-latest
container :
2024-03-08 12:21:08 -05:00
image : refringe/spt-build-dotnet:1.0.0
2024-03-02 22:29:09 -05:00
steps :
2024-04-25 23:54:08 -04:00
- name : Clone
id : clone-launcher
run : |
2024-06-03 13:37:30 -04:00
rm -rf /workspace/SPT/Build/launcher
2024-04-25 23:54:08 -04:00
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
BRANCH=${{ needs.prepare.outputs.branch_launcher }}
echo "Cloning launcher from branch $BRANCH"
2024-06-03 13:37:30 -04:00
git clone https://dev.sp-tarkov.com/SPT/Launcher.git --branch "$BRANCH" --depth 1 /workspace/SPT/Build/launcher
2024-04-25 23:54:08 -04:00
else
TAG=${{ needs.prepare.outputs.target_tag }}
echo "Cloning launcher from tag $TAG"
2024-06-03 13:37:30 -04:00
git clone https://dev.sp-tarkov.com/SPT/Launcher.git --branch "$TAG" --depth 1 /workspace/SPT/Build/launcher
2024-04-25 23:54:08 -04:00
fi
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/launcher
2024-04-25 23:54:08 -04:00
echo "::set-output name=launcher_commit::$(git rev-parse --short HEAD)"
shell : bash
- name : Cache Launcher Build
id : cache-launcher-build
uses : actions/cache@v4
with :
path : |
2024-06-03 13:37:30 -04:00
/workspace/SPT/Build/launcher/project/Build
2024-04-25 23:54:08 -04:00
key : launcher-build-${{ steps.clone-launcher.outputs.launcher_commit }}
- name : Build Launcher
if : steps.cache-launcher-build.outputs.cache-hit != 'true'
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/launcher/project
2024-04-25 23:54:08 -04:00
dotnet build
printf "\nBuilt!\n\n"
2024-06-03 13:37:30 -04:00
tree /workspace/SPT/Build/launcher/project/Build
2024-04-25 23:54:08 -04:00
shell : bash
- name : Artifact Launcher
uses : actions/upload-artifact@v3
with :
name : launcher-artifact
2024-06-03 13:37:30 -04:00
path : /workspace/SPT/Build/launcher/project/Build
2024-04-25 23:54:08 -04:00
compression-level : 0
retention-days : 1
overwrite : true
2024-03-05 23:05:43 -05:00
2024-03-28 19:06:01 -04:00
assemble-and-publish :
2024-03-11 23:17:50 -04:00
needs : [ prepare, build-server, build-modules, build-launcher]
2024-03-05 23:05:43 -05:00
runs-on : ubuntu-latest
container :
2024-11-20 12:20:33 -05:00
image : refringe/spt-build-node:1.0.9
2024-03-05 23:05:43 -05:00
steps :
2024-04-25 23:54:08 -04:00
- name : Clean Directory
run : |
2024-06-03 13:37:30 -04:00
rm -rf /workspace/SPT/Build/release /workspace/SPT/Build/build
mkdir -p /workspace/SPT/Build/release
2024-04-25 23:54:08 -04:00
shell : bash
- name : Download Server Artifact
uses : actions/download-artifact@v3
with :
name : server-artifact
2024-06-03 13:37:30 -04:00
path : /workspace/SPT/Build/release/
2024-04-25 23:54:08 -04:00
- name : Download Modules Artifact
uses : actions/download-artifact@v3
with :
name : modules-artifact
2024-06-03 13:37:30 -04:00
path : /workspace/SPT/Build/release/
2024-04-25 23:54:08 -04:00
- name : Download Launcher Artifact
uses : actions/download-artifact@v3
with :
name : launcher-artifact
2024-06-03 13:37:30 -04:00
path : /workspace/SPT/Build/release/
2024-04-25 23:54:08 -04:00
- name : Clone Build Project
uses : actions/checkout@v3
with :
2024-06-03 13:37:30 -04:00
path : /workspace/SPT/Build/build
2024-04-25 23:54:08 -04:00
- name : Merge Static Assets and Dynamic Files
2024-06-03 13:37:30 -04:00
run : cp -rvf /workspace/SPT/Build/build/static-assets/* /workspace/SPT/Build/release/
2024-04-25 23:54:08 -04:00
shell : bash
- name : List Release Contents
2024-06-03 13:37:30 -04:00
run : tree /workspace/SPT/Build/release
2024-04-25 23:54:08 -04:00
shell : bash
- name : Generate Release Filename
id : generate-filename
run : |
BUILD_TYPE=${{ needs.prepare.outputs.build_type }}
SPT_VERSION=${{ needs.prepare.outputs.spt_version }}
CLIENT_VERSION=${{ needs.prepare.outputs.client_version }}
SERVER_COMMIT=${{ needs.build-server.outputs.server_commit }}
TARGET_TAG=${{ needs.prepare.outputs.target_tag }}
DATE=$(date +%Y%m%d)
# Conditionally format the BASE_NAME based on BUILD_TYPE and if it's a nightly build
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
BASE_NAME="SPT-NIGHTLY-${SPT_VERSION}-${CLIENT_VERSION}-${SERVER_COMMIT}-${DATE}"
2024-03-14 11:58:11 -04:00
else
2024-04-25 23:54:08 -04:00
# Make BUILD_TYPE and TARGET_TAG uppercase
UPPER_BUILD_TYPE=$(echo "$BUILD_TYPE" | tr '[:lower:]' '[:upper:]')
UPPER_TARGET_TAG=$(echo "$TARGET_TAG" | tr '[:lower:]' '[:upper:]')
if [ "$BUILD_TYPE" = "release" ]; then
BASE_NAME="SPT-${SPT_VERSION}-${CLIENT_VERSION}-${SERVER_COMMIT}"
2024-03-14 11:58:11 -04:00
else
2024-04-25 23:54:08 -04:00
# For debug and non-nightly-bleeding builds, include either TAG_PART or DATE, but not both
# Determine TAG_PART based on TARGET_TAG structure
TAG_PART=""
if [[ "$UPPER_TARGET_TAG" == *-*-* ]]; then
SUFFIX="${UPPER_TARGET_TAG##*-}"
if [ "$SUFFIX" != "$UPPER_TARGET_TAG" ]; then
TAG_PART="-${SUFFIX}"
fi
fi
if [ -n "$TAG_PART" ]; then
BASE_NAME="SPT-${UPPER_BUILD_TYPE}-${SPT_VERSION}-${CLIENT_VERSION}-${SERVER_COMMIT}${TAG_PART}"
else
BASE_NAME="SPT-${UPPER_BUILD_TYPE}-${SPT_VERSION}-${CLIENT_VERSION}-${SERVER_COMMIT}-${DATE}"
fi
2024-03-14 11:58:11 -04:00
fi
fi
2024-04-25 23:54:08 -04:00
echo "::set-output name=base_name::${BASE_NAME}"
echo "::set-output name=build_name::${BASE_NAME}.7z"
shell : bash
- name : Compress Release
id : compress-release
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/release
2024-04-25 23:54:08 -04:00
7z a -mx=9 -m0=lzma2 "../${{ steps.generate-filename.outputs.build_name }}" ./*
echo "Release compressed as ${{ steps.generate-filename.outputs.build_name }}."
2024-04-26 00:21:01 -04:00
FILE_SIZE_MB=$(stat -c %s "../${{ steps.generate-filename.outputs.build_name }}" | awk '{printf "%.2f MB", $1 / 1024 / 1024}')
FILE_HASH=$(md5sum "../${{ steps.generate-filename.outputs.build_name }}" | awk '{print $1}' | xxd -r -p | base64)
2024-04-25 23:54:08 -04:00
echo "::set-output name=file_size_mb::${FILE_SIZE_MB}"
echo "::set-output name=file_hash::${FILE_HASH}"
shell : bash
- name : R2 Upload
2024-04-26 00:37:32 -04:00
if : needs.prepare.outputs.build_type == 'release'
2024-04-26 01:01:47 -04:00
env :
SPT_VERSION : ${{ needs.prepare.outputs.spt_version }}
CLIENT_VERSION : ${{ needs.prepare.outputs.client_version }}
FILE_HASH : ${{ steps.compress-release.outputs.file_hash }}
2024-04-25 23:54:08 -04:00
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build
2024-04-25 23:54:08 -04:00
# Configure Rclone
echo '[r2]
type = s3
provider = Cloudflare
access_key_id = ${{ secrets.R2_ACCESS_KEY }}
secret_access_key = ${{ secrets.R2_SECRET_ACCESS_KEY }}
region = auto
endpoint = ${{ secrets.R2_ENDPOINT }}
2024-06-03 13:37:30 -04:00
acl = public-read' > /workspace/SPT/Build/rclone.conf
2024-04-25 23:54:08 -04:00
2024-04-26 01:01:47 -04:00
# Generate Release JSON File
2024-04-26 01:11:21 -04:00
echo "{
\"AkiVersion\": \"${SPT_VERSION}\",
\"ClientVersion\": \"${CLIENT_VERSION}\",
\"Mirrors\": [{
\"DownloadUrl\": \"${{ secrets.R2_FRONT }}/${{ steps.generate-filename.outputs.build_name }}\",
\"Hash\": \"${FILE_HASH}\"
2024-04-25 23:54:08 -04:00
}]
2024-06-03 13:37:30 -04:00
}" > /workspace/SPT/Build/release.json
2024-04-25 23:54:08 -04:00
2024-05-15 12:14:02 -04:00
echo "Current Local Directory:"
2024-04-26 00:47:20 -04:00
ls -lah
2024-04-25 23:54:08 -04:00
2024-05-15 12:14:02 -04:00
echo "Current Remote Directory:"
2024-06-03 13:37:30 -04:00
rclone ls r2:${{ secrets.R2_BUCKET_NAME }} --config /workspace/SPT/Build/rclone.conf
2024-05-15 12:14:02 -04:00
2024-04-25 23:54:08 -04:00
# Remove old 7z files from the bucket
2024-06-03 13:37:30 -04:00
rclone lsf r2:${{ secrets.R2_BUCKET_NAME }} --config /workspace/SPT/Build/rclone.conf --files-only --include="*.7z" --absolute > files-to-remove.txt
2024-05-15 13:16:51 -04:00
echo "Files to be deleted:"
cat files-to-remove.txt
2024-06-03 13:37:30 -04:00
rclone delete r2:${{ secrets.R2_BUCKET_NAME }} --config /workspace/SPT/Build/rclone.conf --files-from=files-to-remove.txt --max-depth=1 -vv
2024-04-25 23:54:08 -04:00
# Upload the file using rclone with the above config
2024-06-03 13:37:30 -04:00
rclone copy "/workspace/SPT/Build/${{ steps.generate-filename.outputs.build_name }}" r2:${{ secrets.R2_BUCKET_NAME }} --config /workspace/SPT/Build/rclone.conf -vv
2024-04-25 23:54:08 -04:00
# Upload the JSON file using rclone with the above config
2024-06-03 13:37:30 -04:00
rclone copy "/workspace/SPT/Build/release.json" r2:${{ secrets.R2_BUCKET_NAME }} --config /workspace/SPT/Build/rclone.conf -vv
2024-04-25 23:54:08 -04:00
shell : bash
- name : Upload Release to HTTPS Source
id : upload-https-7z
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/
sshpass -p "${{ secrets.SFTP_PASSWORD }}" scp -v -o "Port=${{ secrets.SFTP_PORT }}" -o "ConnectTimeout=20" -o "StrictHostKeyChecking=no" "/workspace/SPT/Build/${{ steps.generate-filename.outputs.build_name }}" ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }}:/public/builds
2024-04-25 23:54:08 -04:00
echo "::set-output name=link_https::${{ secrets.SFTP_MIRROR_LINK }}/builds/${{ steps.generate-filename.outputs.build_name }}"
shell : bash
- name : Upload Release to Mega
id : upload-mega
run : |
mega-https on
mega-login "${{ secrets.MEGA_EMAIL }}" "${{ secrets.MEGA_PASSWORD }}"
2024-06-03 13:37:30 -04:00
mega-put -c "/workspace/SPT/Build/${{ steps.generate-filename.outputs.build_name }}" "/spt-release/${{ steps.generate-filename.outputs.build_name }}"
2024-04-25 23:54:08 -04:00
# Generate link and save it.
EXPORT_OUTPUT=$(mega-export -a "/spt-release/${{ steps.generate-filename.outputs.build_name }}" -f)
LINK_MEGA=$(echo "$EXPORT_OUTPUT" | grep -o 'https://mega.nz/file/[A-Za-z0-9#_\-]*')
echo "::set-output name=link_mega::${LINK_MEGA}"
mega-logout
shell : bash
- name : Clean Old Mega Releases
run : |
mega-https on
mega-login "${{ secrets.MEGA_EMAIL }}" "${{ secrets.MEGA_PASSWORD }}"
2024-11-20 10:50:03 -05:00
mega-psa --discard
2024-11-20 10:30:51 -05:00
echo "Finding files matching the pattern:"
mega-find /spt-release --pattern 'SPT-*.7z' > matching_files.txt
cat matching_files.txt
2024-11-20 10:50:03 -05:00
echo "Filter files matching specific build types:"
2024-11-20 10:30:51 -05:00
grep -E 'SPT-(NIGHTLY|DEBUG|BLEEDING|BLEEDINGMODS).*\.7z$' matching_files.txt > filtered_files.txt
cat filtered_files.txt
# Process each filepath
while read -r filepath; do
filename=$(basename "$filepath")
echo "Processing filename: $filename"
2024-11-20 10:50:03 -05:00
2024-04-25 23:54:08 -04:00
# Extract date from filename
if [[ "$filename" =~ ([0-9]{8})\.7z$ ]]; then
2024-11-20 10:50:03 -05:00
2024-04-25 23:54:08 -04:00
file_date="${BASH_REMATCH[1]}"
2024-11-20 10:30:51 -05:00
echo "Extracted date: $file_date"
2024-11-20 10:50:03 -05:00
2024-04-25 23:54:08 -04:00
file_date_fmt=$(date -d "${file_date:0:4}-${file_date:4:2}-${file_date:6:2}" +%s)
2024-11-20 10:30:51 -05:00
echo "File date timestamp: $file_date_fmt"
2024-04-25 23:54:08 -04:00
# Get current date minus 14 days
current_date=$(date +%s)
limit_date=$(date -d "@$((current_date - 14 * 24 * 3600))" +%s)
2024-11-20 10:30:51 -05:00
echo "Current date timestamp: $current_date"
echo "Limit date timestamp: $limit_date"
2024-04-25 23:54:08 -04:00
# Compare dates and delete old files
if [[ "$file_date_fmt" -lt "$limit_date" ]]; then
2024-11-20 10:30:51 -05:00
echo "Deleting old file: $filepath"
mega-rm "$filepath"
else
echo "File is not older than 14 days, keeping: $filepath"
2024-04-25 23:54:08 -04:00
fi
2024-11-20 10:30:51 -05:00
else
echo "Filename does not match date pattern: $filename"
2024-03-12 00:26:35 -04:00
fi
2024-11-20 10:30:51 -05:00
done < filtered_files.txt
2024-04-25 23:54:08 -04:00
# Remove old file versions to save space.
mega-deleteversions -f /spt-release/*
mega-logout
shell : bash
- name : Post Build Info to Discord
env :
DISCORD_WEBHOOK_URL : ${{ secrets.DISCORD_WEBHOOK_URL }}
BUILD_TYPE : ${{ needs.prepare.outputs.build_type }}
BASE_NAME : ${{ steps.generate-filename.outputs.base_name }}
BUILD_NAME : ${{ steps.generate-filename.outputs.build_name }}
FILE_SIZE_MB : ${{ steps.compress-release.outputs.file_size_mb }}
FILE_HASH : ${{ steps.compress-release.outputs.file_hash }}
LINK_MEGA : ${{ steps.upload-mega.outputs.link_mega }}
LINK_HTTPS : ${{ steps.upload-https-7z.outputs.link_https }}
MODS_ENABLED_BLEEDING : ${{ needs.prepare.outputs.mod_enabled_bleeding }}
MODS_ENABLED_BLEEDINGMODS : ${{ needs.prepare.outputs.mod_enabled_bleedingmods }}
MODS_ENABLED_DEBUG : ${{ needs.prepare.outputs.mod_enabled_debug }}
MODS_ENABLED_RELEASE : ${{ needs.prepare.outputs.mod_enabled_release }}
run : |
2024-06-03 13:37:30 -04:00
cd /workspace/SPT/Build/
2024-04-25 23:54:08 -04:00
UPPER_BUILD_TYPE=$(echo "$BUILD_TYPE" | tr '[:lower:]' '[:upper:]')
2024-11-19 19:55:28 -05:00
FOOTER_MESSAGES=("You look great today!" "Don't ban me, Phantom!" "Powered by coffee" "Life's too short to remove USB safely" "Did you remember to hydrate today?" "Have you tried turning it off and on again?" "There's no place like 127.0.0.1" "In Chomp we trust" "Beep boop, I'm a bot" "Keep calm and commit your code" "This isn't a bug, it's an undocumented feature." "May the source be with you" "Go to bed, Terk" "Please direct all support requests to Drakia" "Meaw" "Chomp approves of this message" "Chomp is life, Chomp is love" "Drakia denies all involvement" "Drakia left this note here just to confuse you" "Katalyst is the reason we can’ t have nice things" "Katalyst voted against this message" "Powered by caffeine, chaos, and Chomp" "RaiRai says hi-hi" "RaiRai wants to remind you that sarcasm is a skill" "Refringe just wobbled" "Refringe might be watching--Or coding--Probably both" "Refringe rewrote this embed thirty times" "Refringe, professional button-pusher extraordinaire" "Sarix would like you to reconsider your choices" "Stella is currently judging your grammar" "Stella just gave this embed a 6/10" "Waffle has entered the chat, and now it’ s weird" "Waffle is too busy stacking layers of chaos" "Waffle would like to speak to the manager of logic")
2024-04-25 23:54:08 -04:00
FOOTER_MESSAGE="${FOOTER_MESSAGES[$RANDOM % ${#FOOTER_MESSAGES[@]}]}"
TIMESTAMP=$(date --iso-8601=seconds)
MODS=""
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
EMBED_COLOR=16705372
EMBED_DESCRIPTION='A new nightly build is available. These are untested and considered unstable. Absolutely no support is provided. **If you ask for help you will be banned from the #dev-builds channel without explanation.** 7-Zip is *required* to extract the release.'
2024-03-16 16:48:51 -04:00
MODS="$MODS_ENABLED_BLEEDINGMODS"
2024-03-14 11:58:11 -04:00
else
2024-04-25 23:54:08 -04:00
if [ "$BUILD_TYPE" == "bleeding" ]; then
EMBED_COLOR=15548997
EMBED_DESCRIPTION='A new bleeding edge build is available. These are strictly for testing issues *and not for general gameplay*. 7-Zip is *required* to extract the release.'
MODS="$MODS_ENABLED_BLEEDING"
elif [ "$BUILD_TYPE" == "bleedingmods" ]; then
EMBED_COLOR=15548997
EMBED_DESCRIPTION='A new bleeding edge build is available. These are strictly for testing issues *and not for general gameplay*. 7-Zip is *required* to extract the release.'
MODS="$MODS_ENABLED_BLEEDINGMODS"
elif [ "$BUILD_TYPE" == "debug" ]; then
EMBED_COLOR=2123412
EMBED_DESCRIPTION=$'A new debug build is available. These have extra-verbose logging enabled *for testing*. 7-Zip is *required* to extract the release.'
MODS="$MODS_ENABLED_DEBUG"
else
EMBED_COLOR=5763719
EMBED_DESCRIPTION=$'A new stable build is now ready for download. 7-Zip is *required* to extract the release. Have fun! 🎉'
MODS="$MODS_ENABLED_RELEASE"
fi
2024-03-14 11:58:11 -04:00
fi
2024-04-25 23:54:08 -04:00
if [[ "$MODS" == "true" ]]; then
MODS="enabled"
elif [[ "$MODS" == "false" ]]; then
MODS="disabled"
fi
fields_json='[
{"name": "Name", "value": "'" $BASE_NAME"'"},
{"name": "Build Type", "value": "'"$BUILD_TYPE"'", "inline": true },
{"name": "Mods", "value": "'"$MODS"'", "inline": true },
{"name": "File Size", "value": "'"$FILE_SIZE_MB"'", "inline": true },
{"name": "File Hash", "value": "'" $FILE_HASH"'"},
{"name": "Download", "value": "'" $LINK_MEGA"'"},
{"name": "Mirror", "value": "'" $LINK_HTTPS"'"}
] '
payload=$(jq -n \
--argjson fields "$fields_json" \
--arg EMBED_DESCRIPTION "$EMBED_DESCRIPTION" \
--argjson EMBED_COLOR "$EMBED_COLOR" \
--arg FOOTER_MESSAGE "$FOOTER_MESSAGE" \
--arg TIMESTAMP "$TIMESTAMP" \
'{
"content": $EMBED_DESCRIPTION,
"embeds": [
{
"title": "Build Information" ,
"color": $EMBED_COLOR,
"fields": $fields,
"footer": {"text": $FOOTER_MESSAGE, "icon_url": "https://i.imgur.com/28JJJec.png" },
"timestamp": $TIMESTAMP
}
] ,
"username": "BuildBot" ,
"avatar_url": "https://i.imgur.com/28JJJec.png"
}')
echo "$payload" > payload_discord.json
echo "Payload Generated:"
cat payload_discord.json
echo "Sending Payload..."
curl -H "Content-Type: application/json" \
-X POST \
--data-binary @payload_discord.json \
-v \
$DISCORD_WEBHOOK_URL
shell : bash