name: SPT Release Build on: push: branches: [ main ] pull_request: branches: [ main ] jobs: check-tag-exists: runs-on: ubuntu-latest outputs: proceed: ${{ steps.check.outputs.proceed }} target_tag: ${{ steps.check.outputs.target_tag }} steps: - name: Check Tag Exists in All Repositories id: check run: | # The tag needs to be saved as a variable so that it can be used throughout the build process. TAG="3.8.0-BE-20240308" 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") PROCEED="true" 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 echo "::set-output name=proceed::${PROCEED}" echo "::set-output name=target_tag::${TAG}" shell: bash - name: Tag Not Found if: steps.check.outputs.proceed == 'false' run: | echo "Tag not found in one or more repositories, halting workflow." exit 1 build-server: needs: check-tag-exists if: needs.check-tag-exists.outputs.proceed == 'true' runs-on: ubuntu-latest container: image: refringe/spt-build-node:1.0.3 outputs: build_type: ${{ steps.build-type.outputs.build_type }} steps: - name: Clone run: | TARGET_TAG=${{ needs.check-tag-exists.outputs.target_tag }} rm -rf /workspace/refringe/Build/server git clone https://dev.sp-tarkov.com/SPT-AKI/Server.git --branch "${TARGET_TAG}" --depth 1 /workspace/refringe/Build/server - name: Pull LFS Files run: | cd /workspace/refringe/Build/server git lfs pull && git lfs ls-files - 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 - name: Cache Keys id: cache-keys run: | cd /workspace/refringe/Build/server echo "::set-output name=commit_hash::$(git rev-parse HEAD)" TAGS=$(git tag --contains HEAD || echo "no-tag") if [ -z "$TAGS" ]; then TAGS="no-tag" fi TAGS="${TAGS//$'\n'/-}" # Replace newline characters with dashes TAGS="${TAGS//,/-}" # Replace commas with dashes echo "::set-output name=tags::${TAGS}" echo "Commit Hash: ${{ steps.cache-keys.outputs.commit_hash }}" echo "Tags: ${{ steps.cache-keys.outputs.tags }}" shell: bash - name: Determine Build Type id: build-type run: | TAGS="${{ steps.cache-keys.outputs.tags }}" BUILD_TYPE="debug" # Default if [[ "$TAGS" =~ -BE ]]; then BUILD_TYPE="bleeding" elif [[ "$TAGS" =~ ^(v?\d+\.\d+\.\d+)$ ]]; then BUILD_TYPE="release" fi echo "::set-output name=build_type::${BUILD_TYPE}" shell: bash - name: Build Cache id: build-cache uses: actions/cache@v4 with: path: /workspace/refringe/Build/server/project/build key: build-${{ steps.cache-keys.outputs.commit_hash }}-${{ steps.cache-keys.outputs.tags }}-${{ steps.build-type.outputs.build_type }} restore-keys: | build-${{ steps.cache-keys.outputs.commit_hash }}-${{ steps.cache-keys.outputs.tags }}- build-${{ steps.cache-keys.outputs.commit_hash }}- build- - name: Install Dependencies if: steps.build-cache.outputs.cache-hit != 'true' run: | cd /workspace/refringe/Build/server/project npm install - name: Build Server if: steps.build-cache.outputs.cache-hit != 'true' run: | cd /workspace/refringe/Build/server/project BUILD_TYPE="${{ steps.build-type.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: Archive Build uses: actions/upload-artifact@v3 with: name: server-build path: /workspace/refringe/Build/server/project/build/ compression-level: 0 retention-days: 1 overwrite: true build-modules: needs: check-tag-exists if: needs.check-tag-exists.outputs.proceed == 'true' runs-on: ubuntu-latest container: image: refringe/spt-build-dotnet:1.0.0 outputs: spt_version: ${{ steps.extract-client-version.outputs.spt_version }} client_version: ${{ steps.extract-client-version.outputs.client_version }} steps: - name: Clone run: | TARGET_TAG=${{ needs.check-tag-exists.outputs.target_tag }} rm -rf /workspace/refringe/Build/modules git clone https://dev.sp-tarkov.com/SPT-AKI/Modules.git --branch "${TARGET_TAG}" --depth 1 /workspace/refringe/Build/modules - name: Fetch Server Core Config run: | TARGET_TAG=${{ needs.check-tag-exists.outputs.target_tag }} 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 git fetch --depth=1 origin "${TARGET_TAG}" git checkout FETCH_HEAD ls -la project/assets/configs shell: bash - name: Extract Client Version id: extract-client-version run: | cd /workspace/refringe/Build/server-core/project/assets/configs SPT_VERSION=$(jq -r '.akiVersion' core.json) FULL_VERSION=$(jq -r '.compatibleTarkovVersion' core.json) CLIENT_VERSION=${FULL_VERSION##*.} echo "Extracted Client Version: $CLIENT_VERSION" echo "::set-output name=client_version::${CLIENT_VERSION}" echo "::set-output name=spt_version::${SPT_VERSION}" shell: bash - name: Download Client Module Package run: | DIR_MANAGED="/workspace/refringe/Build/modules/project/Shared/Managed" DOWNLOAD_PATH="$DIR_MANAGED/${{ steps.extract-client-version.outputs.client_version }}.zip" DOWNLOAD_URL="$MODULE_DOMAIN/${{ steps.extract-client-version.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 env: MODULE_DOMAIN: ${{ secrets.MODULE_DOMAIN }} - name: Decompress Client Module Package run: | cd /workspace/refringe/Build/modules/project/Shared/Managed 7z x ${{ steps.extract-client-version.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 ${{ steps.extract-client-version.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: Archive Build uses: actions/upload-artifact@v3 with: name: modules-build path: /workspace/refringe/Build/modules/project/Build compression-level: 0 retention-days: 1 overwrite: true build-launcher: needs: check-tag-exists if: needs.check-tag-exists.outputs.proceed == 'true' runs-on: ubuntu-latest container: image: refringe/spt-build-dotnet:1.0.0 steps: - name: Clone run: | TARGET_TAG=${{ needs.check-tag-exists.outputs.target_tag }} rm -rf /workspace/refringe/Build/launcher git clone https://dev.sp-tarkov.com/SPT-AKI/Launcher.git --branch "${TARGET_TAG}" --depth 1 /workspace/refringe/Build/launcher - 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: Archive Build uses: actions/upload-artifact@v3 with: name: launcher-build path: /workspace/refringe/Build/launcher/project/Build compression-level: 0 retention-days: 1 overwrite: true assemble-release: needs: [check-tag-exists, build-server, build-modules, build-launcher] runs-on: ubuntu-latest container: image: refringe/spt-build-node:1.0.3 steps: - name: Clean Directory run: | rm -rf /workspace/refringe/Build/release /workspace/refringe/Build/build mkdir -p /workspace/refringe/Build/release - name: Download Server Build Artifact uses: actions/download-artifact@v3 with: name: server-build path: /workspace/refringe/Build/release/ - name: Download Modules Build Artifact uses: actions/download-artifact@v3 with: name: modules-build path: /workspace/refringe/Build/release/ - name: Download Launcher Build Artifact uses: actions/download-artifact@v3 with: name: launcher-build 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.build-server.outputs.build_type }} SPT_VERSION=${{ needs.build-modules.outputs.spt_version }} CLIENT_VERSION=${{ needs.build-modules.outputs.client_version }} DATE=$(date +%Y%m%d) # Make BUILD_TYPE uppercase UPPER_BUILD_TYPE=$(echo "$BUILD_TYPE" | tr '[:lower:]' '[:upper:]') # Conditionally format the FILENAME based on BUILD_TYPE if [ "$BUILD_TYPE" = "release" ]; then FILENAME="SPT-${SPT_VERSION}-${CLIENT_VERSION}-${DATE}.7z" else FILENAME="SPT-${UPPER_BUILD_TYPE}-${SPT_VERSION}-${CLIENT_VERSION}-${DATE}.7z" fi echo "::set-output name=filename::${FILENAME}" shell: bash - name: Compress Release run: | cd /workspace/refringe/Build/release 7z a -mx=9 -m0=lzma2 "../${{ steps.generate-filename.outputs.filename }}" ./* echo "Release compressed as ${{ steps.generate-filename.outputs.filename }}." shell: bash - name: Upload Release to HTTP Source 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.generate-filename.outputs.filename }}" ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }}:/public shell: bash - name: Clean Old SFTP Releases run: | cd /workspace/refringe/Build/ echo "Preparing known_hosts for host key verification..." echo "${{ secrets.SFTP_HOST_KEY }}" > known_hosts echo "Generating initial sftp_batch.txt..." echo "cd /public" > sftp_batch.txt echo "Listing files with sftp..." FILE_LIST=$(sshpass -p "${{ secrets.SFTP_PASSWORD }}" sftp -oBatchMode=no -oPort=${{ secrets.SFTP_PORT }} -oUserKnownHostsFile=known_hosts -oStrictHostKeyChecking=yes ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }}:/public <<< "ls" 2>&1) echo "Files listed." echo "Processing file list..." echo "$FILE_LIST" | grep -E 'SPT-(DEBUG|BLEEDING).*\.7z$' | while read -r filename; do echo "Processing $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) current_date=$(date +%s) limit_date=$(date -d "@$((current_date - 30 * 24 * 3600))" +%s) if [[ "$file_date_fmt" -lt "$limit_date" ]]; then echo "Queueing deletion for: $filename" echo "rm \"/public/$filename\"" >> sftp_batch.txt fi fi done echo "Executing deletion commands..." sshpass -p "${{ secrets.SFTP_PASSWORD }}" sftp -oBatchMode=no -b sftp_batch.txt -oPort=${{ secrets.SFTP_PORT }} -oUserKnownHostsFile=known_hosts -oStrictHostKeyChecking=yes ${{ secrets.SFTP_USERNAME }}@${{ secrets.SFTP_HOST }} 2>&1 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/${{ steps.generate-filename.outputs.filename }}" "/spt-release/${{ steps.generate-filename.outputs.filename }}" # Generate link and save it. EXPORT_OUTPUT=$(mega-export -a "/spt-release/${{ steps.generate-filename.outputs.filename }}" -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 DEBUG or BLEEDING files mega-ls /spt-release | grep -E 'SPT-(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 30 days current_date=$(date +%s) limit_date=$(date -d "@$((current_date - 30 * 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