mirror of
https://github.com/sp-tarkov/build.git
synced 2025-02-13 01:30:46 -05:00
- Nightly builds should happen at 3pm ET - The Determine-Build-Type step happens earlier in the build process now & it's based on the passed tag instead of the current commits tag. - Torrent files are only created for stable releases. - Nightly builds are now cleaned from external sources - External sources now delete nightly, debug, and bleeding releases older than 14 days. - Updates node environment to v20.11.1
679 lines
28 KiB
YAML
679 lines
28 KiB
YAML
name: SPT Release Build
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '* 13 * * *' # Every day at 3pm ET
|
||
push:
|
||
# main can be removed when actions are available in the sub-project repos
|
||
branches: [ main, trigger ]
|
||
|
||
jobs:
|
||
prepare:
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: refringe/spt-build-node:1.0.6
|
||
outputs:
|
||
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 }}
|
||
target_tag: ${{ steps.determine-context.outputs.target_tag }}
|
||
build_type: ${{ steps.determine-build-type.outputs.build_type }}
|
||
client_version: ${{ steps.versions.outputs.client_version }}
|
||
spt_version: ${{ steps.versions.outputs.spt_version }}
|
||
mod_enabled_bleeding: ${{ steps.mod-config.outputs.bleeding }}
|
||
mod_enabled_debug: ${{ steps.mod-config.outputs.debug }}
|
||
mod_enabled_release: ${{ steps.mod-config.outputs.release }}
|
||
|
||
steps:
|
||
- 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"
|
||
echo "::set-output name=branch_server::3.8.0"
|
||
echo "::set-output name=branch_modules::3.8.0"
|
||
echo "::set-output name=branch_launcher::3.8.0"
|
||
else
|
||
echo "::set-output name=is_nightly::false"
|
||
echo "::set-output name=target_tag::3.8.0-BE-20240314"
|
||
fi
|
||
shell: bash
|
||
|
||
- name: Determine Build Type
|
||
id: determine-build-type
|
||
run: |
|
||
if [[ "${{ steps.determine-context.outputs.is_nightly }}" == "true" ]]; then
|
||
# Nightly builds are always considered "bleeding"
|
||
BUILD_TYPE="bleeding"
|
||
else
|
||
TARGET_TAG="${{ steps.determine-context.outputs.target_tag }}"
|
||
|
||
# Debug build by default
|
||
# Bleeding builds have "-BE" in the target tag
|
||
# Release tags follow basic semantic versioning
|
||
BUILD_TYPE="debug"
|
||
if [[ "$TARGET_TAG" =~ -BE ]]; then
|
||
BUILD_TYPE="bleeding"
|
||
elif [[ "$TARGET_TAG" =~ ^(v?\d+\.\d+\.\d+)$ ]]; then
|
||
BUILD_TYPE="release"
|
||
fi
|
||
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=(
|
||
[Server]="https://dev.sp-tarkov.com/SPT-AKI/Server.git@${{ steps.determine-context.outputs.branch_server }}"
|
||
[Modules]="https://dev.sp-tarkov.com/SPT-AKI/Modules.git@${{ steps.determine-context.outputs.branch_modules }}"
|
||
[Launcher]="https://dev.sp-tarkov.com/SPT-AKI/Launcher.git@${{ steps.determine-context.outputs.branch_launcher }}"
|
||
)
|
||
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-context.outputs.target_tag }}"
|
||
REPOS=("https://dev.sp-tarkov.com/SPT-AKI/Server.git" "https://dev.sp-tarkov.com/SPT-AKI/Modules.git" "https://dev.sp-tarkov.com/SPT-AKI/Launcher.git")
|
||
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: Halt Workflow if Necessary
|
||
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: |
|
||
rm -rf /workspace/refringe/Build/server-core
|
||
git init /workspace/refringe/Build/server-core
|
||
cd /workspace/refringe/Build/server-core
|
||
git remote add origin https://dev.sp-tarkov.com/SPT-AKI/Server.git
|
||
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-context.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
|
||
SPT_VERSION=$(jq -r '.akiVersion' core.json)
|
||
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: |
|
||
rm -rf /workspace/refringe/Build/server-mods-config
|
||
git init /workspace/refringe/Build/server-mods-config
|
||
cd /workspace/refringe/Build/server-mods-config
|
||
git remote add origin https://dev.sp-tarkov.com/SPT-AKI/Server.git
|
||
git config core.sparseCheckout true
|
||
|
||
echo "project/src/ide/BleedingEdgeEntry.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-context.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_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=debug::${MODS_DEBUG}"
|
||
echo "::set-output name=release::${MODS_RELEASE}"
|
||
shell: bash
|
||
|
||
build-server:
|
||
needs: [prepare]
|
||
if: needs.prepare.outputs.proceed == 'true'
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: refringe/spt-build-node:1.0.6
|
||
steps:
|
||
- name: Clone
|
||
run: |
|
||
rm -rf /workspace/refringe/Build/server
|
||
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
|
||
BRANCH=${{ needs.prepare.outputs.branch_server }}
|
||
echo "Cloning branch $BRANCH"
|
||
git clone https://dev.sp-tarkov.com/SPT-AKI/Server.git --branch "$BRANCH" --depth 1 /workspace/refringe/Build/server
|
||
else
|
||
TAG=${{ needs.prepare.outputs.target_tag }}
|
||
echo "Cloning tag $TAG"
|
||
git clone https://dev.sp-tarkov.com/SPT-AKI/Server.git --branch "$TAG" --depth 1 /workspace/refringe/Build/server
|
||
fi
|
||
shell: bash
|
||
|
||
- name: Pull LFS Files
|
||
run: |
|
||
cd /workspace/refringe/Build/server
|
||
git lfs pull && git lfs ls-files
|
||
shell: bash
|
||
|
||
- name: Runner Debug Information
|
||
run: |
|
||
cd /workspace/refringe/Build/server
|
||
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: Install Dependencies
|
||
run: |
|
||
cd /workspace/refringe/Build/server/project
|
||
rm -rf package-lock.json node_modules
|
||
npm cache clean --force
|
||
npm install
|
||
shell: bash
|
||
|
||
- name: Build Server
|
||
run: |
|
||
cd /workspace/refringe/Build/server/project
|
||
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"
|
||
tree -C /workspace/refringe/Build/server/project/build
|
||
shell: bash
|
||
|
||
- name: Artifact Server
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: server-artifact
|
||
path: /workspace/refringe/Build/server/project/build/
|
||
compression-level: 0
|
||
retention-days: 1
|
||
overwrite: true
|
||
|
||
build-modules:
|
||
needs: [prepare]
|
||
if: needs.prepare.outputs.proceed == 'true'
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: refringe/spt-build-dotnet:1.0.0
|
||
steps:
|
||
- name: Clone
|
||
run: |
|
||
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
|
||
BRANCH=${{ needs.prepare.outputs.branch_modules }}
|
||
echo "Cloning modules from branch $BRANCH"
|
||
git clone https://dev.sp-tarkov.com/SPT-AKI/Modules.git --branch "$BRANCH" --depth 1 /workspace/refringe/Build/modules
|
||
else
|
||
TAG=${{ needs.prepare.outputs.target_tag }}
|
||
echo "Cloning modules from tag $TAG"
|
||
git clone https://dev.sp-tarkov.com/SPT-AKI/Modules.git --branch "$TAG" --depth 1 /workspace/refringe/Build/modules
|
||
fi
|
||
shell: bash
|
||
|
||
- name: Download Client Module Package
|
||
run: |
|
||
DIR_MANAGED="/workspace/refringe/Build/modules/project/Shared/Managed"
|
||
DOWNLOAD_PATH="$DIR_MANAGED/${{ needs.prepare.outputs.client_version }}.zip"
|
||
DOWNLOAD_URL="${{ secrets.MODULE_DOMAIN }}/${{ needs.prepare.outputs.client_version }}.zip"
|
||
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: |
|
||
cd /workspace/refringe/Build/modules/project/Shared/Managed
|
||
7z x ${{ needs.prepare.outputs.client_version }}.zip -aoa
|
||
echo "Client module package decompressed."
|
||
shell: bash
|
||
|
||
- name: Delete Client Module Package
|
||
run: |
|
||
cd /workspace/refringe/Build/modules/project/Shared/Managed
|
||
rm -f ${{ needs.prepare.outputs.client_version }}.zip
|
||
echo "Client module package deleted."
|
||
shell: bash
|
||
|
||
- name: Build Modules
|
||
run: |
|
||
cd /workspace/refringe/Build/modules/project
|
||
dotnet build
|
||
printf "\nBuilt!\n\n"
|
||
tree /workspace/refringe/Build/modules/project/Build
|
||
shell: bash
|
||
|
||
- name: Artifact Modules
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: modules-artifact
|
||
path: /workspace/refringe/Build/modules/project/Build
|
||
compression-level: 0
|
||
retention-days: 1
|
||
overwrite: true
|
||
|
||
build-launcher:
|
||
needs: [prepare]
|
||
if: needs.prepare.outputs.proceed == 'true'
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: refringe/spt-build-dotnet:1.0.0
|
||
steps:
|
||
- name: Clone
|
||
run: |
|
||
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
|
||
BRANCH=${{ needs.prepare.outputs.branch_launcher }}
|
||
echo "Cloning launcher from branch $BRANCH"
|
||
git clone https://dev.sp-tarkov.com/SPT-AKI/Launcher.git --branch "$BRANCH" --depth 1 /workspace/refringe/Build/launcher
|
||
else
|
||
TAG=${{ needs.prepare.outputs.target_tag }}
|
||
echo "Cloning launcher from tag $TAG"
|
||
git clone https://dev.sp-tarkov.com/SPT-AKI/Launcher.git --branch "$TAG" --depth 1 /workspace/refringe/Build/launcher
|
||
fi
|
||
shell: bash
|
||
|
||
- name: Build Launcher
|
||
run: |
|
||
cd /workspace/refringe/Build/launcher/project
|
||
dotnet build
|
||
printf "\nBuilt!\n\n"
|
||
tree /workspace/refringe/Build/launcher/project/Build
|
||
shell: bash
|
||
|
||
- name: Artifact Launcher
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: launcher-artifact
|
||
path: /workspace/refringe/Build/launcher/project/Build
|
||
compression-level: 0
|
||
retention-days: 1
|
||
overwrite: true
|
||
|
||
assemble-release:
|
||
needs: [prepare, build-server, build-modules, build-launcher]
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: refringe/spt-build-node:1.0.6
|
||
outputs:
|
||
base_name: ${{ steps.generate-filename.outputs.base_name }}
|
||
build_name: ${{ steps.generate-filename.outputs.build_name }}
|
||
steps:
|
||
- name: Clean Directory
|
||
run: |
|
||
rm -rf /workspace/refringe/Build/release /workspace/refringe/Build/build
|
||
mkdir -p /workspace/refringe/Build/release
|
||
shell: bash
|
||
|
||
- name: Download Server Artifact
|
||
uses: actions/download-artifact@v3
|
||
with:
|
||
name: server-artifact
|
||
path: /workspace/refringe/Build/release/
|
||
|
||
- name: Download Modules Artifact
|
||
uses: actions/download-artifact@v3
|
||
with:
|
||
name: modules-artifact
|
||
path: /workspace/refringe/Build/release/
|
||
|
||
- name: Download Launcher Artifact
|
||
uses: actions/download-artifact@v3
|
||
with:
|
||
name: launcher-artifact
|
||
path: /workspace/refringe/Build/release/
|
||
|
||
- name: Clone Build Project
|
||
uses: actions/checkout@v3
|
||
with:
|
||
path: /workspace/refringe/Build/build
|
||
|
||
- name: Merge Static Assets and Dynamic Files
|
||
run: cp -rvf /workspace/refringe/Build/build/static-assets/* /workspace/refringe/Build/release/
|
||
shell: bash
|
||
|
||
- name: List Release Contents
|
||
run: tree /workspace/refringe/Build/release
|
||
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 }}
|
||
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}-${DATE}"
|
||
else
|
||
# 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}"
|
||
else
|
||
# 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}${TAG_PART}"
|
||
else
|
||
BASE_NAME="SPT-${UPPER_BUILD_TYPE}-${SPT_VERSION}-${CLIENT_VERSION}-${DATE}"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
echo "::set-output name=base_name::${BASE_NAME}"
|
||
echo "::set-output name=build_name::${BASE_NAME}.7z"
|
||
shell: bash
|
||
|
||
- name: Artifact Release
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: release-artifact
|
||
path: /workspace/refringe/Build/release
|
||
compression-level: 0
|
||
retention-days: 1
|
||
overwrite: true
|
||
|
||
publish-release:
|
||
needs: [prepare, assemble-release, build-server]
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: refringe/spt-build-node:1.0.6
|
||
steps:
|
||
- name: Download Release Artifact
|
||
uses: actions/download-artifact@v3
|
||
with:
|
||
name: release-artifact
|
||
path: /workspace/refringe/Build/release
|
||
|
||
- name: Compress Release
|
||
run: |
|
||
cd /workspace/refringe/Build/release
|
||
7z a -mx=9 -m0=lzma2 "../${{ needs.assemble-release.outputs.build_name }}" ./*
|
||
echo "Release compressed as ${{ needs.assemble-release.outputs.build_name }}."
|
||
shell: bash
|
||
|
||
- name: Upload Release to HTTPS Source
|
||
id: upload-https-7z
|
||
run: |
|
||
cd /workspace/refringe/Build/
|
||
echo "${{ secrets.SFTP_HOST_KEY }}" > known_host
|
||
sshpass -p "${{ secrets.SFTP_PASSWORD }}" scp -v -o "Port=${{ secrets.SFTP_PORT }}" -o "ConnectTimeout=20" -o "UserKnownHostsFile=known_host" -o "StrictHostKeyChecking=yes" "/workspace/refringe/Build/${{ needs.assemble-release.outputs.build_name }}" ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }}:/public
|
||
echo "::set-output name=link_https::${{ secrets.SFTP_MIRROR_LINK }}/${{ needs.assemble-release.outputs.build_name }}"
|
||
shell: bash
|
||
|
||
- name: Create Torrent File
|
||
if: needs.prepare.outputs.build_type == 'release'
|
||
id: torrent_create
|
||
run: |
|
||
BASE_NAME="${{ needs.assemble-release.outputs.base_name }}"
|
||
BUILD_NAME="${{ needs.assemble-release.outputs.build_name }}"
|
||
TORRENT_NAME="${BASE_NAME}.torrent"
|
||
TORF_OUTPUT=$(/opt/venv/bin/torf --yes --out "/workspace/refringe/Build/${TORRENT_NAME}" \
|
||
--webseed "${{ steps.upload-https-7z.outputs.link_https }}" \
|
||
--tracker "http://open.acgnxtracker.com:80/announce,https://tracker.tamersunion.org:443/announce,http://tracker.renfei.net:8080/announce,udp://tracker.torrent.eu.org:451/announce,udp://ec2-18-191-163-220.us-east-2.compute.amazonaws.com:6969/announce" \
|
||
--comment "Official ${BASE_NAME} release, built by the team at sp-tarkov.com. Have fun!" \
|
||
--creator "sp-tarkov.com" \
|
||
--verbose \
|
||
"/workspace/refringe/Build/${{ needs.assemble-release.outputs.build_name }}")
|
||
MAGNET_LINK=$(echo "${TORF_OUTPUT}" | grep -oP 'Magnet\t\K.*')
|
||
echo "::set-output name=link_magnet::${MAGNET_LINK}"
|
||
echo "::set-output name=torrent_name::${TORRENT_NAME}"
|
||
shell: bash
|
||
|
||
- name: Upload Torrent to HTTPS Source
|
||
if: needs.prepare.outputs.build_type == 'release'
|
||
id: upload-https-torrent
|
||
run: |
|
||
cd /workspace/refringe/Build/
|
||
echo "${{ secrets.SFTP_HOST_KEY }}" > known_host
|
||
sshpass -p "${{ secrets.SFTP_PASSWORD }}" scp -v -o "Port=${{ secrets.SFTP_PORT }}" -o "ConnectTimeout=20" -o "UserKnownHostsFile=known_host" -o "StrictHostKeyChecking=yes" "/workspace/refringe/Build/${{ steps.torrent_create.outputs.torrent_name }}" ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }}:/public
|
||
echo "::set-output name=link_torrent::${{ secrets.SFTP_MIRROR_LINK }}/${{ steps.torrent_create.outputs.torrent_name }}"
|
||
shell: bash
|
||
|
||
- name: Clean Old HTTPS Source Releases
|
||
run: |
|
||
cd /workspace/refringe/Build/
|
||
echo "${{ secrets.SFTP_HOST_KEY }}" > known_hosts
|
||
|
||
# Creating a script for sftp to execute
|
||
echo "cd /public" > sftp_commands.txt
|
||
echo "ls" >> sftp_commands.txt
|
||
|
||
# Fetch a remote list of files
|
||
FILE_LIST=$(sshpass -p "${{ secrets.SFTP_PASSWORD }}" sftp -oBatchMode=no -oPort=${{ secrets.SFTP_PORT }} -oUserKnownHostsFile=known_hosts -oStrictHostKeyChecking=yes -b sftp_commands.txt ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }})
|
||
|
||
echo "Files listed:"
|
||
echo "$FILE_LIST"
|
||
|
||
# Filtering and processing the file list
|
||
echo "$FILE_LIST" | tr ' ' '\n' | grep -E 'SPT-(NIGHTLY|DEBUG|BLEEDING).*\.(7z|torrent)$' | while read filename; do
|
||
echo "Processing file: $filename"
|
||
# Extract date from filename
|
||
if [[ "$filename" =~ ([0-9]{8})\.(7z|torrent)$ ]]; then
|
||
file_date="${BASH_REMATCH[1]}"
|
||
file_date_fmt=$(date -d "${file_date:0:4}-${file_date:4:2}-${file_date:6:2}" +%s)
|
||
|
||
current_date=$(date +%s)
|
||
limit_date=$(date -d "@$((current_date - 14 * 24 * 3600))" +%s)
|
||
|
||
if [[ "$file_date_fmt" -lt "$limit_date" ]]; then
|
||
echo "Marked for deletion: $filename"
|
||
echo "rm \"/public/$filename\"" >> delete_commands.txt
|
||
fi
|
||
fi
|
||
done
|
||
|
||
# Check if there are files to delete and execute
|
||
if [ -s delete_commands.txt ]; then
|
||
echo "Running deletion task..."
|
||
sshpass -p "${{ secrets.SFTP_PASSWORD }}" sftp -oBatchMode=no -oPort=${{ secrets.SFTP_PORT }} -oUserKnownHostsFile=known_hosts -oStrictHostKeyChecking=yes -b delete_commands.txt ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }}
|
||
else
|
||
echo "No old files to delete."
|
||
fi
|
||
shell: bash
|
||
|
||
- name: Upload Release to Mega
|
||
id: upload-mega
|
||
run: |
|
||
mega-https on
|
||
mega-login "${{ secrets.MEGA_EMAIL }}" "${{ secrets.MEGA_PASSWORD }}"
|
||
|
||
mega-put -c "/workspace/refringe/Build/${{ needs.assemble-release.outputs.build_name }}" "/spt-release/${{ needs.assemble-release.outputs.build_name }}"
|
||
|
||
# Generate link and save it.
|
||
EXPORT_OUTPUT=$(mega-export -a "/spt-release/${{ needs.assemble-release.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 }}"
|
||
|
||
# List files and filter out old NIGHTLY, DEBUG, or BLEEDING files
|
||
mega-ls /spt-release | grep -E 'SPT-(NIGHTLY|DEBUG|BLEEDING).*\.7z$' | while read -r filename; do
|
||
# Extract date from filename
|
||
if [[ "$filename" =~ ([0-9]{8})\.7z$ ]]; then
|
||
file_date="${BASH_REMATCH[1]}"
|
||
file_date_fmt=$(date -d "${file_date:0:4}-${file_date:4:2}-${file_date:6:2}" +%s)
|
||
|
||
# Get current date minus 14 days
|
||
current_date=$(date +%s)
|
||
limit_date=$(date -d "@$((current_date - 14 * 24 * 3600))" +%s)
|
||
|
||
# Compare dates and delete old files
|
||
if [[ "$file_date_fmt" -lt "$limit_date" ]]; then
|
||
echo "Deleting old file: $filename"
|
||
mega-rm "/spt-release/$filename"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
# 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: ${{ needs.assemble-release.outputs.base_name }}
|
||
BUILD_NAME: ${{ needs.assemble-release.outputs.build_name }}
|
||
LINK_MEGA: ${{ steps.upload-mega.outputs.link_mega }}
|
||
LINK_HTTPS: ${{ steps.upload-https-7z.outputs.link_https }}
|
||
LINK_TORRENT: ${{ steps.upload-https-torrent.outputs.link_torrent }}
|
||
MODS_ENABLED_BLEEDING: ${{ needs.prepare.outputs.mod_enabled_bleeding }}
|
||
MODS_ENABLED_DEBUG: ${{ needs.prepare.outputs.mod_enabled_debug }}
|
||
MODS_ENABLED_RELEASE: ${{ needs.prepare.outputs.mod_enabled_release }}
|
||
run: |
|
||
cd /workspace/refringe/Build/
|
||
FOOTER_MESSAGES=("You look great today!" "Don't ban me, Phantom!" "Powered by coffee" "Did you remember to hydrate today?" "Have you tried turning it off and on again?" "In Chomp we trust" "Beep boop, I'm a bot" "Keep calm and commit your code" "May the source be with you" "Go to bed, Terk" "Please direct all support requests to Drakia" "Meaw")
|
||
FOOTER_MESSAGE="${FOOTER_MESSAGES[$RANDOM % ${#FOOTER_MESSAGES[@]}]}"
|
||
TIMESTAMP=$(date --iso-8601=seconds)
|
||
FILE_SIZE_MB=$(stat -c %s "$BUILD_NAME" | awk '{printf "%.2f MB", $1 / 1024 / 1024}')
|
||
FILE_HASH=$(sha256sum "$BUILD_NAME" | awk '{print $1}')
|
||
MODS=""
|
||
|
||
if [[ "${{ needs.prepare.outputs.is_nightly }}" == "true" ]]; then
|
||
EMBED_COLOR=16705372
|
||
EMBED_TITLE="Fresh Nightly Build"
|
||
EMBED_DESCRIPTION=$'A new nightly build is now 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.'
|
||
MODS="$MODS_ENABLED_BLEEDING"
|
||
else
|
||
if [ "$BUILD_TYPE" == "bleeding" ]; then
|
||
EMBED_COLOR=15548997
|
||
EMBED_TITLE="New Bleeding Build"
|
||
EMBED_DESCRIPTION=$'A new bleeding edge build is now 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" == "debug" ]; then
|
||
EMBED_COLOR=2123412
|
||
EMBED_TITLE="New Debug Build"
|
||
EMBED_DESCRIPTION=$'A new debug build is now available. These have extra-verbose logging enabled. 7-Zip is *required* to extract the release.'
|
||
MODS="$MODS_ENABLED_DEBUG"
|
||
else
|
||
EMBED_COLOR=5763719
|
||
EMBED_TITLE="New Stable Build"
|
||
EMBED_DESCRIPTION=$'A new stable release build is now ready for download. 7-Zip is *required* to extract the release.'
|
||
MODS="$MODS_ENABLED_RELEASE"
|
||
fi
|
||
fi
|
||
|
||
# Build the dynamic part of the description
|
||
EMBED_DESCRIPTION+=$'\n\n🗂️ **Build Information:** 🗂️\n**Name**: *'"${BASE_NAME}"$'*\n**Mods Enabled**: *'"${MODS}"$'*\n**File Size**: *'"${FILE_SIZE_MB}"$'*\n**SHA-256 Hash**: *'"${FILE_HASH}"$'*\n\n🚀 **Primary Download Link:** 🚀\n'"${LINK_MEGA}"$''
|
||
if [ -n "$LINK_TORRENT" ] && [ "$BUILD_TYPE" == "release" ]; then
|
||
# Conditionally add the torrent link for releases
|
||
EMBED_DESCRIPTION+=$'\n\n🔗 **Torrent Link:** 🔗\n'"${LINK_TORRENT}"$''
|
||
fi
|
||
EMBED_DESCRIPTION+=$'\n\nIn order to conserve bandwidth, please consider using the *above* methods to download the release. If you have issues using those methods, you are free to download using any of the following HTTP mirrors.\n\nWhile the links *below* are not secret, **do not advertise them**. The primary MEGA link or torrent should be used to advertise any downloads.\n\n🌐 **Mirrors:** 🌐\n'"${LINK_HTTPS}"
|
||
|
||
jq -n \
|
||
--arg EMBED_TITLE "$EMBED_TITLE" \
|
||
--arg EMBED_DESCRIPTION "$EMBED_DESCRIPTION" \
|
||
--arg LINK_MEGA "$LINK_MEGA" \
|
||
--argjson EMBED_COLOR $EMBED_COLOR \
|
||
--arg FOOTER_MESSAGE "$FOOTER_MESSAGE" \
|
||
--arg TIMESTAMP "$TIMESTAMP" \
|
||
'{
|
||
"username": "BuildBot",
|
||
"avatar_url": "https://i.imgur.com/28JJJec.png",
|
||
"content": "✨ **New Build Available!** ✨",
|
||
"embeds": [
|
||
{
|
||
"title": $EMBED_TITLE,
|
||
"description": $EMBED_DESCRIPTION,
|
||
"url": $LINK_MEGA,
|
||
"color": $EMBED_COLOR,
|
||
"footer": {
|
||
"text": $FOOTER_MESSAGE
|
||
},
|
||
"timestamp": $TIMESTAMP
|
||
}
|
||
]
|
||
}' > 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 \
|
||
$DISCORD_WEBHOOK_URL
|
||
shell: bash
|