From 61c361e96ca69737a27164ff4233cdd9501d5cc2 Mon Sep 17 00:00:00 2001 From: STAM Date: Wed, 16 Jul 2025 18:16:26 +0300 Subject: [PATCH] ci-build updated + added signing + migrated to windows-2025 runner + wmic deprecated and migrated to ps --- .github/workflows/build.yml | 165 ++++++++++++++++++++++++++++++++++-- regamedll/msvc/PreBuild.bat | 33 ++++++-- regamedll/msvc/icon.ico | Bin 0 -> 120527 bytes 3 files changed, 185 insertions(+), 13 deletions(-) create mode 100644 regamedll/msvc/icon.ico diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8217211f..61c85856 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,16 +5,18 @@ on: branches: [master] paths-ignore: - '**.md' + - '.github/**' pull_request: types: [opened, reopened, synchronize] release: types: [published] + workflow_dispatch: jobs: windows: name: 'Windows' - runs-on: windows-2019 + runs-on: windows-2025 env: solution: 'msvc/ReGameDLL.sln' @@ -34,12 +36,48 @@ jobs: - name: Setup MSBuild uses: microsoft/setup-msbuild@v2 - with: - vs-version: '16' + +# TODO: add support of 141_xp toolchain at VS2022+ +# - name: Install v140, v141 and v142 toolsets +# shell: cmd +# run: | +# "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe" modify ^ +# --installPath "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" ^ +# --add Microsoft.VisualStudio.Component.WindowsXP ^ +# --add Microsoft.VisualStudio.Component.VC.v140 ^ +# --add Microsoft.VisualStudio.Component.VC.v140.x86.x64 ^ +# --add Microsoft.VisualStudio.Component.VC.v140.xp ^ +# --add Microsoft.VisualStudio.Component.VC.140.CRT ^ +# --add Microsoft.VisualStudio.Component.VC.v141 ^ +# --add Microsoft.VisualStudio.Component.VC.v141.x86.x64 ^ +# --add Microsoft.VisualStudio.Component.VC.v141.xp ^ +# --add Microsoft.VisualStudio.Component.VC.v142 ^ +# --add Microsoft.VisualStudio.Component.VC.v142.x86.x64 ^ +# --quiet --norestart + + - name: Select PlatformToolset + id: select_toolset + shell: pwsh + run: | + $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + $vs2019 = & $vswhere -products * -version "[16.0,17.0)" -property installationPath -latest + $vs2022 = & $vswhere -products * -version "[17.0,)" -property installationPath -latest + + if ($vs2019) { + "toolset=v140_xp" >> $env:GITHUB_OUTPUT + Write-Host "Selected v140_xp toolset" + } elseif ($vs2022) { + "toolset=v143" >> $env:GITHUB_OUTPUT + Write-Host "Selected v143 toolset" + } else { + Write-Error "No suitable Visual Studio installation found" + exit 1 + } - name: Build and Run unittests run: | - msbuild ${{ env.solution }} -p:Configuration="${{ env.buildTests }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=v140_xp /p:XPDeprecationWarning=false + $toolset = '${{ steps.select_toolset.outputs.toolset }}' + msbuild ${{ env.solution }} -p:Configuration="${{ env.buildTests }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=$toolset /p:XPDeprecationWarning=false .\"msvc\Tests\mp.exe" If ($LASTEXITCODE -ne 0 -And $LASTEXITCODE -ne 3) @@ -48,8 +86,13 @@ jobs: - name: Build run: | - msbuild ${{ env.solution }} -p:Configuration="${{ env.buildRelease }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=v140_xp /p:XPDeprecationWarning=false - msbuild ${{ env.solution }} -p:Configuration="${{ env.buildReleasePlay }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=v140_xp /p:XPDeprecationWarning=false + $toolset = '${{ steps.select_toolset.outputs.toolset }}' + msbuild ${{ env.solution }} -p:Configuration="${{ env.buildRelease }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=$toolset /p:XPDeprecationWarning=false + msbuild ${{ env.solution }} -p:Configuration="${{ env.buildReleasePlay }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=$toolset /p:XPDeprecationWarning=false + - name: Get rcedit from chocolatey + shell: pwsh + run: | + choco install rcedit -y - name: Move files run: | @@ -60,6 +103,49 @@ jobs: move msvc\${{ env.buildRelease }}\mp.dll publish\bin\win32\cstrike\dlls\mp.dll move msvc\${{ env.buildRelease }}\mp.pdb publish\debug\mp.pdb + - name: Get app version + id: get_version + shell: pwsh + run: | + $versionFile = "regamedll/version/appversion.h" + if (-not (Test-Path $versionFile)) { + Write-Error "Version file not found: $versionFile" + exit 1 + } + + $content = Get-Content $versionFile + foreach ($line in $content) { + if ($line -match '^\s*#define\s+APP_VERSION\s+"([^"]+)"') { + $version = $matches[1] + "version=$version" >> $env:GITHUB_OUTPUT + Write-Host "Found version: $version" + exit 0 + } + } + Write-Error "APP_VERSION not found in file" + exit 1 + + - name: Show version + run: echo "Version is ${{ steps.get_version.outputs.version }}" + + - name: Import PFX and sign + if: github.event_name != 'pull_request' + env: + KEY_PFX_PASS: ${{ secrets.KEY_PFX_PASS }} + # https://github.com/actions/runner-images/blob/main/images/windows/Windows2025-Readme.md + run: | + $pfxBase64 = "${{ secrets.KEY_PFX_B64 }}" + [IO.File]::WriteAllBytes("${{ github.workspace }}\signing-cert.pfx", [Convert]::FromBase64String($pfxBase64)) + certutil -f -p "${{ secrets.KEY_PFX_PASS }}" -importPFX "${{ github.workspace }}\signing-cert.pfx" + & 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86\signtool.exe' sign /a /f "${{ github.workspace }}\signing-cert.pfx" /p $env:KEY_PFX_PASS /d "Regamedll_CS is a result of reverse engineering of original library mod HLDS (build 6153beta) using DWARF debug info embedded into linux version of HLDS, cs.so" /du "https://rehlds.dev/" /tr "http://timestamp.digicert.com" /td sha256 /fd sha256 /v ${{ github.workspace }}\publish\bin\win32\cstrike\dlls\mp.dll + Remove-Item -Recurse -Force "${{ github.workspace }}\signing-cert.pfx" + shell: "pwsh" + + - name: Edit resources at windows binaries + run: | + rcedit ${{ github.workspace }}\publish\bin\win32\cstrike\dlls\mp.dll --set-version-string ProductName "Regamedll_CS - mp.dll" --set-file-version "${{ steps.get_version.outputs.version }}" --set-product-version "${{ steps.get_version.outputs.version }}" --set-version-string FileDescription "Regamedll_CS (mp.dll) - provide more stable (than official) version of Counter-Strike game with extended API for mods and plugins, Commit: $env:GITHUB_SHA" --set-version-string "Comments" "Regamedll_CS is a result of reverse engineering of original library mod HLDS (build 6153beta) using DWARF debug info embedded into linux version of HLDS, cs.so. Commit: $env:GITHUB_SHA" --set-version-string CompanyName "ReHLDS Dev Team" --set-version-string LegalCopyright "Copyright 2025 Valve, ReHLDS DevTeam" --set-icon regamedll/msvc/icon.ico + shell: "pwsh" + - name: Deploy artifacts uses: actions/upload-artifact@v4 with: @@ -128,6 +214,49 @@ jobs: submodules: recursive fetch-depth: 0 + - name: GPG Import + run: | + echo "${{ secrets.PUB_ASC }}" > "${{ secrets.PUB_ASC_FILE }}" + echo "${{ secrets.KEY_ASC }}" > "${{ secrets.KEY_ASC_FILE }}" + + # Import the public key + gpg --batch --yes --import "${{ secrets.PUB_ASC_FILE }}" + if [[ $? -ne 0 ]]; then + echo "Error: Failed to import the public key" + exit 1 + fi + + # Import the private key + gpg --batch --yes --import "${{ secrets.KEY_ASC_FILE }}" + if [[ $? -ne 0 ]]; then + echo "Error: Failed to import the private key" + exit 2 + fi + + # Extract the fingerprint of the imported public key + GPG_LINUX_FINGERPRINT=$(gpg --list-keys --with-colons | grep '^fpr' | head -n 1 | cut -d: -f10) + + # Check if the fingerprint was extracted + if [[ -z "$GPG_LINUX_FINGERPRINT" ]]; then + echo "Error: Failed to extract the fingerprint of the key" + exit 3 + fi + + # Set the trust level for the key + echo "$GPG_LINUX_FINGERPRINT:6:" | gpg --batch --import-ownertrust + if [ $? -ne 0 ]; then + echo "Error: Failed to set trust for the key $GPG_LINUX_FINGERPRINT" + exit 4 + fi + + echo "Key $GPG_LINUX_FINGERPRINT successfully imported and trusted" + gpg --list-keys + + #export for global use + echo "GPG_LINUX_FINGERPRINT=$GPG_LINUX_FINGERPRINT" >> $GITHUB_ENV + shell: bash + if: github.event_name != 'pull_request' + - name: Build and Run unittests run: | rm -rf build && CC=gcc CXX=g++ cmake -DCMAKE_BUILD_TYPE=Unittests -B build && cmake --build build -j8 @@ -224,7 +353,29 @@ jobs: run: | rsync -a dist/ bin/win32/cstrike rsync -a dist/ bin/linux32/cstrike + + # new runner, niw signs + echo "${{ secrets.PUB_ASC }}" > "${{ secrets.PUB_ASC_FILE }}" + echo "${{ secrets.KEY_ASC }}" > "${{ secrets.KEY_ASC_FILE }}" + gpg --batch --yes --import "${{ secrets.PUB_ASC_FILE }}" + gpg --batch --yes --import "${{ secrets.KEY_ASC_FILE }}" + GPG_LINUX_FINGERPRINT=$(gpg --list-keys --with-colons | grep '^fpr' | head -n 1 | cut -d: -f10) + echo "$GPG_LINUX_FINGERPRINT:6:" | gpg --batch --import-ownertrust + echo "GPG_LINUX_FINGERPRINT=$GPG_LINUX_FINGERPRINT" >> $GITHUB_ENV + + sign_file() { + local file=$1 + gpg --batch --yes --detach-sign --armor -u "$GPG_LINUX_FINGERPRINT" "$file" + if [ $? -ne 0 ]; then + echo "Error: Failed to sign $file" + exit 2 + fi + echo "$file signed successfully." + } + + # Pack and sign final archive 7z a -tzip regamedll-bin-${{ env.APP_VERSION }}.zip bin/ cssdk/ + sign_file "regamedll-bin-${{ env.APP_VERSION }}.zip" - name: Publish artifacts uses: softprops/action-gh-release@v2 @@ -235,6 +386,8 @@ jobs: with: files: | *.zip + *.7z + *.asc env: GITHUB_TOKEN: ${{ secrets.API_TOKEN }} diff --git a/regamedll/msvc/PreBuild.bat b/regamedll/msvc/PreBuild.bat index 38dac044..b861b43c 100644 --- a/regamedll/msvc/PreBuild.bat +++ b/regamedll/msvc/PreBuild.bat @@ -18,13 +18,32 @@ set commitURL= set commitCount=0 set branch_name=master -for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find "."') do set "dt=%%a" -set "YYYY=%dt:~0,4%" -set "MM=%dt:~4,2%" -set "DD=%dt:~6,2%" -set "hour=%dt:~8,2%" -set "min=%dt:~10,2%" -set "sec=%dt:~12,2%" +for /f "tokens=*" %%i in ('powershell -NoProfile -Command ^ + "$now = Get-Date; Write-Output ('{0:yyyy}|{0:MM}|{0:dd}|{0:HH}|{0:mm}|{0:ss}' -f $now)"') do ( + for /f "tokens=1-6 delims=|" %%a in ("%%i") do ( + set "YYYY=%%a" + set "MM=%%b" + set "DD=%%c" + set "hour=%%d" + set "min=%%e" + set "sec=%%f" + ) +) + +echo YYYY=%YYYY% +echo MM=%MM% +echo DD=%DD% +echo hour=%hour% +echo min=%min% +echo sec=%sec% + +:: for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find "."') do set "dt=%%a" +:: set "YYYY=%dt:~0,4%" +:: set "MM=%dt:~4,2%" +:: set "DD=%dt:~6,2%" +:: set "hour=%dt:~8,2%" +:: set "min=%dt:~10,2%" +:: set "sec=%dt:~12,2%" :: :: Remove leading zero from MM (e.g 09 > 9) diff --git a/regamedll/msvc/icon.ico b/regamedll/msvc/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8c7e14c00008537f866fe9cb9804ab45aa0c1f45 GIT binary patch literal 120527 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

