diff --git a/.travis.yml b/.travis.yml index fdf2ca5900..38e1a220ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,15 @@ branches: jobs: include: - env: + - DoxGeneration=true + name: "Dox Generation" + addons: + apt: + packages: + - doxygen + - graphviz + - env: + - DoxGeneration=false - DockerBuild=false - DMAPI=true - BYOND_MAJOR="513" @@ -28,6 +37,7 @@ jobs: - libc6-i386 - libstdc++6:i386 - env: + - DoxGeneration=false - DockerBuild=false - DMAPI=false - CONFIG=Debug @@ -46,6 +56,7 @@ jobs: - libc6-i386 - libstdc++6:i386 - env: + - DoxGeneration=false - DockerBuild=false - DMAPI=false - CONFIG=Release @@ -64,16 +75,18 @@ jobs: - libc6-i386 - libstdc++6:i386 - env: + - DoxGeneration=false - DockerBuild=true name: "Docker Build" services: - docker install: - - if [ $DockerBuild = false ] && [ $DMAPI = true ]; then build/install_byond.sh; fi - - if [ $DockerBuild = false ] && [ $DMAPI = false ]; then dotnet restore tgstation-server.sln; fi + - if [ $DoxGeneration = false ] && [ $DockerBuild = false ] && [ $DMAPI = true ]; then build/install_byond.sh; fi + - if [ $DoxGeneration = false ] && [ $DockerBuild = false ] && [ $DMAPI = false ]; then dotnet restore tgstation-server.sln; fi script: - - if [ $DockerBuild = false ] && [ $DMAPI = true ]; then tests/DMAPI/BasicOperation/build_byond.sh || travis_terminate 1; fi - - if [ $DockerBuild = false ] && [ $DMAPI = false ]; then build/test_core.sh; fi - - if [ $DockerBuild = true ]; then docker build . -f build/Dockerfile; fi + - if [ $DoxGeneration = false ] && [ $DockerBuild = false ] && [ $DMAPI = true ]; then tests/DMAPI/BasicOperation/build_byond.sh || travis_terminate 1; fi + - if [ $DoxGeneration = false ] && [ $DockerBuild = false ] && [ $DMAPI = false ]; then build/test_core.sh; fi + - if [ $DoxGeneration = false ] && [ $DockerBuild = true ]; then docker build . -f build/Dockerfile; fi + - if [ $DoxGeneration = true ]; then build/build_dox.sh; fi diff --git a/appveyor.yml b/appveyor.yml index eda65fa50a..3ba2f056f9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,7 +24,6 @@ branches: skip_tags: true image: Visual Studio 2019 configuration: - - Debug - Release shallow_clone: true artifacts: @@ -36,8 +35,6 @@ artifacts: name: ServerUpdatePackage - path: src/DMAPI name: DMAPI - - path: tgsdox - name: DocumentationHtml - path: swagger.json name: SwaggerSpec cache: @@ -45,7 +42,7 @@ cache: services: - mssql2017 install: - - choco install doxygen.install codecov graphviz.portable opencover.portable + - choco install codecov opencover.portable - npm i -g ibm-openapi-validator - nuget restore tgstation-server.sln - ps: Install-Product node 10 @@ -81,8 +78,8 @@ test_script: - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\tests\Tgstation.Server.Tests\TestResults\results.trx)) - lint-openapi -p -c build/OpenApiValidationSettings.json C:/swagger.json after_test: + - ps: Move-Item -path C:/swagger.json swagger.json - ps: build/UploadCoverage.ps1 - - ps: build/BuildDox.ps1 #host updater - dotnet publish src/Tgstation.Server.Host/Tgstation.Server.Host.csproj -o artifacts/ServerHost -c %CONFIGURATION% #console diff --git a/build/BuildDox.ps1 b/build/BuildDox.ps1 deleted file mode 100644 index 4e0b4dcf13..0000000000 --- a/build/BuildDox.ps1 +++ /dev/null @@ -1,42 +0,0 @@ -$bf = $Env:APPVEYOR_BUILD_FOLDER - -$doxdir = "C:\tgsdox" - -New-Item -Path $doxdir -ItemType directory - -$publish_dox = (-not (Test-Path Env:APPVEYOR_PULL_REQUEST_NUMBER)) -and ("$Env:APPVEYOR_REPO_BRANCH" -eq "master") - -if($publish_dox){ - $github_url = "github.com/$Env:APPVEYOR_REPO_NAME" - echo "Cloning https://git@$github_url..." - git clone -b gh-pages --single-branch "https://git@$github_url" "$doxdir" 2>$null - rm -r "$doxdir\*" -} - -Add-Content "$bf\docs\Doxyfile" "`nPROJECT_NUMBER = $version`nINPUT = $bf`nOUTPUT_DIRECTORY = $doxdir`nPROJECT_LOGO = $bf/build/tgs.ico`nHAVE_DOT=YES" - -&"C:\Program Files\doxygen\bin\doxygen.exe" "$bf\docs\Doxyfile" - -if($publish_dox){ - cd $doxdir - 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 APPVEYOR CI' > README.md - - # Add in the swagger specification - cp C:/swagger.json "$doxdir/swagger.json" - - # 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 - git add --all - git commit -m "Deploy code docs to GitHub Pages for Appveyor build $Env:APPVEYOR_BUILD_NUMBER" -m "Commit: $Env:APPVEYOR_REPO_COMMIT" - git push -f "https://$Env:TGS4_TEST_GITHUB_TOKEN@$github_url" 2>&1 | out-null - cd "$bf" - rm -r "$doxdir/.git" -} -mv C:/tgsdox "$bf/tgsdox" - -# Add in the swagger specification -cp C:/swagger.json "$bf/swagger.json" diff --git a/build/build_dox.sh b/build/build_dox.sh new file mode 100755 index 0000000000..3091c8e17b --- /dev/null +++ b/build/build_dox.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +BUILD_FOLDER=$TRAVIS_BUILD_DIR + +DOXDIR=~/tgsdox + +mkdir -p $DOXDIR + +if [ "$TRAVIS_PULL_REQUEST" -eq "$false" ] && [ "$TRAVIS_BRANCH" -eq "master" ]; then + PUBLISH_DOX=true +else + PUBLISH_DOX=false +fi + +if [ "$PUBLISH_DOX" = true ] ; then + GITHUB_URL="github.com/$TRAVIS_PULL_REQUEST_SLUG" + echo "Cloning https://git@$GITHUB_URL..." + git clone -b gh-pages --single-branch "https://git@$GITHUB_URL" "$DOXDIR" 2> /dev/null + rm -r "$DOXDIR\*" +fi + +VERSION=cat "$BUILD_FOLDER/build/Version.props" | grep -oPm1 "(?<=)[^<]+" + +echo -e "\nPROJECT_NUMBER = $VERSION\nINPUT = $BUILD_FOLDER\nOUTPUT_DIRECTORY = $DOXDIR\nPROJECT_LOGO = $BUILD_FOLDER/build/tgs.ico\nHAVE_DOT=YES" >> "$BUILD_FOLDER/docs/Doxyfile" + +doxygen "$BUILD_FOLDER/docs/Doxyfile" + +if [ "$PUBLISH_DOX" = true ] ; then + cd $DOXDIR + 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 APPVEYOR CI' > 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 + git add --all + git commit -m "Deploy code docs to GitHub Pages for Travis build $TRAVIS_BUILD_NUMBER" -m "Commit: $TRAVIS_COMMIT" + git push -f "https://$TGS4_TEST_GITHUB_TOKEN@$GITHUB_URL" 2>&1 | out-null + cd "$BUILD_FOLDER" + rm -r "$DOXDIR/.git" +fi + +mv $DOXDIR "$BUILD_FOLDER/tgsdox" diff --git a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs index 739fa4c73e..caec57251d 100644 --- a/src/Tgstation.Server.Host.Watchdog/Watchdog.cs +++ b/src/Tgstation.Server.Host.Watchdog/Watchdog.cs @@ -57,6 +57,7 @@ namespace Tgstation.Server.Host.Watchdog /// #pragma warning disable CA1502 // TODO: Decomplexify + #pragma warning disable CA1506 public async Task RunAsync(bool runConfigure, string[] args, CancellationToken cancellationToken) { logger.LogInformation("Host watchdog starting..."); @@ -78,27 +79,30 @@ namespace Tgstation.Server.Host.Watchdog var rootLocation = Path.GetDirectoryName(executingAssembly.Location); var assemblyStoragePath = Path.Combine(rootLocation, "lib"); // always always next to watchdog -#if DEBUG - Directory.CreateDirectory(assemblyStoragePath); -#endif + var defaultAssemblyPath = Path.GetFullPath(Path.Combine(assemblyStoragePath, "Default")); -#if DEBUG - // just copy the shit where it belongs - Directory.Delete(assemblyStoragePath, true); - Directory.CreateDirectory(defaultAssemblyPath); - var sourcePath = "../../../../Tgstation.Server.Host/bin/Debug/netcoreapp3.1"; - foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories)) - Directory.CreateDirectory(dirPath.Replace(sourcePath, defaultAssemblyPath)); + if (Debugger.IsAttached) + { + // VS special tactics + // just copy the shit where it belongs + Directory.Delete(assemblyStoragePath, true); + Directory.CreateDirectory(defaultAssemblyPath); - foreach (string newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories)) - File.Copy(newPath, newPath.Replace(sourcePath, defaultAssemblyPath), true); + var sourcePath = "../../../../Tgstation.Server.Host/bin/Debug/netcoreapp3.1"; + foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories)) + Directory.CreateDirectory(dirPath.Replace(sourcePath, defaultAssemblyPath)); - const string AppSettingsJson = "appsettings.json"; - var rootJson = Path.Combine(rootLocation, AppSettingsJson); - File.Delete(rootJson); - File.Move(Path.Combine(defaultAssemblyPath, AppSettingsJson), rootJson); -#endif + foreach (string newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories)) + File.Copy(newPath, newPath.Replace(sourcePath, defaultAssemblyPath), true); + + const string AppSettingsJson = "appsettings.json"; + var rootJson = Path.Combine(rootLocation, AppSettingsJson); + File.Delete(rootJson); + File.Move(Path.Combine(defaultAssemblyPath, AppSettingsJson), rootJson); + } + else + Directory.CreateDirectory(assemblyStoragePath); var assemblyName = String.Join(".", nameof(Tgstation), nameof(Server), nameof(Host), "dll"); var assemblyPath = Path.Combine(defaultAssemblyPath, assemblyName); @@ -309,5 +313,6 @@ namespace Tgstation.Server.Host.Watchdog } } #pragma warning restore CA1502 + #pragma warning restore CA1506 } } diff --git a/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs b/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs index c118826332..2e6a5d1326 100644 --- a/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs +++ b/src/Tgstation.Server.Host/Extensions/ServiceCollectionExtensions.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging; using Serilog; using Serilog.Configuration; using System; +using System.Diagnostics; using System.Globalization; using Tgstation.Server.Host.Configuration; @@ -76,9 +77,8 @@ namespace Tgstation.Server.Host.Extensions builder.AddSerilog(configuration.CreateLogger(), true); -#if DEBUG - builder.AddDebug(); -#endif + if (Debugger.IsAttached) + builder.AddDebug(); }); } } diff --git a/src/Tgstation.Server.Host/Setup/SetupWizard.cs b/src/Tgstation.Server.Host/Setup/SetupWizard.cs index 35b3bdca0e..3e5f78bb8e 100644 --- a/src/Tgstation.Server.Host/Setup/SetupWizard.cs +++ b/src/Tgstation.Server.Host/Setup/SetupWizard.cs @@ -279,7 +279,6 @@ namespace Tgstation.Server.Host.Setup /// A resulting in the input . async Task PromptDatabaseType(CancellationToken cancellationToken) { -#if !DEBUG await console.WriteAsync(String.Empty, true, cancellationToken).ConfigureAwait(false); await console.WriteAsync( "NOTE: It is HIGHLY reccommended that TGS runs on a complete relational database, specfically *NOT* Sqlite.", @@ -304,7 +303,6 @@ namespace Tgstation.Server.Host.Setup await console.WriteAsync(String.Empty, true, cancellationToken).ConfigureAwait(false); await asyncDelayer.Delay(TimeSpan.FromSeconds(3), cancellationToken).ConfigureAwait(false); -#endif await console.WriteAsync("What SQL database type will you be using?", true, cancellationToken).ConfigureAwait(false); do diff --git a/tests/Tgstation.Server.Tests/IntegrationTest.cs b/tests/Tgstation.Server.Tests/IntegrationTest.cs index 5ce60d7749..060f70d322 100644 --- a/tests/Tgstation.Server.Tests/IntegrationTest.cs +++ b/tests/Tgstation.Server.Tests/IntegrationTest.cs @@ -25,59 +25,6 @@ namespace Tgstation.Server.Tests { readonly IServerClientFactory clientFactory = new ServerClientFactory(new ProductHeaderValue(Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString())); - static string RequireDiscordToken() - { - var discordToken = Environment.GetEnvironmentVariable("TGS4_TEST_DISCORD_TOKEN"); - if (String.IsNullOrWhiteSpace(discordToken)) - Assert.Inconclusive("The TGS4_TEST_DISCORD_TOKEN environment variable must be set to run this test!"); - - return discordToken; - } - - [TestMethod] - public async Task TestAutomaticDiscordReconnection() - { - var discordToken = RequireDiscordToken(); - - using var discordProvider = new DiscordProvider(Mock.Of>(), discordToken, 1); - var connectResult = await discordProvider.Connect(default).ConfigureAwait(false); - Assert.IsTrue(connectResult, "Failed to connect to discord!"); - Assert.IsTrue(discordProvider.Connected, "Discord provider is not connected!"); - - // Forcefully close the connection under the provider's nose - // This will be detected in real life scenarios - DiscordSocketClient socketClient = typeof(DiscordProvider) - .GetField("client", BindingFlags.Instance | BindingFlags.NonPublic) - ?.GetValue(discordProvider) - as DiscordSocketClient; - Assert.IsNotNull(socketClient, "Reflection unable to read discord socket client!"); - - await socketClient.LogoutAsync().ConfigureAwait(false); - - Assert.IsFalse(discordProvider.Connected, "Discord provider is still connected!"); - - try - { - using CancellationTokenSource cts = new CancellationTokenSource(TimeSpan.FromSeconds(70)); - do - { - var message = await discordProvider.NextMessage(cts.Token).ConfigureAwait(false); - if (message == null) - break; - } - while (true); - - // Prevents a deadlock coming from having the NextMessage continuation call Dispose - await Task.Yield(); - } - catch (OperationCanceledException) - { - Assert.Fail("Failed to reconnect within the time period!"); - } - - Assert.IsTrue(discordProvider.Connected, "Discord provider not connected!"); - } - [TestMethod] public async Task TestServerUpdate() { @@ -153,7 +100,6 @@ namespace Tgstation.Server.Tests [TestMethod] public async Task TestFullStandardOperation() { - RequireDiscordToken(); using var server = new TestingServer(clientFactory); using var serverCts = new CancellationTokenSource(); var cancellationToken = serverCts.Token;