mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-29 16:11:05 +01:00
963 lines
33 KiB
YAML
963 lines
33 KiB
YAML
name: 'CI'
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- dev
|
|
- master
|
|
pull_request:
|
|
branches:
|
|
- dev
|
|
- master
|
|
pull_request_target:
|
|
types: [opened, reopened, labeled, synchronize]
|
|
branches:
|
|
- dev
|
|
- master
|
|
|
|
env:
|
|
TGS_DOTNET_VERSION: 6.0.x
|
|
TGS_TEST_DISCORD_CHANNEL: ${{ secrets.DISCORD_CHANNEL_ID }}
|
|
TGS_TEST_DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
|
|
TGS_TEST_IRC_CHANNEL: ${{ secrets.IRC_CHANNEL }}
|
|
TGS_TEST_IRC_CONNECTION_STRING: ${{ secrets.IRC_CONNECTION_STRING }}
|
|
TGS_TEST_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
TGS_RELEASE_NOTES_TOKEN: ${{ secrets.DEV_PUSH_TOKEN }}
|
|
|
|
concurrency:
|
|
group: "ci-${{ (github.event_name == 'push' ? github.head_ref : github.event.number) }}"
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
security-checkpoint:
|
|
name: Check CI Clearance
|
|
runs-on: ubuntu-latest
|
|
if: github.event_name == 'pull_request_target' && github.pull_request.head.repo.id != github.repository.id
|
|
steps:
|
|
- name: Comment on new Fork PR
|
|
if: github.event.action == 'opened' && !contains(github.event.pull_request.labels.*.name, 'CI Cleared')
|
|
uses: thollander/actions-comment-pull-request@v2
|
|
with:
|
|
message: Thank you for contributing to tgstation-server! As this pull request is from a fork, we can't allow the CI actions which require repository secrets to run on it without approval. After a brief review to make sure you're not misusing those secrets, a maintainer will add the `CI Cleared` label to allow the CI suite to run. Maintainers, please note that any changes to workflow files will not be reflected in the CI run.
|
|
|
|
- name: "Remove Stale 'CI Cleared' Label"
|
|
if: github.event.action == 'synchronize' || github.event.action == 'reopened'
|
|
uses: actions-ecosystem/action-remove-labels@v1
|
|
with:
|
|
labels: CI Cleared
|
|
|
|
- name: Fail Clearance Check if PR has Unlabeled new Commits from Fork
|
|
if: (github.event.action == 'synchronize' || github.event.action == 'reopened') && !contains(github.event.pull_request.labels.*.name, 'CI Cleared')
|
|
run: exit 1
|
|
|
|
start-ci-run-gate:
|
|
name: Start CI Run Gate
|
|
needs: security-checkpoint
|
|
runs-on: ubuntu-latest
|
|
if: always() && (needs.security-check.result == 'success' || needs.security-check.result == 'skipped')
|
|
steps:
|
|
- name: GitHub Requires at Least One Step for a Job
|
|
run: exit 0
|
|
|
|
analyze:
|
|
name: Code Scanning
|
|
needs: start-ci-run-gate
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Install Node 12.X
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 12.x
|
|
|
|
- name: Upgrade NPM
|
|
run: npm install -g npm
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
with:
|
|
fetch-depth: 2
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
fetch-depth: 2
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Initialize CodeQL
|
|
uses: github/codeql-action/init@v2
|
|
with:
|
|
languages: csharp
|
|
|
|
- name: Autobuild
|
|
uses: github/codeql-action/autobuild@v2
|
|
|
|
- name: Perform CodeQL Analysis
|
|
uses: github/codeql-action/analyze@v2
|
|
|
|
dmapi-build:
|
|
name: Build DMAPI
|
|
needs: start-ci-run-gate
|
|
env:
|
|
BYOND_MAJOR: 515
|
|
BYOND_MINOR: 1592
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Install x86 libc Dependencies
|
|
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
|
|
|
|
- name: Install BYOND
|
|
if: steps.cache-byond.outputs.cache-hit != 'true'
|
|
run: |
|
|
echo "Setting up BYOND."
|
|
mkdir -p "$HOME/BYOND-${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }}"
|
|
cd "$HOME/BYOND-${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }}"
|
|
curl "http://www.byond.com/download/build/${{ env.BYOND_MAJOR }}/${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }}_byond_linux.zip" -o byond.zip
|
|
unzip byond.zip
|
|
cd byond
|
|
make here
|
|
exit 0
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Build DMAPI Test Project
|
|
run: |
|
|
set -e
|
|
retval=1
|
|
source $HOME/BYOND-${{ env.BYOND_MAJOR }}.${{ env.BYOND_MINOR }}/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
|
|
|
|
dox-build:
|
|
name: Build Doxygen Site
|
|
runs-on: ubuntu-latest
|
|
needs: start-ci-run-gate
|
|
steps:
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Patch Doxyfile
|
|
run: |
|
|
VERSION=$(cat "build/Version.props" | grep -oPm1 "(?<=<TgsCoreVersion>)[^<]+")
|
|
echo -e "\nPROJECT_NUMBER = $VERSION\nINPUT = .\nOUTPUT_DIRECTORY = ./doxout\nPROJECT_LOGO = ./build/tgs.ico\nHAVE_DOT=YES" >> "docs/Doxyfile"
|
|
|
|
- name: Doxygen Build
|
|
uses: mattnotmitt/doxygen-action@v1
|
|
with:
|
|
doxyfile-path: 'docs/Doxyfile'
|
|
|
|
- name: gh-pages push
|
|
if: github.event_name == 'push' && github.event.ref == 'refs/heads/dev'
|
|
run: |
|
|
git clone -b gh-pages --single-branch "https://git@github.com/tgstation/tgstation-server" $HOME/tgsdox
|
|
pushd $HOME/tgsdox
|
|
rm -r *
|
|
popd
|
|
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"
|
|
git config user.email "tgstation-server@tgstation13.org"
|
|
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://${{ secrets.DEV_PUSH_TOKEN }}@github.com/tgstation/tgstation-server" 2>&1
|
|
|
|
docker-build:
|
|
name: Build Docker Image
|
|
runs-on: ubuntu-latest
|
|
needs: start-ci-run-gate
|
|
steps:
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Build Docker Image
|
|
run: docker build . -f build/Dockerfile
|
|
|
|
linux-unit-tests:
|
|
name: Linux Tests
|
|
needs: start-ci-run-gate
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
configuration: [ 'Debug', 'Release' ]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Setup dotnet
|
|
uses: actions/setup-dotnet@v2
|
|
with:
|
|
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Upgrade NPM
|
|
run: sudo npm install -g npm
|
|
|
|
- name: Build
|
|
run: dotnet build -c ${{ matrix.configuration }}NoService
|
|
|
|
- name: Run Unit Tests
|
|
run: sudo dotnet test --no-build --logger GitHubActions --filter FullyQualifiedName!~TestLiveServer -c ${{ matrix.configuration }}NoService --collect:"XPlat Code Coverage" --settings build/coverlet.runsettings --results-directory ./TestResults tgstation-server.sln
|
|
|
|
- name: Store Code Coverage
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: linux-unit-test-coverage-${{ matrix.configuration }}
|
|
path: ./TestResults/
|
|
|
|
windows-unit-tests:
|
|
name: Windows Tests
|
|
needs: start-ci-run-gate
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
configuration: [ 'Debug', 'Release' ]
|
|
runs-on: windows-latest
|
|
steps:
|
|
- name: Setup dotnet
|
|
uses: actions/setup-dotnet@v2
|
|
with:
|
|
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Upgrade NPM
|
|
run: npm install -g npm
|
|
|
|
- name: Build
|
|
run: dotnet build -c ${{ matrix.configuration }}
|
|
|
|
- name: Run Unit Tests
|
|
run: dotnet test --no-build --logger GitHubActions --filter FullyQualifiedName!~TestLiveServer -c ${{ matrix.configuration }} --collect:"XPlat Code Coverage" --settings build/coverlet.runsettings --results-directory ./TestResults tgstation-server.sln
|
|
|
|
- name: Store Code Coverage
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: windows-unit-test-coverage-${{ matrix.configuration }}
|
|
path: ./TestResults/
|
|
|
|
windows-integration-test:
|
|
name: Windows Live Tests
|
|
needs: dmapi-build
|
|
env:
|
|
TGS_TEST_DATABASE_TYPE: SqlServer
|
|
TGS_TEST_DUMP_API_SPEC: yes
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
watchdog-type: [ 'Basic', 'System' ]
|
|
configuration: [ 'Debug', 'Release' ]
|
|
runs-on: windows-latest
|
|
steps:
|
|
- name: Setup dotnet
|
|
uses: actions/setup-dotnet@v2
|
|
with:
|
|
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}
|
|
|
|
- name: Upgrade NPM
|
|
run: npm install -g npm
|
|
|
|
- name: Set General__UseBasicWatchdog
|
|
if: ${{ matrix.watchdog-type == 'Basic' }}
|
|
run: echo "General__UseBasicWatchdog=true" >> $Env:GITHUB_ENV
|
|
|
|
- name: Set TGS_TEST_CONNECTION_STRING
|
|
shell: bash
|
|
run: |
|
|
TGS_CONNSTRING_VALUE="Server=(localdb)\MSSQLLocalDB;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
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Build
|
|
run: dotnet build -c ${{ matrix.configuration }} tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj
|
|
|
|
- name: Run Live Tests
|
|
run: |
|
|
cd tests/Tgstation.Server.Tests
|
|
Start-Sleep -Seconds 10
|
|
dotnet test -c ${{ matrix.configuration }} --no-build --filter FullyQualifiedName~TestLiveServer --logger GitHubActions --collect:"XPlat Code Coverage" --settings ../../build/coverlet.runsettings --results-directory ../../TestResults
|
|
|
|
- name: Store Code Coverage
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: windows-integration-test-coverage-${{ matrix.configuration }}-${{ matrix.watchdog-type }}
|
|
path: ./TestResults/
|
|
|
|
- name: Store OpenAPI Spec
|
|
if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'System' }}
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: openapi-spec
|
|
path: C:/swagger.json
|
|
|
|
- name: Package Server Service
|
|
if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Basic' }}
|
|
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
|
|
mv ../../Artifacts/Service/lib/Default/appsettings.yml ../../Artifacts/Service/appsettings.yml
|
|
|
|
- name: Store Server Service
|
|
if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'Basic' }}
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: ServerService
|
|
path: Artifacts/Service/
|
|
|
|
linux-integration-tests:
|
|
name: Linux Live Tests
|
|
needs: dmapi-build
|
|
services: # We start all dbs here so we can just code the stuff once
|
|
postgres:
|
|
image: 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: mariadb
|
|
ports:
|
|
- 3306:3306
|
|
env:
|
|
MYSQL_ROOT_PASSWORD: mariadb
|
|
options: >-
|
|
--health-cmd="mysqladmin ping"
|
|
--health-interval=5s
|
|
--health-timeout=2s
|
|
--health-retries=3
|
|
mysql:
|
|
image: 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: [ 'System' ]
|
|
configuration: [ 'Release' ]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Disable ptrace_scope
|
|
run: echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
|
|
|
|
- name: Install Native Dependencies
|
|
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
|
|
|
|
- name: Install Node 12.X
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 12.x
|
|
|
|
- name: Upgrade NPM
|
|
run: npm install -g npm
|
|
|
|
- name: Setup dotnet
|
|
uses: actions/setup-dotnet@v2
|
|
with:
|
|
dotnet-version: ${{ env.TGS_DOTNET_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 Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Build
|
|
run: dotnet build -c ${{ matrix.configuration }}NoService tests/Tgstation.Server.Tests/Tgstation.Server.Tests.csproj
|
|
|
|
- name: Run Live Tests
|
|
run: |
|
|
cd tests/Tgstation.Server.Tests
|
|
sleep 10
|
|
dotnet test -c ${{ matrix.configuration }}NoService --filter FullyQualifiedName~TestLiveServer --logger GitHubActions --no-build --collect:"XPlat Code Coverage" --settings ../../build/coverlet.runsettings --results-directory ../../TestResults
|
|
|
|
- name: Store Code Coverage
|
|
uses: actions/upload-artifact@v3
|
|
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 == 'System' && 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 }}NoService --no-build -o ../../Artifacts/Console/lib/Default
|
|
mv ../../Artifacts/Console/lib/Default/appsettings.yml ../../Artifacts/Console/appsettings.yml
|
|
|
|
- name: Package Server Update Package
|
|
if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'System' && matrix.database-type == 'PostgresSql' }}
|
|
run: |
|
|
cd src/Tgstation.Server.Host
|
|
dotnet publish -c ${{ matrix.configuration }}NoService --no-build -o ../../Artifacts/ServerUpdate
|
|
rm ../../Artifacts/ServerUpdate/appsettings.yml
|
|
|
|
- name: Store Server Console
|
|
if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'System' && matrix.database-type == 'MariaDB' }}
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: ServerConsole
|
|
path: Artifacts/Console/
|
|
|
|
- name: Store Server Update Package
|
|
if: ${{ matrix.configuration == 'Release' && matrix.watchdog-type == 'System' && matrix.database-type == 'PostgresSql' }}
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: ServerUpdatePackage
|
|
path: Artifacts/ServerUpdate/
|
|
|
|
validate-openapi-spec:
|
|
name: OpenAPI Spec Validation
|
|
needs: windows-integration-test
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Install Node 12.X
|
|
uses: actions/setup-node@v3
|
|
with:
|
|
node-version: 12.x
|
|
|
|
- name: Install IBM OpenAPI Validator
|
|
run: npm i -g ibm-openapi-validator@0.51.3
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Retrieve OpenAPI Spec
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: openapi-spec
|
|
path: ./swagger
|
|
|
|
- name: Lint OpenAPI Spec
|
|
run: npx lint-openapi -v -p -c build/OpenApiValidationSettings.json ./swagger/swagger.json
|
|
|
|
upload-code-coverage:
|
|
name: Upload Code Coverage
|
|
needs: [linux-unit-tests, linux-integration-tests, windows-unit-tests, windows-integration-test]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Retrieve Linux Unit Test Coverage (Debug)
|
|
uses: actions/download-artifact@v3
|
|
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@v3
|
|
with:
|
|
name: linux-unit-test-coverage-Release
|
|
path: ./code_coverage/unit_tests/linux_unit_tests_release
|
|
|
|
- name: Retrieve Linux Integration Test Coverage (Release, System, Sqlite)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: linux-integration-test-coverage-Release-System-Sqlite
|
|
path: ./code_coverage/integration_tests/linux_integration_tests_release_system_sqlite
|
|
|
|
- name: Retrieve Linux Integration Test Coverage (Release, System, PostgresSql)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: linux-integration-test-coverage-Release-System-PostgresSql
|
|
path: ./code_coverage/integration_tests/linux_integration_tests_release_system_mariadb
|
|
|
|
- name: Retrieve Linux Integration Test Coverage (Release, System, MariaDB)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: linux-integration-test-coverage-Release-System-MariaDB
|
|
path: ./code_coverage/integration_tests/linux_integration_tests_release_system_mysql
|
|
|
|
- name: Retrieve Linux Integration Test Coverage (Release, System, MySql)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: linux-integration-test-coverage-Release-System-MySql
|
|
path: ./code_coverage/integration_tests/linux_integration_tests_release_system_mysql
|
|
|
|
- name: Retrieve Windows Unit Test Coverage (Release)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: windows-unit-test-coverage-Release
|
|
path: ./code_coverage/unit_tests/windows_unit_tests_release
|
|
|
|
- name: Retrieve Windows Integration Test Coverage (Debug, Basic)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: windows-integration-test-coverage-Debug-Basic
|
|
path: ./code_coverage/integration_tests/windows_integration_tests_debug_basic
|
|
|
|
- name: Retrieve Windows Integration Test Coverage (Release, Basic)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: windows-integration-test-coverage-Release-Basic
|
|
path: ./code_coverage/integration_tests/windows_integration_tests_release_basic
|
|
|
|
- name: Retrieve Windows Integration Test Coverage (Debug, System)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: windows-integration-test-coverage-Debug-System
|
|
path: ./code_coverage/integration_tests/windows_integration_tests_debug_system
|
|
|
|
- name: Retrieve Windows Integration Test Coverage (Release, System)
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: windows-integration-test-coverage-Release-System
|
|
path: ./code_coverage/integration_tests/windows_integration_tests_release_system
|
|
|
|
- name: Upload Coverage to CodeCov
|
|
uses: codecov/codecov-action@v3
|
|
with:
|
|
directory: ./code_coverage
|
|
fail_ci_if_error: true
|
|
|
|
|
|
deploy-http:
|
|
name: Deploy HTTP API
|
|
needs: [upload-code-coverage, validate-openapi-spec]
|
|
runs-on: windows-latest
|
|
if: github.event_name == 'push' && contains(github.event.head_commit.message, '[APIDeploy]')
|
|
steps:
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- 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@v3
|
|
with:
|
|
name: openapi-spec
|
|
path: swagger
|
|
|
|
- name: Create GitHub Release
|
|
uses: juitnow/github-action-create-release@v1
|
|
id: create_release
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
tag_name: api-v${{ env.TGS_API_VERSION }}
|
|
release_name: tgstation-server API v${{ env.TGS_API_VERSION }}
|
|
body: The TGS HTTP API
|
|
commitish: ${{ github.event.head_commit.id }}
|
|
|
|
- name: Upload OpenApi Spec
|
|
uses: actions/upload-release-asset@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
asset_path: ./swagger/swagger.json
|
|
asset_name: swagger.json
|
|
asset_content_type: application/json
|
|
|
|
deploy-dm:
|
|
name: Deploy DreamMaker API
|
|
needs: [upload-code-coverage, validate-openapi-spec]
|
|
runs-on: windows-latest
|
|
if: github.event_name == 'push' && contains(github.event.head_commit.message, '[DMDeploy]')
|
|
steps:
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- 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: Create GitHub Release
|
|
uses: juitnow/github-action-create-release@v1
|
|
id: create_release
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
tag_name: dmapi-v${{ env.TGS_DM_VERSION }}
|
|
release_name: tgstation-server DMAPI v${{ env.TGS_DM_VERSION }}
|
|
body: The TGS DMAPI \#tgs-dmapi-release
|
|
commitish: ${{ github.event.head_commit.id }}
|
|
|
|
- name: Upload DMAPI Artifact
|
|
uses: actions/upload-release-asset@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_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: [upload-code-coverage, validate-openapi-spec]
|
|
runs-on: ubuntu-latest
|
|
if: github.event_name == 'push' && contains(github.event.head_commit.message, '[NugetDeploy]')
|
|
steps:
|
|
- name: Setup dotnet
|
|
uses: actions/setup-dotnet@v2
|
|
with:
|
|
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Publish API to NuGet
|
|
uses: alirezanet/publish-nuget@v3.0.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 Client to NuGet
|
|
uses: alirezanet/publish-nuget@v3.0.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: always() && github.event_name == 'push' && !contains(github.event.head_commit.message, '[TGSDeploy]') && (contains(github.event.head_commit.message, '[APIDeploy]') || contains(github.event.head_commit.message, '[DMDeploy]'))
|
|
steps:
|
|
- name: Setup dotnet
|
|
uses: actions/setup-dotnet@v2
|
|
with:
|
|
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Run ReleaseNotes with --ensure-release
|
|
run: dotnet run -c Release --project tools/ReleaseNotes --ensure-release
|
|
|
|
deploy-tgs:
|
|
name: Deploy TGS
|
|
needs: [upload-code-coverage, validate-openapi-spec]
|
|
runs-on: windows-latest
|
|
if: github.event_name == 'push' && github.event.ref == 'refs/heads/master' && contains(github.event.head_commit.message, '[TGSDeploy]')
|
|
steps:
|
|
- name: Setup dotnet
|
|
uses: actions/setup-dotnet@v2
|
|
with:
|
|
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}
|
|
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Parse TGS version
|
|
shell: powershell
|
|
run: |
|
|
[XML]$versionXML = Get-Content build/Version.props
|
|
$tgsVersion = $versionXML.Project.PropertyGroup.TgsCoreVersion
|
|
echo "TGS_VERSION=$tgsVersion" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
|
|
|
- name: Retrieve Server Service
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: ServerService
|
|
path: ServerService
|
|
|
|
- name: Retrieve Server Console
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: ServerConsole
|
|
path: ServerConsole
|
|
|
|
- name: Retrieve Server Update Package
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: ServerUpdatePackage
|
|
path: ServerUpdatePackage
|
|
|
|
- name: Retrieve OpenAPI Spec
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: openapi-spec
|
|
path: swagger
|
|
|
|
- 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: Generate Release Notes
|
|
run: dotnet run -c Release --project tools/ReleaseNotes ${{ env.TGS_VERSION }}
|
|
|
|
- name: Create GitHub Release
|
|
uses: actions/create-release@v1
|
|
id: create_release
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.DEV_PUSH_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: ${{ secrets.DEV_PUSH_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: ${{ secrets.DEV_PUSH_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: ${{ secrets.DEV_PUSH_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: ${{ secrets.DEV_PUSH_TOKEN }}
|
|
with:
|
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
asset_path: ./swagger/swagger.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: ${{ secrets.DEV_PUSH_TOKEN }}
|
|
with:
|
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
asset_path: ./ServerUpdatePackage.zip
|
|
asset_name: ServerUpdatePackage.zip
|
|
asset_content_type: application/zip
|
|
|
|
deploy-docker:
|
|
name: Deploy TGS (Docker)
|
|
needs: [deploy-tgs]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout (Branch Push)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name == 'push'
|
|
|
|
- name: Checkout (PR Merge)
|
|
uses: actions/checkout@v3
|
|
if: github.event_name != 'push'
|
|
with:
|
|
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
|
|
- name: Parse TGS version
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y xmlstarlet
|
|
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@v5
|
|
with:
|
|
name: tgstation/server
|
|
username: ${{ secrets.DOCKER_USERNAME }}
|
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
dockerfile: build/Dockerfile
|
|
tags: "latest,v${{ env.TGS_VERSION }}"
|