j,yjdktybt fdnjc,jhobrf
This commit is contained in:
@@ -1,77 +1,134 @@
|
|||||||
name: Nightly Build
|
name: Nightly Build (Linux)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: ${{ vars.CRON_SCHEDULE }}
|
# 01:00 MSK = 22:00 UTC предыдущего дня
|
||||||
|
- cron: '0 22 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
force_build:
|
||||||
|
description: 'Force build even without recent changes'
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
env:
|
env:
|
||||||
PROJECT_NAME: ${{ vars.PROJECT_NAME }}
|
PROJECT_NAME: Game_2
|
||||||
BUILD_CONFIG: ${{ vars.BUILD_CONFIGURATION }}
|
BUILD_CONFIG: Shipping
|
||||||
RETENTION_DAYS: ${{ vars.ARTIFACT_RETENTION_DAYS }}
|
ENGINE_DIR: /opt/unreal-engine
|
||||||
|
RETENTION_DAYS: 7
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-changes:
|
check-changes:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
changed: ${{ steps.check.outputs.changed }}
|
should_build: ${{ steps.check.outputs.should_build }}
|
||||||
commit_count: ${{ steps.check.outputs.commit_count }}
|
commit_count: ${{ steps.check.outputs.commit_count }}
|
||||||
|
last_commit: ${{ steps.check.outputs.last_commit }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
|
|
||||||
- name: Check for changes in last 24h
|
- name: Check for changes in last 24 hours
|
||||||
id: check
|
id: check
|
||||||
run: |
|
run: |
|
||||||
CHANGES=$(git log --since="24 hours ago" --oneline | wc -l)
|
FORCE="${{ github.event.inputs.force_build }}"
|
||||||
|
|
||||||
|
if [ "$FORCE" = "true" ]; then
|
||||||
|
echo "should_build=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "commit_count=forced" >> $GITHUB_OUTPUT
|
||||||
|
echo "last_commit=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
|
||||||
|
echo "🔧 Force build requested"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
CHANGES=$(git log --since="24 hours ago" --oneline 2>/dev/null | wc -l)
|
||||||
|
LAST_COMMIT=$(git rev-parse --short HEAD)
|
||||||
|
|
||||||
if [ "$CHANGES" -gt 0 ]; then
|
if [ "$CHANGES" -gt 0 ]; then
|
||||||
echo "changed=true" >> $GITHUB_OUTPUT
|
echo "should_build=true" >> $GITHUB_OUTPUT
|
||||||
echo "commit_count=$CHANGES" >> $GITHUB_OUTPUT
|
echo "commit_count=$CHANGES" >> $GITHUB_OUTPUT
|
||||||
|
echo "last_commit=$LAST_COMMIT" >> $GITHUB_OUTPUT
|
||||||
|
echo "✅ Found $CHANGES commits in last 24h"
|
||||||
else
|
else
|
||||||
echo "changed=false" >> $GITHUB_OUTPUT
|
echo "should_build=false" >> $GITHUB_OUTPUT
|
||||||
echo "commit_count=0" >> $GITHUB_OUTPUT
|
echo "commit_count=0" >> $GITHUB_OUTPUT
|
||||||
|
echo "last_commit=$LAST_COMMIT" >> $GITHUB_OUTPUT
|
||||||
|
echo "⏭️ No recent changes, skipping build"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
needs: check-changes
|
needs: check-changes
|
||||||
if: needs.check-changes.outputs.changed == 'true'
|
if: needs.check-changes.outputs.should_build == 'true'
|
||||||
runs-on: ${{ vars.LINUX_RUNNER_LABEL }}
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 120
|
timeout-minutes: 180
|
||||||
env:
|
|
||||||
ENGINE_DIR: /opt/unreal-engine
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
lfs: true
|
lfs: true
|
||||||
|
|
||||||
- name: Pull LFS files
|
- name: Pull LFS files
|
||||||
run: git lfs pull
|
|
||||||
|
|
||||||
- name: Verify engine path
|
|
||||||
run: |
|
run: |
|
||||||
if [ ! -d "$ENGINE_DIR" ]; then
|
git lfs pull
|
||||||
echo "::error::Engine not found at $ENGINE_DIR"
|
echo "📦 LFS files pulled"
|
||||||
|
|
||||||
|
- name: Verify UE5 engine mount
|
||||||
|
run: |
|
||||||
|
if [ ! -f "$ENGINE_DIR/Engine/Build/BatchFiles/Linux/Build.sh" ]; then
|
||||||
|
echo "::error::UE5 Build.sh not found at $ENGINE_DIR"
|
||||||
|
echo "::error::Check docker-compose volume mount for /opt/unreal-engine"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "Engine found: $ENGINE_DIR"
|
|
||||||
|
# Проверка версии движка
|
||||||
|
VERSION_FILE="$ENGINE_DIR/Engine/Source/Runtime/Launch/Resources/Version.h"
|
||||||
|
if [ -f "$VERSION_FILE" ]; then
|
||||||
|
ENGINE_VER=$(grep "ENGINE_MAJOR_VERSION\|ENGINE_MINOR_VERSION\|ENGINE_PATCH_VERSION" "$VERSION_FILE" | head -3 | tr '\n' '.' | sed 's/[^0-9.]//g')
|
||||||
|
echo "🎮 UE5 Version: $ENGINE_VER"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ UE5 engine verified at $ENGINE_DIR"
|
||||||
|
|
||||||
|
- name: Clean previous build artifacts
|
||||||
|
run: |
|
||||||
|
rm -rf Binaries/Linux Intermediate/Build/Linux
|
||||||
|
echo "🧹 Previous artifacts cleaned"
|
||||||
|
|
||||||
- name: Build Linux ${{ env.BUILD_CONFIG }}
|
- name: Build Linux ${{ env.BUILD_CONFIG }}
|
||||||
run: |
|
run: |
|
||||||
SHORT_SHA="${{ github.sha }}"
|
SHORT_SHA="${{ github.sha }}"
|
||||||
ARCHIVE_NAME="${PROJECT_NAME}-Linux-${SHORT_SHA::7}.tar.gz"
|
ARCHIVE_NAME="${PROJECT_NAME}-Linux-${SHORT_SHA::7}.tar.gz"
|
||||||
|
|
||||||
|
echo "🔨 Starting build: $PROJECT_NAME Linux $BUILD_CONFIG"
|
||||||
|
echo "📁 Project: $(pwd)/${PROJECT_NAME}.uproject"
|
||||||
|
echo "📦 Output: $ARCHIVE_NAME"
|
||||||
|
|
||||||
"$ENGINE_DIR/Engine/Build/BatchFiles/Linux/Build.sh" \
|
"$ENGINE_DIR/Engine/Build/BatchFiles/Linux/Build.sh" \
|
||||||
"${PROJECT_NAME}" Linux "${BUILD_CONFIG}" \
|
"${PROJECT_NAME}" \
|
||||||
|
Linux \
|
||||||
|
"${BUILD_CONFIG}" \
|
||||||
-Project="$(pwd)/${PROJECT_NAME}.uproject" \
|
-Project="$(pwd)/${PROJECT_NAME}.uproject" \
|
||||||
-NoP4 -UTF8Output -Clean
|
-NoP4 \
|
||||||
|
-UTF8Output \
|
||||||
tar -czf "$ARCHIVE_NAME" \
|
-Clean \
|
||||||
-C Binaries/Linux \
|
-SkipVulkanDeviceExtensions=VK_KHR_swapchain_mutable_format
|
||||||
"${PROJECT_NAME}-Linux-${BUILD_CONFIG}" \
|
|
||||||
../Content/Paks/* 2>/dev/null || true
|
# Архивация билда
|
||||||
|
if [ -d "Binaries/Linux" ]; then
|
||||||
echo "ARCHIVE_NAME=$ARCHIVE_NAME" >> $GITHUB_ENV
|
tar -czf "$ARCHIVE_NAME" \
|
||||||
|
-C Binaries/Linux \
|
||||||
|
. \
|
||||||
|
../../Content/Paks/* 2>/dev/null || true
|
||||||
|
|
||||||
|
SIZE=$(du -h "$ARCHIVE_NAME" | cut -f1)
|
||||||
|
echo "📦 Archive created: $ARCHIVE_NAME ($SIZE)"
|
||||||
|
echo "ARCHIVE_NAME=$ARCHIVE_NAME" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo "::error::Build output directory not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Upload Linux artifact
|
- name: Upload Linux artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -79,57 +136,61 @@ jobs:
|
|||||||
name: linux-build
|
name: linux-build
|
||||||
path: ${{ env.ARCHIVE_NAME }}
|
path: ${{ env.ARCHIVE_NAME }}
|
||||||
retention-days: ${{ env.RETENTION_DAYS }}
|
retention-days: ${{ env.RETENTION_DAYS }}
|
||||||
|
compression-level: 6
|
||||||
|
|
||||||
release:
|
release:
|
||||||
needs: [build-linux]
|
needs: [check-changes, build-linux]
|
||||||
if: >-
|
if: always() && needs.build-linux.result == 'success'
|
||||||
always() &&
|
|
||||||
needs.build-linux.result == 'success'
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Download all artifacts
|
- name: Download build artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
merge-multiple: true
|
name: linux-build
|
||||||
|
|
||||||
- name: Generate version info
|
- name: Generate release metadata
|
||||||
id: version
|
id: meta
|
||||||
run: |
|
run: |
|
||||||
DATE=$(date +'%Y%m%d')
|
DATE=$(date +'%Y%m%d')
|
||||||
SHA_SHORT="${{ github.sha }}"
|
SHA_SHORT="${{ github.sha }}"
|
||||||
TAG="nightly-${DATE}-${SHA_SHORT::7}"
|
TAG="nightly-${DATE}-${SHA_SHORT::7}"
|
||||||
|
|
||||||
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
||||||
echo "date=$DATE" >> $GITHUB_OUTPUT
|
echo "date=$DATE" >> $GITHUB_OUTPUT
|
||||||
echo "sha_short=${SHA_SHORT::7}" >> $GITHUB_OUTPUT
|
echo "sha_short=${SHA_SHORT::7}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
# Список файлов для загрузки
|
||||||
|
FILES=$(ls *.tar.gz 2>/dev/null | tr '\n' '\n')
|
||||||
|
echo "files<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "$FILES" >> $GITHUB_OUTPUT
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: List artifacts
|
- name: Create Nightly Release
|
||||||
run: ls -lah *.tar.gz *.zip 2>/dev/null || echo "No artifacts found"
|
|
||||||
|
|
||||||
- name: Create Release & Upload Assets
|
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ steps.version.outputs.tag }}
|
tag_name: ${{ steps.meta.outputs.tag }}
|
||||||
name: "🌙 Nightly ${{ steps.version.outputs.date }} (${{ steps.version.outputs.sha_short }})"
|
name: "🌙 Nightly ${{ steps.meta.outputs.date }} (${{ steps.meta.outputs.sha_short }})"
|
||||||
body: |
|
body: |
|
||||||
## Nightly Build
|
## 🌙 Nightly Build — Linux
|
||||||
|
|
||||||
| Property | Value |
|
| Property | Value |
|
||||||
|----------|-------|
|
|----------|-------|
|
||||||
| Commit | `${{ github.sha }}` |
|
| **Platform** | Linux (x64) |
|
||||||
| Date | ${{ steps.version.outputs.date }} |
|
| **Config** | ${{ env.BUILD_CONFIG }} |
|
||||||
| Config | ${{ vars.BUILD_CONFIGURATION }} |
|
| **Commit** | `${{ github.sha }}` |
|
||||||
| Changes | ${{ needs.check-changes.outputs.commit_count }} commits |
|
| **Date** | ${{ steps.meta.outputs.date }} |
|
||||||
|
| **Changes** | ${{ needs.check-changes.outputs.commit_count }} commits |
|
||||||
|
|
||||||
|
### 📥 Downloads
|
||||||
|
- 🐧 **Linux:** `${{ env.PROJECT_NAME }}-Linux-${{ steps.meta.outputs.sha_short }}.tar.gz`
|
||||||
|
|
||||||
### Downloads
|
|
||||||
- 🐧 **Linux:** `${{ vars.PROJECT_NAME }}-Linux-${{ steps.version.outputs.sha_short }}.tar.gz`
|
|
||||||
---
|
---
|
||||||
*⚠️ Auto-generated nightly build. May be unstable.*
|
> ⚠️ Auto-generated nightly build. May be unstable.
|
||||||
|
> Built with UE5 from `/opt/unreal-engine` via Docker volume mount.
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: true
|
prerelease: true
|
||||||
files: |
|
files: ${{ steps.meta.outputs.files }}
|
||||||
*.tar.gz
|
|
||||||
*.zip
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.UNREAL_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
Reference in New Issue
Block a user