diff --git a/.github/workflows/ci-pipeline.yml b/.github/workflows/ci-pipeline.yml
index e64f461560..12c7a1f93a 100644
--- a/.github/workflows/ci-pipeline.yml
+++ b/.github/workflows/ci-pipeline.yml
@@ -76,268 +76,29 @@ jobs:
name: release_notes_bins
path: ./release_notes_bins/
- code-scanning:
- name: Run CodeQL
- runs-on: ubuntu-latest
- permissions:
- security-events: write
- actions: read
- env:
- TGS_TELEMETRY_KEY_FILE: /tmp/tgs_telemetry_key.txt
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
-
- - name: Read Current SHA
- id: get-pr-sha
- if: github.event_name != 'push' && github.event_name != 'schedule'
- shell: bash
- run: echo "head_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
-
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v3
- with:
- languages: csharp
-
- - name: Setup Telemetry Key File
- run: echo "fake_telemetry_key" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build # Name checked in rerunFlakyTests.js
- run: dotnet build -c ReleaseNoWindows -p:TGS_HOST_NO_WEBPANEL=true
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v3
- with:
- category: "/language:csharp"
-
- dmapi-build:
- name: Build DMAPI
- strategy:
- fail-fast: false
- matrix:
- byond: [ '510.1346', '511.1385', '512.1488', '513.1542', '514.1589', 'EDGE' ]
+ build-deb:
+ name: Build .deb Package # Can't do i386 due to https://github.com/dotnet/core/issues/4595
+ needs: build-releasenotes
runs-on: ubuntu-latest
steps:
- - name: Install Native x86 libc Dependencies # Name checked in rerunFlakyTests.js
+ - name: Install Native dotnet-sdk Package # Name checked in rerunFlakyTests.js
+ if: (!contains(env.TGS_DOTNET_QUALITY, 'preview'))
run: |
- sudo dpkg --add-architecture i386
sudo apt-get update
- sudo apt-get install -y -o APT::Immediate-Configure=0 libc6-i386 libstdc++6:i386 libgcc-s1:i386
-
- - name: Cache BYOND .zips
- uses: actions/cache@v4
- id: cache-byond
- with:
- path: ~/byond-zips-cache
- key: byond-zips
-
- - name: Setup BYOND Cache if Necessary and Install
- run: |
- echo "Setting up BYOND."
- FULL_VERSION=${{ matrix.byond }}
- if [[ "$FULL_VERSION" = "EDGE" ]] ; then
- VERSIONS=$(curl https://www.byond.com/download/version.txt)
- FULL_VERSION=$(echo "$VERSIONS" | tail -n1)
- echo "EDGE version evaluated to $FULL_VERSION"
-
- # Also needs updating in ByondTest.cs
- declare -A bad_linux_releases=([515.1612]="515.1611" [515.1617]="515.1616")
-
- if [[ -n "${bad_linux_releases[$FULL_VERSION]}" ]] ; then
- echo "$FULL_VERSION does not have a linux zip, falling back to ${bad_linux_releases[$FULL_VERSION]}"
- FULL_VERSION=${bad_linux_releases[$FULL_VERSION]}
- fi
- fi
- if [[ ! -f $HOME/byond-zips-cache/linux/$FULL_VERSION.zip ]] ; then
- BYOND_MAJOR=${FULL_VERSION%.*}
- mkdir -p $HOME/byond-zips-cache/linux
- curl "https://www.byond.com/download/build/$BYOND_MAJOR/${FULL_VERSION}_byond_linux.zip" -o $HOME/byond-zips-cache/linux/$FULL_VERSION.zip
- fi
- mkdir -p "$HOME/BYOND"
- cd "$HOME/BYOND"
- cp $HOME/byond-zips-cache/linux/$FULL_VERSION.zip byond.zip
- unzip byond.zip
- cd byond
- make here
- exit 0
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Read Current SHA
- id: get-pr-sha
- if: github.event_name != 'push' && github.event_name != 'schedule'
- shell: bash
- run: echo "head_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
-
-
- - name: Compile DMAPI Test Project
- run: |
- set -e
- retval=1
- source $HOME/BYOND/byond/bin/byondsetup
-
- if hash DreamMaker 2>/dev/null
- then
- DreamMaker "tests/DMAPI/BasicOperation/basic operation_test.dme" 2>&1 | tee result.log
- retval=$?
- if ! grep '\- 0 errors, 0 warnings' result.log
- then
- retval=1
- fi
- else
- echo "Couldn't find the DreamMaker executable, aborting."
- retval=2
- fi
- exit $retval
-
- opendream-build:
- name: Build DMAPI (OpenDream)
- strategy:
- fail-fast: false
- matrix:
- committish: [ 'master', 'tgs-min-compat' ]
- runs-on: ubuntu-latest
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- if: matrix.committish == 'master'
- with:
- dotnet-version: '${{ env.OD_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Setup dotnet (min-compat)
- uses: actions/setup-dotnet@v4
- if: matrix.committish == 'tgs-min-compat'
- with:
- dotnet-version: '${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Checkout OpenDream
- run: |
- cd $HOME
- git clone https://github.com/OpenDreamProject/OpenDream
- cd OpenDream
- git checkout ${{ matrix.committish }}
- git submodule update --init --recursive
-
- - name: Build OpenDream # Name checked in rerunFlakyTests.js
- run: |
- cd $HOME/OpenDream/OpenDreamPackageTool
- dotnet build -c Release --nologo -v q --property WarningLevel=0 /clp:ErrorsOnly
-
- - name: Build TGS Deployment # Name checked in rerunFlakyTests.js
- run: |
- cd $HOME/OpenDream
- dotnet run -c Release --project OpenDreamPackageTool --no-build -- --tgs -o tgs_deploy
-
- - name: Compile DMAPI Test Project
- run: |
- cd tests/DMAPI/BasicOperation
- $HOME/OpenDream/tgs_deploy/bin/compiler/DMCompiler --verbose --notices-enabled "basic operation_test.dme"
-
- efcore-version-match:
- name: Check Nuget Versions Match Tools
- runs-on: ubuntu-latest
- steps:
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Retrieve dotnet-ef Tool Version
- id: dotnet-ef-tool
- run: echo "version=$(cat src/Tgstation.Server.Host/.config/dotnet-tools.json | jq -r '.tools."dotnet-ef".version')" >> $GITHUB_OUTPUT
-
- - name: Retrieve wix Tool Version
- id: wix-tool
- run: echo "version=$(cat build/package/winget/.config/dotnet-tools.json | jq -r '.tools.wix.version')" >> $GITHUB_OUTPUT
-
- - name: Retrieve dotnet-ef Nuget Version
- id: dotnet-ef-nuget
- run: |
- regex='\s+'
- if [[ $(cat src/Tgstation.Server.Host/Tgstation.Server.Host.csproj) =~ $regex ]]; then
- echo "version=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
- else
- echo "Regex search failed!"
- exit 1
- fi
-
- - name: Retrieve wix Nuget Version
- id: wix-nuget
- run: |
- regex=''
- if [[ $(cat build/package/winget/Tgstation.Server.Host.Service.Wix/Tgstation.Server.Host.Service.Wix.wixproj) =~ $regex ]]; then
- echo "version=${BASH_REMATCH[1]}" >> $GITHUB_OUTPUT
- else
- echo "Regex search failed!"
- exit 1
- fi
-
- - name: Fail if dotnet-ef Versions Don't Match
- if: ${{ steps.dotnet-ef-tool.outputs.version != steps.dotnet-ef-nuget.outputs.version }}
- run: |
- echo "${{ steps.dotnet-ef-tool.outputs.version }} != ${{ steps.dotnet-ef-nuget.outputs.version }}"
- exit 1
-
- - name: Fail if wix Versions Don't Match
- if: ${{ steps.wix-tool.outputs.version != steps.wix-nuget.outputs.version }}
- run: |
- echo "${{ steps.wix-tool.outputs.version }} != ${{ steps.wix-nuget.outputs.version }}"
- exit 1
+ sudo apt-get install -y dotnet-sdk-${{ env.TGS_DOTNET_VERSION }}.0
- pages-build:
- name: Build gh-pages
- needs: build-releasenotes
- runs-on: ubuntu-latest
- steps:
- name: Setup dotnet
uses: actions/setup-dotnet@v4
with:
dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: gh-pages Clone
- run: git clone -b gh-pages --single-branch "https://git@github.com/tgstation/tgstation-server" $HOME/tgsdox
+ - name: Override /usr/bin/dotnet
+ run: |
+ DOTNET_PATH=$(which dotnet)
+ sudo rm /usr/bin/dotnet
+ sudo ln -s $DOTNET_PATH /usr/bin/dotnet
+ echo "New dotnet path should be $DOTNET_PATH"
- name: Retrieve ReleaseNotes Binaries
uses: actions/download-artifact@v4
@@ -345,300 +106,6 @@ jobs:
name: release_notes_bins
path: release_notes_bins
- - name: Compile Changelog (Incremental)
- run: |
- mv $HOME/tgsdox/changelog.yml ./ 2>/dev/null
- dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --generate-full-notes
-
- - name: Generate App Token
- run: |
- dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --token-output-file ${{ runner.temp }}/installation_secret.txt ${{ secrets.TGS_CI_GITHUB_APP_TOKEN_BASE64 }}
- echo "INSTALLATION_TOKEN=$(cat ${{ runner.temp }}/installation_secret.txt)" >> $GITHUB_ENV
- rm ${{ runner.temp }}/installation_secret.txt
-
- - name: Patch Doxyfile
- run: |
- VERSION=$(cat "build/Version.props" | grep -oPm1 "(?<=)[^<]+")
- echo -e "\nPROJECT_NUMBER = $VERSION\nINPUT = .\nOUTPUT_DIRECTORY = ./doxout\nPROJECT_LOGO = ./artifacts/tgs.ico\nHAVE_DOT=YES" >> "docs/Doxyfile"
-
- - name: Doxygen Build
- uses: mattnotmitt/doxygen-action@411df0c62acb5b96b8a93d93a7bf4b753c47ea05 # v1.9.5
- with:
- doxyfile-path: 'docs/Doxyfile'
-
- - name: gh-pages Push
- if: github.event_name == 'push' && github.event.ref == 'refs/heads/dev' && env.TGS_RELEASE_NOTES_TOKEN != ''
- run: |
- pushd $HOME/tgsdox
- rm -r *
- popd
- sudo mv changelog.yml $HOME/tgsdox/
- echo ./doxout/* | xargs -n 10 sudo mv -t $HOME/tgsdox
- cd $HOME/tgsdox
- git config --global push.default simple
- git config user.name "tgstation-server-ci[bot]"
- git config user.email "161980869+tgstation-server-ci[bot]@users.noreply.github.com"
- echo '# THIS BRANCH IS AUTO GENERATED BY GITHUB ACTIONS' > README.md
-
- # Need to create a .nojekyll file to allow filenames starting with an underscore
- # to be seen on the gh-pages site. Therefore creating an empty .nojekyll file.
- echo "" > .nojekyll
- echo "Adding files..."
- git add --all
- echo "Committing..."
- git diff-index --quiet HEAD || git commit -m "Deploy code docs to GitHub Pages for workflow run ${{ github.run_number }}" -m "Commit: ${{ github.event.head_commit.id }}"
- echo "Pushing..."
- git push -f "https://tgstation-server-ci:${{ env.INSTALLATION_TOKEN }}@github.com/tgstation/tgstation-server" 2>&1
-
- docker-build:
- name: Build Docker Image
- runs-on: ubuntu-latest
- env:
- TGS_TELEMETRY_KEY_FILE: tgs_telemetry_key.txt
- steps:
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Setup Telemetry Key File
- shell: bash
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build Docker Image # Name checked in rerunFlakyTests.js
- run: docker build . -f build/Dockerfile --build-arg TGS_TELEMETRY_KEY_FILE=${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Delete Telemetry Key File
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- linux-unit-tests:
- name: Linux Tests
- strategy:
- fail-fast: false
- matrix:
- configuration: [ 'Debug', 'Release' ]
- env:
- TGS_TEST_DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
- TGS_TEST_IRC_CONNECTION_STRING: ${{ secrets.IRC_CONNECTION_STRING }}
- TGS_TELEMETRY_KEY_FILE: /tmp/tgs_telemetry_key.txt
- runs-on: ubuntu-latest
- steps:
- - name: Install Native x86 libc Dependencies # Name checked in rerunFlakyTests.js
- run: |
- sudo dpkg --add-architecture i386
- sudo apt-get update
- sudo apt-get install -y -o APT::Immediate-Configure=0 libc6-i386 libstdc++6:i386 libgcc-s1:i386 libgdiplus
-
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Setup Node.JS
- uses: actions/setup-node@v4
- with:
- node-version: ${{ env.TGS_WEBPANEL_NODE_VERSION }}
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Enable Corepack
- run: corepack enable
-
- - name: Setup Telemetry Key File
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build # Name checked in rerunFlakyTests.js
- run: dotnet build -c ${{ matrix.configuration }}NoWindows
-
- - name: Delete Telemetry Key File
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Cache BYOND .zips
- uses: actions/cache@v4
- id: cache-byond
- with:
- path: ~/byond-zips-cache
- key: byond-zips
-
- - name: Run Unit Tests
- run: sudo dotnet test --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" --filter TestCategory!=RequiresDatabase -c ${{ matrix.configuration }}NoWindows --collect:"XPlat Code Coverage" --settings build/ci.runsettings --results-directory ./TestResults tgstation-server.sln
-
- - name: Store Code Coverage
- uses: actions/upload-artifact@v4
- with:
- name: linux-unit-test-coverage-${{ matrix.configuration }}
- path: ./TestResults/
-
- windows-unit-tests:
- name: Windows Tests
- strategy:
- fail-fast: false
- matrix:
- configuration: [ 'Debug', 'Release' ]
- env:
- TGS_TEST_DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
- TGS_TEST_IRC_CONNECTION_STRING: ${{ secrets.IRC_CONNECTION_STRING }}
- TGS_TELEMETRY_KEY_FILE: C:/tgs_telemetry_key.txt
- runs-on: windows-latest
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Setup Node.JS
- uses: actions/setup-node@v4
- with:
- node-version: ${{ env.TGS_WEBPANEL_NODE_VERSION }}
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Enable Corepack
- run: corepack enable
-
- - name: Setup Telemetry Key File
- shell: bash
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build # Name checked in rerunFlakyTests.js
- run: dotnet build -c ${{ matrix.configuration }}NoWix
-
- - name: Delete Telemetry Key File
- shell: bash
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Cache BYOND .zips
- uses: actions/cache@v4
- id: cache-byond
- with:
- path: ~/byond-zips-cache
- key: byond-zips
-
- - name: Run Unit Tests
- run: dotnet test --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" --filter TestCategory!=RequiresDatabase -c ${{ matrix.configuration }}NoWix --collect:"XPlat Code Coverage" --settings build/ci.runsettings --results-directory ./TestResults tgstation-server.sln
-
- - name: Store Code Coverage
- uses: actions/upload-artifact@v4
- with:
- name: windows-unit-test-coverage-${{ matrix.configuration }}
- path: ./TestResults/
-
- windows-integration-tests:
- name: Windows Live Tests
- needs: [ dmapi-build, opendream-build ]
- strategy:
- fail-fast: false
- matrix:
- database-type: [ 'SqlServer', 'Sqlite', 'PostgresSql', 'MariaDB', 'MySql' ]
- watchdog-type: [ 'Basic', 'Advanced' ]
- configuration: [ 'Debug', 'Release' ]
- env:
- TGS_TELEMETRY_KEY_FILE: C:/tgs_telemetry_key.txt
- runs-on: windows-latest
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: |
- ${{ env.TGS_DOTNET_VERSION }}.0.x
- ${{ env.OD_DOTNET_VERSION }}.0.x
- ${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Wait for LocalDB Connection # Do this first because we don't want to find out it's failing later
- shell: powershell
- if: ${{ matrix.database-type == 'SqlServer' }}
- run: |
- Write-Host "Checking"
- sqlcmd -l 600 -S "(localdb)\MSSQLLocalDB" -Q "SELECT @@VERSION;"
-
- - name: Setup Node.JS
- uses: actions/setup-node@v4
- with:
- node-version: ${{ env.TGS_WEBPANEL_NODE_VERSION }}
-
- - name: Set TGS_TEST_DUMP_API_SPEC
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Advanced' && matrix.database-type == 'SqlServer' }}
- run: echo "TGS_TEST_DUMP_API_SPEC=yes" >> $Env:GITHUB_ENV
-
- - name: Set General__UseBasicWatchdog
- if: ${{ matrix.watchdog-type == 'Basic' }}
- run: echo "General__UseBasicWatchdog=true" >> $Env:GITHUB_ENV
-
- - name: Set Sqlite Connection Info
- if: ${{ matrix.database-type == 'Sqlite' }}
- shell: bash
- run: |
- echo "TGS_TEST_DATABASE_TYPE=Sqlite" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Data Source=TGS_${{ matrix.watchdog-type }}_${{ matrix.configuration }}.sqlite3;Mode=ReadWriteCreate" >> $GITHUB_ENV
-
- - name: Setup Postgres
- uses: ankane/setup-postgres@v1
- if: ${{ matrix.database-type == 'PostgresSql' }}
-
- - name: Set PostgresSql Connection Info
- if: ${{ matrix.database-type == 'PostgresSql' }}
- shell: bash
- run: |
- echo "TGS_TEST_DATABASE_TYPE=PostgresSql" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Application Name=tgstation-server;Host=127.0.0.1;Username=$USER;Database=TGS__${{ matrix.watchdog-type }}_${{ matrix.configuration }}" >> $GITHUB_ENV
-
- - name: Setup MariaDB
- uses: ankane/setup-mariadb@v1
- if: ${{ matrix.database-type == 'MariaDB' }}
-
- - name: Set MariaDB Connection Info
- if: ${{ matrix.database-type == 'MariaDB' }}
- shell: bash
- run: |
- echo "TGS_TEST_DATABASE_TYPE=MariaDB" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Server=127.0.0.1;uid=root;database=tgs__${{ matrix.watchdog-type }}_${{ matrix.configuration }}" >> $GITHUB_ENV
-
- - name: Setup MySQL
- uses: ankane/setup-mysql@v1
- if: ${{ matrix.database-type == 'MySql' }}
-
- - name: Set MySQL Connection Info
- if: ${{ matrix.database-type == 'MySql' }}
- shell: bash
- run: |
- echo "TGS_TEST_DATABASE_TYPE=MySql" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Server=127.0.0.1;uid=root;database=tgs__${{ matrix.watchdog-type }}_${{ matrix.configuration }}" >> $GITHUB_ENV
-
- - name: Set SqlServer Connection Info
- if: ${{ matrix.database-type == 'SqlServer' }}
- shell: bash
- run: |
- TGS_CONNSTRING_VALUE="Server=(localdb)\MSSQLLocalDB;Encrypt=false;Integrated Security=true;Initial Catalog=TGS_${{ matrix.watchdog-type }}_${{ matrix.configuration }};Application Name=tgstation-server"
- echo "TGS_TEST_CONNECTION_STRING=$(echo $TGS_CONNSTRING_VALUE)" >> $GITHUB_ENV
- echo "TGS_TEST_DATABASE_TYPE=SqlServer" >> $GITHUB_ENV
-
- name: Checkout (Branch)
uses: actions/checkout@v4
if: github.event_name == 'push' || github.event_name == 'schedule'
@@ -649,1500 +116,24 @@ jobs:
with:
ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
- - name: Enable Corepack
- run: corepack enable
-
- - name: Setup Telemetry Key File
- shell: bash
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build # Name checked in rerunFlakyTests.js
- run: dotnet build -c ${{ matrix.configuration }} tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj
-
- - name: Delete Telemetry Key File
- shell: bash
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Cache BYOND .zips
- uses: actions/cache@v4
- id: cache-byond
- with:
- path: ~/byond-zips-cache
- key: byond-zips
-
- - name: Run Live Tests # Logging here is weird because printing massive amounts of text on Windows runners is SLOW AS SHIT!!!
- id: live-tests
- shell: bash
- run: |
- cd tests/Tgstation.Server.Tests
- sleep 10
- set +e
- test_output=$(dotnet test -c ${{ matrix.configuration }} --no-build --filter TestCategory=RequiresDatabase --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" --collect:"XPlat Code Coverage" --settings ../../build/ci.runsettings --results-directory ../../TestResults)
- retval=$?
- set -e
- cd ../..
- echo $test_output > ./test_output.txt
- if [[ $retval -ne 0 ]]; then
- echo "succeeded=NO" >> $GITHUB_OUTPUT
- else
- echo "succeeded=YES" >> $GITHUB_OUTPUT
- fi
-
- - name: Store Live Tests Output
- if: ${{ steps.live-tests.outputs.succeeded == 'YES' }}
- uses: actions/upload-artifact@v4
- with:
- name: windows-integration-test-logs-${{ matrix.configuration }}-${{ matrix.watchdog-type }}-${{ matrix.database-type }}
- path: ./test_output.txt
-
- - name: Store Errored Live Tests Output
- if: ${{ steps.live-tests.outputs.succeeded != 'YES' }}
- uses: actions/upload-artifact@v4
- with:
- name: errored-windows-test-logs-${{ matrix.configuration }}-${{ matrix.watchdog-type }}-${{ matrix.database-type }}
- path: ./test_output.txt
-
- - name: Fail if Live Tests Failed
- if: ${{ steps.live-tests.outputs.succeeded != 'YES' }}
- run: exit 1
+ - name: List Runtimes
+ run: dotnet --list-runtimes
- - name: Store Code Coverage
- uses: actions/upload-artifact@v4
- with:
- name: windows-integration-test-coverage-${{ matrix.configuration }}-${{ matrix.watchdog-type }}-${{ matrix.database-type }}
- path: ./TestResults/
+ - name: Absolute List Runtimes
+ run: /usr/bin/dotnet --list-runtimes
- - name: Store OpenAPI Spec
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Advanced' && matrix.database-type == 'SqlServer' }}
- uses: actions/upload-artifact@v4
- with:
- name: openapi-spec
- path: C:/tgs_api.json
+ - name: Which
+ run: which dotnet
- - name: Package Server Service
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Basic' && matrix.database-type == 'PostgresSql' }}
- run: |
- cd src/Tgstation.Server.Host.Service
- dotnet publish -c ${{ matrix.configuration }} -o ../../artifacts/Service
- cd ../Tgstation.Server.Host
- dotnet publish -c ${{ matrix.configuration }} --no-build -o ../../artifacts/Service/lib/Default
- cd ../..
- mv artifacts/Service/lib/Default/appsettings.yml artifacts/Service/appsettings.yml
- build/RemoveUnsupportedRuntimes.sh artifacts/Service/lib/Default
- build/RemoveUnsupportedServiceRuntimes.ps1 artifacts/Service
+ - name: Execute Build Script (Unsigned)
+ if: (!(github.event_name == 'push' && contains(github.event.head_commit.message, '[TGSDeploy]') && github.event.ref == 'refs/heads/master'))
+ env:
+ RELEASE_NOTES_DLL_PATH: ${{ github.workspace }}/release_notes_bins/Tgstation.Server.ReleaseNotes.dll
+ run: sudo -E build/package/deb/build_package.sh
- - name: Store Server Service
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Basic' && matrix.database-type == 'PostgresSql' }}
- uses: actions/upload-artifact@v4
- with:
- name: ServerService
- path: artifacts/Service/
-
- - name: Install Code Signing Certificate
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Basic' && matrix.database-type == 'PostgresSql' }}
- shell: powershell
- run: |
- $pfxBytes = [convert]::FromBase64String("${{ secrets.CODE_SIGNING_BASE64 }}")
- [IO.File]::WriteAllBytes("tg_codesigning.pfx", $pfxBytes)
- $certPassword = ConvertTo-SecureString -String "${{ secrets.CODE_SIGNING_PASSWORD }}" -Force -AsPlainText
- Import-PfxCertificate -FilePath tg_codesigning.pfx -Cert Cert:\CurrentUser\My -Password $certPassword
- rm tg_codesigning.pfx
-
- - name: Test Sign Service .exe
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Basic' && matrix.database-type == 'PostgresSql' }}
- shell: powershell
- run: Set-AuthenticodeSignature artifacts/Service/Tgstation.Server.Host.Service.exe -Certificate (Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq "${{ vars.CODE_SIGNING_THUMBPRINT }}" }) -TimestampServer "http://timestamp.digicert.com"
-
- linux-integration-tests:
- name: Linux Live Tests
- needs: [dmapi-build, opendream-build]
- services: # We start all dbs here so we can just code the stuff once
- mssql:
- image: ${{ (matrix.database-type == 'SqlServer') && 'mcr.microsoft.com/mssql/server:2019-latest' || '' }}
- env:
- SA_PASSWORD: myPassword
- ACCEPT_EULA: 'Y'
- ports:
- - 1433:1433
- postgres:
- image: ${{ (matrix.database-type == 'PostgresSql') && 'cyberboss/postgres-max-connections' || '' }} # Fork of _/postgres:latest with max_connections=500 becuase GitHub actions service containers have no way to set command lines. Rebuilds with updates.
- ports:
- - 5432:5432
- env:
- POSTGRES_PASSWORD: postgres
- options: >-
- --health-cmd pg_isready
- --health-interval 10s
- --health-timeout 5s
- --health-retries 5
- mariadb:
- image: ${{ (matrix.database-type == 'MariaDB') && 'mariadb' || '' }}
- ports:
- - 3306:3306
- env:
- MYSQL_ROOT_PASSWORD: mariadb
- options: >-
- --health-cmd="mariadb-admin ping"
- --health-interval=5s
- --health-timeout=2s
- --health-retries=3
- mysql:
- image: ${{ (matrix.database-type == 'MySql') && 'mysql:5.7.31' || '' }}
- ports:
- - 3307:3306
- env:
- MYSQL_ROOT_PASSWORD: mysql
- options: >-
- --health-cmd="mysqladmin ping"
- --health-interval=10s
- --health-timeout=5s
- --health-retries=3
- strategy:
- fail-fast: false
- matrix:
- database-type: [ 'Sqlite', 'PostgresSql', 'MariaDB', 'MySql' ]
- watchdog-type: [ 'Basic', 'Advanced' ]
- configuration: [ 'Debug', 'Release' ]
- env:
- TGS_TELEMETRY_KEY_FILE: /tmp/tgs_telemetry_key.txt
- runs-on: ubuntu-latest
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: |
- ${{ env.TGS_DOTNET_VERSION }}.0.x
- ${{ env.OD_DOTNET_VERSION }}.0.x
- ${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Disable ptrace_scope
- run: echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
-
- - name: Install Native Dependencies # Name checked in rerunFlakyTests.js
- run: |
- sudo dpkg --add-architecture i386
- sudo apt-get update
- sudo apt-get install -y -o APT::Immediate-Configure=0 libc6-i386 libstdc++6:i386 gdb libgcc-s1:i386 libgdiplus
-
- - name: Setup Node.JS
- uses: actions/setup-node@v4
- with:
- node-version: ${{ env.TGS_WEBPANEL_NODE_VERSION }}
-
- - name: Set Sqlite Connection Info
- if: ${{ matrix.database-type == 'Sqlite' }}
- run: |
- echo "TGS_TEST_DATABASE_TYPE=Sqlite" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Data Source=TGS_${{ matrix.watchdog-type }}_${{ matrix.configuration }}.sqlite3;Mode=ReadWriteCreate" >> $GITHUB_ENV
-
- - name: Set PostgresSql Connection Info
- if: ${{ matrix.database-type == 'PostgresSql' }}
- run: |
- echo "TGS_TEST_DATABASE_TYPE=PostgresSql" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Application Name=tgstation-server;Host=127.0.0.1;Username=postgres;Password=postgres;Database=TGS__${{ matrix.watchdog-type }}_${{ matrix.configuration }}" >> $GITHUB_ENV
-
- - name: Set MariaDB Connection Info
- if: ${{ matrix.database-type == 'MariaDB' }}
- run: |
- echo "TGS_TEST_DATABASE_TYPE=MariaDB" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Server=127.0.0.1;uid=root;pwd=mariadb;database=tgs__${{ matrix.watchdog-type }}_${{ matrix.configuration }}" >> $GITHUB_ENV
-
- - name: Set MySQL Connection Info
- if: ${{ matrix.database-type == 'MySql' }}
- run: |
- echo "TGS_TEST_DATABASE_TYPE=MySql" >> $GITHUB_ENV
- echo "TGS_TEST_CONNECTION_STRING=Server=127.0.0.1;Port=3307;uid=root;pwd=mysql;database=tgs__${{ matrix.watchdog-type }}_${{ matrix.configuration }}" >> $GITHUB_ENV
- echo "Database__ServerVersion=5.7.31" >> $GITHUB_ENV
-
- - name: Set General__UseBasicWatchdog
- if: ${{ matrix.watchdog-type == 'Basic' }}
- run: echo "General__UseBasicWatchdog=true" >> $GITHUB_ENV
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Enable Corepack
- run: corepack enable
-
- - name: Setup Telemetry Key File
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build # Name checked in rerunFlakyTests.js
- run: dotnet build -c ${{ matrix.configuration }}NoWindows tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj
-
- - name: Delete Telemetry Key File
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Cache BYOND .zips
- uses: actions/cache@v4
- id: cache-byond
- with:
- path: ~/byond-zips-cache
- key: byond-zips
-
- - name: Run Live Tests
- run: |
- cd tests/Tgstation.Server.Tests
- sleep 10
- dotnet test -c ${{ matrix.configuration }}NoWindows --filter TestCategory=RequiresDatabase --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" --no-build --collect:"XPlat Code Coverage" --settings ../../build/ci.runsettings --results-directory ../../TestResults
-
- - name: Store Code Coverage
- uses: actions/upload-artifact@v4
- with:
- name: linux-integration-test-coverage-${{ matrix.configuration }}-${{ matrix.watchdog-type }}-${{ matrix.database-type }}
- path: ./TestResults/
-
- - name: Package Server Console
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Advanced' && matrix.database-type == 'MariaDB' }}
- run: |
- cd src/Tgstation.Server.Host.Console
- dotnet publish -c ${{ matrix.configuration }} -o ../../artifacts/Console
- cd ../Tgstation.Server.Host
- dotnet publish -c ${{ matrix.configuration }}NoWindows --no-build -o ../../artifacts/Console/lib/Default
- cd ../..
- mv artifacts/Console/lib/Default/appsettings.yml artifacts/Console/appsettings.yml
- build/RemoveUnsupportedRuntimes.sh artifacts/Console/lib/Default
- build/RemoveUnsupportedRuntimes.sh artifacts/Console
-
- - name: Package Server Update Package
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Advanced' && matrix.database-type == 'PostgresSql' }}
- run: |
- cd src/Tgstation.Server.Host
- dotnet publish -c ${{ matrix.configuration }}NoWindows --no-build -o ../../artifacts/ServerUpdate
- cd ../..
- rm artifacts/ServerUpdate/appsettings.yml
- build/RemoveUnsupportedRuntimes.sh artifacts/ServerUpdate
-
- - name: Store Server Console
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Advanced' && matrix.database-type == 'MariaDB' }}
- uses: actions/upload-artifact@v4
- with:
- name: ServerConsole
- path: artifacts/Console/
-
- - name: Store Server Update Package
- if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Advanced' && matrix.database-type == 'PostgresSql' }}
- uses: actions/upload-artifact@v4
- with:
- name: ServerUpdatePackage
- path: artifacts/ServerUpdate/
-
- validate-openapi-spec:
- name: OpenAPI Spec Validation
- needs: windows-integration-tests
- runs-on: ubuntu-latest
- steps:
- - name: Install IBM OpenAPI Validator
- run: npm i -g ibm-openapi-validator@0.51.3
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Retrieve OpenAPI Spec
- uses: actions/download-artifact@v4
- with:
- name: openapi-spec
- path: ./swagger
-
- - name: Lint OpenAPI Spec
- run: npx lint-openapi -v -p -c build/OpenApiValidationSettings.json ./swagger/tgs_api.json
-
- upload-code-coverage:
- name: Upload Code Coverage
- needs: [ linux-unit-tests, linux-integration-tests, windows-unit-tests, windows-integration-tests, build-releasenotes ]
- runs-on: ubuntu-latest
- steps:
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Retrieve Linux Unit Test Coverage (Debug)
- uses: actions/download-artifact@v4
- with:
- name: linux-unit-test-coverage-Debug
- path: ./code_coverage/unit_tests/linux_unit_tests_debug
-
- - name: Retrieve Linux Unit Test Coverage (Release)
- uses: actions/download-artifact@v4
- with:
- name: linux-unit-test-coverage-Release
- path: ./code_coverage/unit_tests/linux_unit_tests_release
-
- - name: Retrieve Linux Integration Test Coverage (Release, Advanced, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-Sqlite
- path: ./code_coverage/integration_tests/linux_integration_tests_release_system_sqlite
-
- - name: Retrieve Linux Integration Test Coverage (Release, Advanced, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-PostgresSql
- path: ./code_coverage/integration_tests/linux_integration_tests_release_system_mariadb
-
- - name: Retrieve Linux Integration Test Coverage (Release, Advanced, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-MariaDB
- path: ./code_coverage/integration_tests/linux_integration_tests_release_system_mysql
-
- - name: Retrieve Linux Integration Test Coverage (Release, Advanced, MySql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-MySql
- path: ./code_coverage/integration_tests/linux_integration_tests_release_system_mysql
-
- - name: Retrieve Linux Integration Test Coverage (Release, Basic, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-Sqlite
- path: ./code_coverage/integration_tests/linux_integration_tests_release_basic_sqlite
-
- - name: Retrieve Linux Integration Test Coverage (Release, Basic, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-PostgresSql
- path: ./code_coverage/integration_tests/linux_integration_tests_release_basic_mariadb
-
- - name: Retrieve Linux Integration Test Coverage (Release, Basic, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-MariaDB
- path: ./code_coverage/integration_tests/linux_integration_tests_release_basic_mysql
-
- - name: Retrieve Linux Integration Test Coverage (Release, Basic, MySql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Release-Advanced-MySql
- path: ./code_coverage/integration_tests/linux_integration_tests_release_basic_mysql
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Advanced, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-Sqlite
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_system_sqlite
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Advanced, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-PostgresSql
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_system_mariadb
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Advanced, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-MariaDB
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_system_mysql
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Advanced, MySql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-MySql
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_system_mysql
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Basic, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-Sqlite
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_basic_sqlite
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Basic, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-PostgresSql
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_basic_mariadb
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Basic, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-MariaDB
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_basic_mysql
-
- - name: Retrieve Linux Integration Test Coverage (Debug, Basic, MySql)
- uses: actions/download-artifact@v4
- with:
- name: linux-integration-test-coverage-Debug-Advanced-MySql
- path: ./code_coverage/integration_tests/linux_integration_tests_debug_basic_mysql
-
- - name: Retrieve Windows Unit Test Coverage (Release)
- uses: actions/download-artifact@v4
- with:
- name: windows-unit-test-coverage-Release
- path: ./code_coverage/unit_tests/windows_unit_tests_release
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Basic, SqlServer)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Basic-SqlServer
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_basic_sqlserver
-
- - name: Retrieve Windows Integration Test Coverage (Release, Basic, SqlServer)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Basic-SqlServer
- path: ./code_coverage/integration_tests/windows_integration_tests_release_basic_sqlserver
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Advanced, SqlServer)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Advanced-SqlServer
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_system_sqlserver
-
- - name: Retrieve Windows Integration Test Coverage (Release, Advanced, SqlServer)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Advanced-SqlServer
- path: ./code_coverage/integration_tests/windows_integration_tests_release_system_sqlserver
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Basic, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Basic-MariaDB
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_basic_mariadb
-
- - name: Retrieve Windows Integration Test Coverage (Release, Basic, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Basic-MariaDB
- path: ./code_coverage/integration_tests/windows_integration_tests_release_basic_mariadb
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Advanced, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Advanced-MariaDB
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_system_mariadb
-
- - name: Retrieve Windows Integration Test Coverage (Release, Advanced, MariaDB)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Advanced-MariaDB
- path: ./code_coverage/integration_tests/windows_integration_tests_release_system_mariadb
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Basic, MySql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Basic-MySql
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_basic_mysql
-
- - name: Retrieve Windows Integration Test Coverage (Release, Basic, MySql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Basic-MySql
- path: ./code_coverage/integration_tests/windows_integration_tests_release_basic_mysql
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Advanced, MySql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Advanced-MySql
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_system_mysql
-
- - name: Retrieve Windows Integration Test Coverage (Release, Advanced, MySql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Advanced-MySql
- path: ./code_coverage/integration_tests/windows_integration_tests_release_system_mysql
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Basic, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Basic-PostgresSql
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_basic_postgressql
-
- - name: Retrieve Windows Integration Test Coverage (Release, Basic, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Basic-PostgresSql
- path: ./code_coverage/integration_tests/windows_integration_tests_release_basic_postgressql
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Advanced, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Advanced-PostgresSql
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_system_postgressql
-
- - name: Retrieve Windows Integration Test Coverage (Release, Advanced, PostgresSql)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Advanced-PostgresSql
- path: ./code_coverage/integration_tests/windows_integration_tests_release_system_postgressql
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Basic, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Basic-Sqlite
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_basic_sqlite
-
- - name: Retrieve Windows Integration Test Coverage (Release, Basic, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Basic-Sqlite
- path: ./code_coverage/integration_tests/windows_integration_tests_release_basic_sqlite
-
- - name: Retrieve Windows Integration Test Coverage (Debug, Advanced, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Debug-Advanced-Sqlite
- path: ./code_coverage/integration_tests/windows_integration_tests_debug_system_sqlite
-
- - name: Retrieve Windows Integration Test Coverage (Release, Advanced, Sqlite)
- uses: actions/download-artifact@v4
- with:
- name: windows-integration-test-coverage-Release-Advanced-Sqlite
- path: ./code_coverage/integration_tests/windows_integration_tests_release_system_sqlite
-
- - name: Upload Coverage to CodeCov
- uses: codecov/codecov-action@v4
- with:
- directory: ./code_coverage
- fail_ci_if_error: true
- token: ${{ secrets.CODECOV_TOKEN }}
- verbose: true
- handle_no_reports_found: true
-
- build-deb:
- name: Build .deb Package # Can't do i386 due to https://github.com/dotnet/core/issues/4595
- needs: build-releasenotes
- runs-on: ubuntu-latest
- env:
- TGS_TELEMETRY_KEY_FILE: /tmp/tgs_telemetry_key.txt
- steps:
- - name: Install Native Dependencies # Name checked in rerunFlakyTests.js
- run: |
- sudo dpkg --add-architecture i386
- sudo apt-get update
- sudo apt-get install -y -o APT::Immediate-Configure=0 libstdc++6:i386 libgcc-s1:i386
-
- - name: Import GPG Key
- if: (github.event_name == 'push' && contains(github.event.head_commit.message, '[TGSDeploy]') && (github.event.ref == 'refs/heads/master' || github.event.ref == 'refs/heads/dev'))
- run: |
- echo "${{ secrets.PACKAGING_PRIVATE_KEY }}" > private.pgp
- echo ${{ secrets.PACKAGING_PRIVATE_KEY_PASSPHRASE }} | gpg --batch --yes --passphrase-fd 0 --import private.pgp
- rm private.pgp
-
- - name: Install Native dotnet-sdk Package # Name checked in rerunFlakyTests.js
- if: (!contains(env.TGS_DOTNET_QUALITY, 'preview'))
- run: |
- sudo apt-get update
- sudo apt-get install -y dotnet-sdk-${{ env.TGS_DOTNET_VERSION }}.0
-
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Override /usr/bin/dotnet
- run: |
- DOTNET_PATH=$(which dotnet)
- sudo rm /usr/bin/dotnet
- sudo ln -s $DOTNET_PATH /usr/bin/dotnet
- echo "New dotnet path should be $DOTNET_PATH"
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Grab Most Recent Changelog
- run: curl -L https://raw.githubusercontent.com/tgstation/tgstation-server/gh-pages/changelog.yml -o changelog.yml
-
- - name: Setup Telemetry Key File
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Execute Build Script (Unsigned)
- if: (!(github.event_name == 'push' && contains(github.event.head_commit.message, '[TGSDeploy]') && github.event.ref == 'refs/heads/master'))
- env:
- RELEASE_NOTES_DLL_PATH: ${{ github.workspace }}/release_notes_bins/Tgstation.Server.ReleaseNotes.dll
- run: sudo -E build/package/deb/build_package.sh
-
- - name: Execute Build Script (Signed)
- if: (github.event_name == 'push' && contains(github.event.head_commit.message, '[TGSDeploy]') && github.event.ref == 'refs/heads/master')
+ - name: Execute Build Script (Signed)
+ if: (github.event_name == 'push' && contains(github.event.head_commit.message, '[TGSDeploy]') && github.event.ref == 'refs/heads/master')
env:
RELEASE_NOTES_DLL_PATH: ${{ github.workspace }}/release_notes_bins/Tgstation.Server.ReleaseNotes.dll
PACKAGING_KEYGRIP: ${{ vars.PACKAGING_KEYGRIP }}
run: sudo -E build/package/deb/build_package.sh
-
- - name: Parse TGS version
- run: |
- echo "TGS_VERSION=$(xmlstarlet sel -N X="http://schemas.microsoft.com/developer/msbuild/2003" --template --value-of /X:Project/X:PropertyGroup/X:TgsCoreVersion build/Version.props)" >> $GITHUB_ENV
-
- - name: Verify Package Files are Signed
- if: (github.event_name == 'push' && contains(github.event.head_commit.message, '[TGSDeploy]') && github.event.ref == 'refs/heads/master')
- run: |
- gpg --verify tgstation-server_${{ env.TGS_VERSION }}-1.dsc
- gpg --verify tgstation-server_${{ env.TGS_VERSION }}-1_amd64.changes
- gpg --verify tgstation-server_${{ env.TGS_VERSION }}-1_amd64.buildinfo
-
- - name: Delete Telemetry Key File
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Test Install
- run: |
- sudo mkdir /etc/tgstation-server
- sudo cp build/package/appsettings.GitHub.yml /etc/tgstation-server/appsettings.Production.yml
- sudo apt-get install -y ./tgstation-server_${{ env.TGS_VERSION }}-1_amd64.deb
- sudo ls -al /etc/tgstation-server
- sudo cat /etc/tgstation-server/appsettings.Production.yml
- sudo cat /etc/tgstation-server/appsettings.yml
- ls -al /opt/tgstation-server
- cat /opt/tgstation-server/lib/Default/Tgstation.Server.Host.deps.json
- cat /usr/bin/tgs-configure
-
- - name: Test Service
- run: |
- systemctl status tgstation-server
-
- - name: Test Uninstall # Wait 10s for service to initialize
- shell: bash
- run: |
- sleep 10
- sudo apt-get remove -y tgstation-server
- if [[ -d "/opt/tgstation-server" ]]; then
- find /opt/tgstation-server
- exit 2
- fi
-
- - name: Create Packaging Archive
- run: tar cfJ tgstation-server-v${{ env.TGS_VERSION }}.debian.packaging.tar.xz tgstation-server_*
-
- - name: Upload Packaging Archive
- uses: actions/upload-artifact@v4
- with:
- name: packaging-debian
- path: tgstation-server-v${{ env.TGS_VERSION }}.debian.packaging.tar.xz
-
- build-msi:
- name: Build Windows Installer .exe
- runs-on: windows-latest
- env:
- TGS_TELEMETRY_KEY_FILE: C:/tgs_telemetry_key.txt
- steps:
- - name: Install winget
- uses: Cyberboss/install-winget@v1
- with:
- GITHUB_TOKEN: ${{ secrets.DEV_PUSH_TOKEN }}
-
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Setup Node.JS
- uses: actions/setup-node@v4
- with:
- node-version: ${{ env.TGS_WEBPANEL_NODE_VERSION }}
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Restore Wix dotnet Tool
- run: |
- cd build/package/winget
- dotnet tool restore
-
- - name: Validate winget Manifest
- run: winget validate --manifest build/package/winget/manifest
-
- - name: Enable Corepack
- run: corepack enable
-
- - name: Setup Telemetry Key File
- shell: bash
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build Host # Name checked in rerunFlakyTests.js
- run: dotnet build -c Release src/Tgstation.Server.Host/Tgstation.Server.Host.csproj
-
- - name: Delete Telemetry Key File
- shell: bash
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build Service # Name checked in rerunFlakyTests.js
- run: dotnet build -c Release src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj
-
- - name: Prepare Artifacts
- shell: powershell
- run: build/package/winget/prepare_installer_input_artifacts.ps1
-
- - name: Build Installer .exe # Name checked in rerunFlakyTests.js
- run: |
- cd build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle
- dotnet build -c Release
-
- - name: Install Code Signing Certificate
- shell: powershell
- run: |
- $pfxBytes = [convert]::FromBase64String("${{ secrets.CODE_SIGNING_BASE64 }}")
- [IO.File]::WriteAllBytes("tg_codesigning.pfx", $pfxBytes)
- $certPassword = ConvertTo-SecureString -String "${{ secrets.CODE_SIGNING_PASSWORD }}" -Force -AsPlainText
- Import-PfxCertificate -FilePath tg_codesigning.pfx -Cert Cert:\CurrentUser\My -Password $certPassword
- rm tg_codesigning.pfx
-
- - name: Sign Installer .exe for Testing # https://wixtoolset.org/docs/tools/signing/
- shell: powershell
- run: |
- cd build/package/winget
- dotnet wix burn detach Tgstation.Server.Host.Service.Wix.Bundle/bin/Release/tgstation-server-installer.exe -engine burnengine.exe
- Set-AuthenticodeSignature burnengine.exe -Certificate (Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq "${{ vars.CODE_SIGNING_THUMBPRINT }}" }) -TimestampServer "http://timestamp.digicert.com"
- dotnet wix burn reattach Tgstation.Server.Host.Service.Wix.Bundle/bin/Release/tgstation-server-installer.exe -engine burnengine.exe -o test-installer.exe
- Set-AuthenticodeSignature test-installer.exe -Certificate (Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq "${{ vars.CODE_SIGNING_THUMBPRINT }}" }) -TimestampServer "http://timestamp.digicert.com"
-
- - name: Test Install # Sanity checks the .deps.json exists, which the installation is broken without
- shell: powershell # If it's missing, I found that in elements were the problem
- run: |
- mkdir C:/ProgramData/tgstation-server
- cp build/package/appsettings.GitHub.yml C:/ProgramData/tgstation-server/appsettings.Production.yml
- $file = [System.IO.Path]::GetFullPath("build/package/winget/test-installer.exe")
- $log = [System.IO.Path]::GetFullPath("install.log")
- $procMain = Start-Process -FilePath $file "/install /silent /log `"$log`"" -NoNewWindow -PassThru -Wait
- if (Test-Path -Path $log -PathType Leaf) {
- Get-Content $log
- }
- $installCode = $procMain.ExitCode
- if($installCode -ne 0) {
- Write-Host "ERROR INSTALLER EXIT CODE $installCode"
- exit 3
- }
- if (-Not (Test-Path -Path "C:/Program Files (x86)/tgstation-server/lib/Default/Tgstation.Server.Host.deps.json" -PathType Leaf)) {
- exit 2
- }
- if (-Not (Test-Path -Path "C:/ProgramData/tgstation-server/appsettings.yml" -PathType Leaf)) {
- exit 4
- }
-
- - name: Test Service
- shell: powershell
- run: |
- $service=Get-Service -Name tgstation-server -ErrorAction SilentlyContinue
- if ($service.Length -eq 0) {
- exit 3
- }
- if ($service[0].Status -ne "Running") {
- exit 4
- }
-
- - name: Test Uninstall # Sanity checks the .deps.json exists, which the installation is broken without
- shell: powershell
- run: |
- $file = [System.IO.Path]::GetFullPath("build/package/winget/test-installer.exe")
- $log = [System.IO.Path]::GetFullPath("uninstall.log")
- $procMain = Start-Process -FilePath $file "/uninstall /silent /log `"$log`"" -NoNewWindow -PassThru -Wait
- if (Test-Path -Path $log -PathType Leaf) {
- Get-Content $log
- }
- $installCode = $procMain.ExitCode
- if($installCode -ne 0) {
- Write-Host "ERROR INSTALLER EXIT CODE $installCode"
- exit 3
- }
- $service=Get-Service -Name tgstation-server -ErrorAction SilentlyContinue
- if ($service.Length -gt 0) {
- echo $service
- exit 2
- }
-
- - name: Upload Unsigned Installer .exe
- uses: actions/upload-artifact@v4
- with:
- name: packaging-preview-windows
- path: build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/bin/Release/tgstation-server-installer.exe
-
- check-winget-pr-template:
- name: Check winget-pkgs Pull Request Template is up to date
- needs: build-releasenotes
- runs-on: ubuntu-latest
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Checkout (Branch)
- uses: actions/checkout@v4
- if: github.event_name == 'push' || github.event_name == 'schedule'
-
- - name: Checkout (PR Merge)
- uses: actions/checkout@v4
- if: github.event_name != 'push' && github.event_name != 'schedule'
- with:
- ref: "refs/pull/${{ inputs.pull_request_number }}/merge"
-
- - name: Read Current SHA
- id: get-pr-sha
- if: github.event_name != 'push' && github.event_name != 'schedule'
- shell: bash
- run: echo "head_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
-
- - name: Retrieve Latest winget-pkgs PULL_REQUEST_TEMPLATE commit SHA from GitHub API
- id: get-sha
- run: |
- curl -L -u "${{ vars.DEV_PUSH_USERNAME }}:${{ secrets.DEV_PUSH_TOKEN }}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" -o commits.json https://api.github.com/repos/microsoft/winget-pkgs/commits?path=.github/PULL_REQUEST_TEMPLATE.md
- echo "pr_template_sha=$(cat commits.json | jq '.[0].sha')" >> $GITHUB_OUTPUT
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Run ReleaseNotes Check
- run: dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --winget-template-check ${{ steps.get-sha.outputs.pr_template_sha }}
-
- ci-completion-gate:
- name: CI Completion Gate
- needs: [ pages-build, docker-build, build-deb, build-msi, validate-openapi-spec, upload-code-coverage, check-winget-pr-template, efcore-version-match, code-scanning ]
- runs-on: ubuntu-latest
- steps:
- - name: Mandatory Empty Step
- run: exit 0
-
- deployment-gate:
- name: Deployment Start Gate
- needs: ci-completion-gate
- runs-on: ubuntu-latest
- if: github.event_name == 'push' && contains(github.event.head_commit.message, 'Deploy]')
- steps:
- - name: GitHub Requires at Least One Step for a Job
- run: exit 0
-
- deploy-http:
- name: Deploy HTTP API
- needs: deployment-gate
- runs-on: windows-latest
- if: contains(github.event.head_commit.message, '[APIDeploy]')
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Parse API version
- shell: powershell
- run: |
- [XML]$versionXML = Get-Content build/Version.props
- $apiVersion = $versionXML.Project.PropertyGroup.TgsApiVersion
- echo "TGS_API_VERSION=$apiVersion" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
-
- - name: Retrieve OpenAPI Spec
- uses: actions/download-artifact@v4
- with:
- name: openapi-spec
- path: swagger
-
- - name: Grab Most Recent Changelog
- shell: powershell
- run: |
- $ProgressPreference = 'SilentlyContinue'
- Invoke-WebRequest -Uri https://raw.githubusercontent.com/tgstation/tgstation-server/gh-pages/changelog.yml -OutFile changelog.yml
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Generate Release Notes
- run: dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll ${{ env.TGS_API_VERSION }} --httpapi
-
- - name: Generate App Token
- shell: powershell
- run: |
- dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --token-output-file ${{ runner.temp }}/installation_secret.txt ${{ secrets.TGS_CI_GITHUB_APP_TOKEN_BASE64 }}
- $installSecret = Get-Content ${{ runner.temp }}/installation_secret.txt
- echo "INSTALLATION_TOKEN=$installSecret" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
- rm ${{ runner.temp }}/installation_secret.txt
-
- - name: Create GitHub Release
- uses: actions/create-release@v1
- id: create_release
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- tag_name: api-v${{ env.TGS_API_VERSION }}
- release_name: tgstation-server API v${{ env.TGS_API_VERSION }}
- body_path: release_notes.md
- commitish: ${{ github.event.head_commit.id }}
-
- - name: Upload OpenApi Spec
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./swagger/tgs_api.json
- asset_name: swagger.json
- asset_content_type: application/json
-
- deploy-dm:
- name: Deploy DreamMaker API
- needs: deployment-gate
- runs-on: windows-latest
- if: contains(github.event.head_commit.message, '[DMDeploy]')
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Parse DMAPI version
- shell: powershell
- run: |
- [XML]$versionXML = Get-Content build/Version.props
- $dmVersion = $versionXML.Project.PropertyGroup.TgsDmapiVersion
- echo "TGS_DM_VERSION=$dmVersion" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
-
- - name: Zip DMAPI
- shell: powershell
- run: |
- &"C:/Program Files/7-Zip/7z.exe" a DMAPI.zip ./src/DMAPI/* -tzip
-
- - name: Grab Most Recent Changelog
- shell: powershell
- run: |
- $ProgressPreference = 'SilentlyContinue'
- Invoke-WebRequest -Uri https://raw.githubusercontent.com/tgstation/tgstation-server/gh-pages/changelog.yml -OutFile changelog.yml
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Generate Release Notes
- run: dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll ${{ env.TGS_DM_VERSION }} --dmapi
-
- - name: Generate App Token
- shell: powershell
- run: |
- dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --token-output-file ${{ runner.temp }}/installation_secret.txt ${{ secrets.TGS_CI_GITHUB_APP_TOKEN_BASE64 }}
- $installSecret = Get-Content ${{ runner.temp }}/installation_secret.txt
- echo "INSTALLATION_TOKEN=$installSecret" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
- rm ${{ runner.temp }}/installation_secret.txt
-
- - name: Create GitHub Release
- uses: actions/create-release@v1
- id: create_release
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- tag_name: dmapi-v${{ env.TGS_DM_VERSION }}
- release_name: tgstation-server DMAPI v${{ env.TGS_DM_VERSION }}
- body_path: release_notes.md
- commitish: ${{ github.event.head_commit.id }}
-
- - name: Upload DMAPI Artifact
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./DMAPI.zip
- asset_name: DMAPI.zip
- asset_content_type: application/zip
-
- deploy-client:
- name: Deploy Nuget Packages
- needs: deployment-gate
- runs-on: ubuntu-latest
- if: contains(github.event.head_commit.message, '[NugetDeploy]')
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Grab Most Recent Changelog
- run: curl -L https://raw.githubusercontent.com/tgstation/tgstation-server/gh-pages/changelog.yml -o changelog.yml
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Generate Release Notes
- run: dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --nuget
-
- - name: Publish Tgstation.Server.Common to NuGet
- uses: alirezanet/publish-nuget@e276c40afeb2a154046f0997820f2a9ea74832d9 # v3.1.0
- with:
- PROJECT_FILE_PATH: src/Tgstation.Server.Common/Tgstation.Server.Common.csproj
- TAG_COMMIT: false
- INCLUDE_SYMBOLS: true
- NUGET_KEY: ${{ secrets.NUGET_API_KEY }}
-
- - name: Publish Tgstation.Server.Api to NuGet
- uses: alirezanet/publish-nuget@e276c40afeb2a154046f0997820f2a9ea74832d9 # v3.1.0
- with:
- PROJECT_FILE_PATH: src/Tgstation.Server.Api/Tgstation.Server.Api.csproj
- TAG_COMMIT: false
- INCLUDE_SYMBOLS: true
- NUGET_KEY: ${{ secrets.NUGET_API_KEY }}
-
- - name: Publish Tgstation.Server.Client to NuGet
- uses: alirezanet/publish-nuget@e276c40afeb2a154046f0997820f2a9ea74832d9 # v3.1.0
- with:
- PROJECT_FILE_PATH: src/Tgstation.Server.Client/Tgstation.Server.Client.csproj
- TAG_COMMIT: false
- INCLUDE_SYMBOLS: true
- NUGET_KEY: ${{ secrets.NUGET_API_KEY }}
-
- ensure-release:
- name: Ensure TGS Release is Latest GitHub Release
- needs: [deploy-dm, deploy-http]
- runs-on: ubuntu-latest
- if: (!(cancelled() || failure())) && (!contains(github.event.head_commit.message, '[TGSDeploy]'))
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Run ReleaseNotes with --ensure-release
- run: dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --ensure-release ${{ secrets.TGS_CI_GITHUB_APP_TOKEN_BASE64 }}
-
- deploy-tgs:
- name: Deploy TGS
- needs: [deploy-dm, deploy-http, deployment-gate]
- runs-on: windows-latest
- if: (!(cancelled() || failure())) && github.event.ref == 'refs/heads/master' && contains(github.event.head_commit.message, '[TGSDeploy]')
- env:
- TGS_TELEMETRY_KEY_FILE: C:/tgs_telemetry_key.txt
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Setup Node.JS
- uses: actions/setup-node@v4
- with:
- node-version: ${{ env.TGS_WEBPANEL_NODE_VERSION }}
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Restore Wix dotnet Tool
- run: |
- cd build/package/winget
- dotnet tool restore
-
- - name: Enable Corepack
- run: corepack enable
-
- - name: Setup Telemetry Key File
- shell: bash
- run: echo "${{ secrets.TGS_TELEMETRY_KEY }}" > ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- # We need to rebuild the installer.exe so it can be properly signed
- - name: Build Host # Name checked in rerunFlakyTests.js
- run: dotnet build -c Release src/Tgstation.Server.Host/Tgstation.Server.Host.csproj
-
- - name: Delete Telemetry Key File
- shell: bash
- if: always()
- run: rm -f ${{ env.TGS_TELEMETRY_KEY_FILE }}
-
- - name: Build Service # Name checked in rerunFlakyTests.js
- run: dotnet build -c Release src/Tgstation.Server.Host.Service/Tgstation.Server.Host.Service.csproj
-
- - name: Prepare Artifacts
- shell: powershell
- run: build/package/winget/prepare_installer_input_artifacts.ps1
-
- - name: Build Installer .exe # Name checked in rerunFlakyTests.js
- run: |
- cd build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle
- dotnet build -c Release
-
- - name: Parse TGS version
- shell: powershell
- run: |
- [XML]$versionXML = Get-Content build/Version.props
- $tgsVersion = $versionXML.Project.PropertyGroup.TgsCoreVersion
- $mariaDBVerison = $versionXML.Project.PropertyGroup.TgsMariaDBRedistVersion
- echo "TGS_VERSION=$tgsVersion" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
- echo "MARIADB_VERSION=$mariaDBVerison" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
-
- - name: Upload .msi
- uses: actions/upload-artifact@v4
- with:
- name: packaging-windows-raw-msi
- path: build/package/winget/Tgstation.Server.Host.Service.Wix/bin/Release/en-US/tgstation-server.msi
-
- - name: Retrieve Server Service
- uses: actions/download-artifact@v4
- with:
- name: ServerService
- path: ServerService
-
- - name: Retrieve Server Console
- uses: actions/download-artifact@v4
- with:
- name: ServerConsole
- path: ServerConsole
-
- - name: Retrieve Server Update Package
- uses: actions/download-artifact@v4
- with:
- name: ServerUpdatePackage
- path: ServerUpdatePackage
-
- - name: Retrieve OpenAPI Spec
- uses: actions/download-artifact@v4
- with:
- name: openapi-spec
- path: swagger
-
- - name: Retrieve Debian Packaging Archive
- uses: actions/download-artifact@v4
- with:
- name: packaging-debian
- path: packaging-debian
-
- - name: Install Code Signing Certificate
- shell: powershell
- run: |
- $pfxBytes = [convert]::FromBase64String("${{ secrets.CODE_SIGNING_BASE64 }}")
- [IO.File]::WriteAllBytes("tg_codesigning.pfx", $pfxBytes)
- $certPassword = ConvertTo-SecureString -String "${{ secrets.CODE_SIGNING_PASSWORD }}" -Force -AsPlainText
- Import-PfxCertificate -FilePath tg_codesigning.pfx -Cert Cert:\CurrentUser\My -Password $certPassword
- rm tg_codesigning.pfx
-
- - name: Sign Installer .exe # https://wixtoolset.org/docs/tools/signing/
- shell: powershell
- run: |
- cd build/package/winget
- dotnet wix burn detach Tgstation.Server.Host.Service.Wix.Bundle/bin/Release/tgstation-server-installer.exe -engine burnengine.exe
- Set-AuthenticodeSignature burnengine.exe -Certificate (Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq "${{ vars.CODE_SIGNING_THUMBPRINT }}" }) -TimestampServer "http://timestamp.digicert.com"
- dotnet wix burn reattach Tgstation.Server.Host.Service.Wix.Bundle/bin/Release/tgstation-server-installer.exe -engine burnengine.exe -o tgstation-server-installer.exe
- Set-AuthenticodeSignature tgstation-server-installer.exe -Certificate (Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq "${{ vars.CODE_SIGNING_THUMBPRINT }}" }) -TimestampServer "http://timestamp.digicert.com"
-
- - name: Sign Service .exe
- shell: powershell
- run: Set-AuthenticodeSignature ServerService/Tgstation.Server.Host.Service.exe -Certificate (Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Thumbprint -eq "${{ vars.CODE_SIGNING_THUMBPRINT }}" }) -TimestampServer "http://timestamp.digicert.com"
-
- - name: Zip Artifacts
- shell: powershell
- run: |
- &"C:/Program Files/7-Zip/7z.exe" a DMAPI.zip ./src/DMAPI/* -tzip
- &"C:/Program Files/7-Zip/7z.exe" a ServerService.zip ./ServerService/* -tzip
- &"C:/Program Files/7-Zip/7z.exe" a ServerConsole.zip ./ServerConsole/* -tzip
- &"C:/Program Files/7-Zip/7z.exe" a ServerUpdatePackage.zip ./ServerUpdatePackage/* -tzip
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Generate Release Notes
- run: dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll ${{ env.TGS_VERSION }}
-
- - name: Generate App Token
- shell: powershell
- run: |
- dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --token-output-file ${{ runner.temp }}/installation_secret.txt ${{ secrets.TGS_CI_GITHUB_APP_TOKEN_BASE64 }}
- $installSecret = Get-Content ${{ runner.temp }}/installation_secret.txt
- echo "INSTALLATION_TOKEN=$installSecret" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
- rm ${{ runner.temp }}/installation_secret.txt
-
- - name: Create GitHub Release
- uses: actions/create-release@v1
- id: create_release
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- tag_name: tgstation-server-v${{ env.TGS_VERSION }}
- release_name: tgstation-server-v${{ env.TGS_VERSION }}
- body_path: release_notes.md
- commitish: ${{ github.event.head_commit.id }}
-
- - name: Upload Server Console Artifact
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./ServerConsole.zip
- asset_name: ServerConsole.zip
- asset_content_type: application/zip
-
- - name: Upload Server Service Artifact
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./ServerService.zip
- asset_name: ServerService.zip
- asset_content_type: application/zip
-
- - name: Upload DMAPI Artifact
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./DMAPI.zip
- asset_name: DMAPI.zip
- asset_content_type: application/zip
-
- - name: Upload OpenApi Spec Artifact
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./swagger/tgs_api.json
- asset_name: swagger.json
- asset_content_type: application/json
-
- - name: Upload Server Update Package Artifact
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./ServerUpdatePackage.zip
- asset_name: ServerUpdatePackage.zip
- asset_content_type: application/zip
-
- - name: Upload Debian Pacakaging Artifact
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./packaging-debian/tgstation-server-v${{ env.TGS_VERSION }}.debian.packaging.tar.xz
- asset_name: tgstation-server-v${{ env.TGS_VERSION }}.debian.packaging.tar.xz
- asset_content_type: application/x-tar
-
- - name: Upload MariaDB .msi
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./build/package/winget/Tgstation.Server.Host.Service.Wix.Bundle/bin/Release/mariadb.msi
- asset_name: mariadb-${{ env.MARIADB_VERSION }}-winx64.msi
- asset_content_type: application/octet-stream
-
- - name: Upload Installer .exe
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ env.INSTALLATION_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: ./build/package/winget/tgstation-server-installer.exe
- asset_name: tgstation-server-installer.exe
- asset_content_type: application/octet-stream
-
- changelog-regen:
- name: Regenerate Changelog
- runs-on: ubuntu-latest
- if: (!(cancelled() || failure())) && needs.deploy-tgs.result == 'success'
- needs: deploy-tgs
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: gh-pages Clone
- run: git clone -b gh-pages --single-branch "https://git@github.com/tgstation/tgstation-server" $HOME/tgsdox
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Compile Changelog (Incremental)
- run: |
- mv $HOME/tgsdox/changelog.yml ./ 2>/dev/null
- dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --generate-full-notes
-
- - name: Generate App Token
- run: |
- dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --token-output-file ${{ runner.temp }}/installation_secret.txt ${{ secrets.TGS_CI_GITHUB_APP_TOKEN_BASE64 }}
- echo "INSTALLATION_TOKEN=$(cat ${{ runner.temp }}/installation_secret.txt)" >> $GITHUB_ENV
- rm ${{ runner.temp }}/installation_secret.txt
-
- - name: gh-pages Push
- run: |
- pushd $HOME/tgsdox
- rm -f changelog.yml
- popd
- sudo mv changelog.yml $HOME/tgsdox/
- cd $HOME/tgsdox
- git config --global push.default simple
- git config user.name "tgstation-server-ci[bot]"
- git config user.email "161980869+tgstation-server-ci[bot]@users.noreply.github.com"
- git add changelog.yml
- echo "Committing..."
- git diff-index --quiet HEAD || git commit -m "Regenerate changelog post deploy for workflow run ${{ github.run_number }}" -m "Commit: ${{ github.event.head_commit.id }}"
- echo "Pushing..."
- git push -f "https://tgstation-server-ci:${{ env.INSTALLATION_TOKEN }}@github.com/tgstation/tgstation-server" 2>&1
-
- deploy-docker:
- name: Deploy TGS (Docker)
- needs: deploy-tgs
- if: (!(cancelled() || failure())) && needs.deploy-tgs.result == 'success'
- runs-on: ubuntu-latest
- steps:
- - name: Install Native Packages # Name checked in rerunFlakyTests.js
- run: |
- sudo apt-get update
- sudo apt-get install -y xmlstarlet
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Parse TGS version
- run: echo "TGS_VERSION=$(xmlstarlet sel -N X="http://schemas.microsoft.com/developer/msbuild/2003" --template --value-of /X:Project/X:PropertyGroup/X:TgsCoreVersion build/Version.props)" >> $GITHUB_ENV
-
- - name: Docker Build and Push
- uses: elgohr/Publish-Docker-Github-Action@43dc228e327224b2eda11c8883232afd5b34943b # v5
- with:
- name: tgstation/server
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_PASSWORD }}
- dockerfile: build/Dockerfile
- tags: "latest,v${{ env.TGS_VERSION }}"
-
- deploy-ppa:
- name: Deploy TGS (PPA)
- needs: deploy-tgs
- if: (!(cancelled() || failure())) && needs.deploy-tgs.result == 'success'
- runs-on: ubuntu-latest
- steps:
- - name: Install Native Packages # Name checked in rerunFlakyTests.js
- run: |
- sudo apt-get update
- sudo apt-get install -y xmlstarlet
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Parse TGS version
- run: echo "TGS_VERSION=$(xmlstarlet sel -N X="http://schemas.microsoft.com/developer/msbuild/2003" --template --value-of /X:Project/X:PropertyGroup/X:TgsCoreVersion build/Version.props)" >> $GITHUB_ENV
-
- - name: Trigger tgstation-ppa workflow
- run: |
- curl -XPOST -u "${{ vars.DEV_PUSH_USERNAME }}:${{ secrets.DEV_PUSH_TOKEN }}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" https://api.github.com/repos/tgstation/tgstation-ppa/actions/workflows/add_tgs_version.yml/dispatches --data '{"ref":"main","inputs":{"tgs_semver": "${{ env.TGS_VERSION }}"}}'
-
- deploy-winget:
- name: Deploy TGS (winget)
- needs: deploy-tgs
- if: (!(cancelled() || failure())) && needs.deploy-tgs.result == 'success'
- runs-on: windows-latest
- steps:
- - name: Setup dotnet
- uses: actions/setup-dotnet@v4
- with:
- dotnet-version: '${{ env.TGS_DOTNET_VERSION }}.0.x'
- dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
-
- - name: Install winget
- uses: Cyberboss/install-winget@v1
- with:
- GITHUB_TOKEN: ${{ secrets.DEV_PUSH_TOKEN }}
-
- - name: Install wingetcreate
- run: winget install wingetcreate --version 1.2.8.0 --disable-interactivity --accept-source-agreements # Pinned due to breaking every other version
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Retrieve Server Service
- uses: actions/download-artifact@v4
- with:
- name: packaging-windows-raw-msi
- path: artifacts
-
- - name: Retrieve ReleaseNotes Binaries
- uses: actions/download-artifact@v4
- with:
- name: release_notes_bins
- path: release_notes_bins
-
- - name: Execute Push Script
- shell: powershell
- run: build/package/winget/push_manifest.ps1
- env:
- WINGET_PUSH_TOKEN: ${{ secrets.DEV_PUSH_TOKEN }}
-
- - name: Delay 10m to allow MS bot to update PR
- shell: powershell
- run: Sleep 600
-
- - name: Run ReleaseNotes with --link-winget
- shell: powershell
- run: dotnet release_notes_bins/Tgstation.Server.ReleaseNotes.dll --link-winget ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}