@Ecj~Nq!%LK05!N z>Hmd1(qWBnKd5PQ_}c}37>^tWUIyQRe*`Ez7luCt{5Nook*;l^qrk6#@fFthmX8nR zk7aUoTwggxJEmP@`P}dH`7ZfTH#d>iJpGV91!$|En(qta<8b(4y|k9J@q7>1wlBs1 z80fpftH3r;Xy@d&2ci9Sk**nE;W;)M!>RP$G~V#LYIrli=1lIm9YW73ylEiRgKLL9 zb0GO_d|J*?V9iK84Dur+p9uA{O6oheDd}C_o}71fdopTD zH+V7WocLPO+0>t`YzG~n)AZR%C$E?8Y@3j*?P^N8dk;x^dYhBJ38V4Tk__N;TNl6V zdU0F&n6If4a+k(1&-#6$;$sY?IWsDgGbw2L``VwKz zJCU@0;_6YD5lcVyoc zUr&Bnsu2Bw_fD`hv(t71a11J(?UBC-c#i8h_i^C8tr;+3?GKIwW5M>|Ik2w$d>-Ch zVBB8?={42+o-?w^z`3gfj0VPbYjg=|k~vkG>q~t~XO(rbYaEBnvEn*lzjiF#P}aqt z*XewzzvX3l$Ro3Ts1w#5KP2rOSvWhfy}`R5sOy>AeA^1Nu>e%6BLK@V7&&BY5y zEBj{(hOKec%O9IO`#=Jhg)w$L^sp{7eS( z;n}u!2I@Kn*v`Dp!rCX;!B>9;Fn-&c{&xqqfe(TW!1}bl)Oi8er-O?cstgPz~PWl7(n z2}xJagyej%{Yl`6ze~oCZcDLSOIxzrw6^5Z=C))dt*#S?Ynj8k+xAa-I4RJ>0DiXJ z)0fUy9<)yfVctqukqtL*5vP6jbl@0m-~M0lIIuqE(jM?w|ATxAu&t+K8r1%D0yqc! z3|Oz<1(s3hvl-9zjPgQXu{6ttZ`-k-xPI#nQII|y*mqii_w(2wlal`u_8)?d0zU@E z@lYmPPTDpoZ%_J+W7|{UbHNAchvDy(={w(C3LeYyj=iq{?ZY{s?bP4EsJj<V z8JGdy3hn~l+X3(mP~G|BK(aLY#$;P8JkyF*eK$c5W64^2Q%5^v#brq{=Fh;vNitP1 Z8&74YwF09H(Yp)y#WLRsFxZ+T{|8;wV1@ty literal 0 HcmV?d00001