diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index b0359eb43af..22f1fde43ea 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -288,6 +288,7 @@ ./services/continuous-integration/hail.nix ./services/continuous-integration/hercules-ci-agent/default.nix ./services/continuous-integration/hydra/default.nix + ./services/continuous-integration/github-runner.nix ./services/continuous-integration/gitlab-runner.nix ./services/continuous-integration/gocd-agent/default.nix ./services/continuous-integration/gocd-server/default.nix diff --git a/nixos/modules/services/continuous-integration/github-runner.nix b/nixos/modules/services/continuous-integration/github-runner.nix new file mode 100644 index 00000000000..9627b723f8f --- /dev/null +++ b/nixos/modules/services/continuous-integration/github-runner.nix @@ -0,0 +1,299 @@ +{ config, pkgs, lib, ... }: +with lib; +let + cfg = config.services.github-runner; + svcName = "github-runner"; + systemdDir = "${svcName}/${cfg.name}"; + # %t: Runtime directory root (usually /run); see systemd.unit(5) + runtimeDir = "%t/${systemdDir}"; + # %S: State directory root (usually /var/lib); see systemd.unit(5) + stateDir = "%S/${systemdDir}"; + # %L: Log directory root (usually /var/log); see systemd.unit(5) + logsDir = "%L/${systemdDir}"; +in +{ + options.services.github-runner = { + enable = mkOption { + default = false; + example = true; + description = '' + Whether to enable GitHub Actions runner. + + Note: GitHub recommends using self-hosted runners with private repositories only. Learn more here: + About self-hosted runners. + ''; + type = lib.types.bool; + }; + + url = mkOption { + type = types.str; + description = '' + Repository to add the runner to. + + Changing this option triggers a new runner registration. + ''; + example = "https://github.com/nixos/nixpkgs"; + }; + + tokenFile = mkOption { + type = types.path; + description = '' + The full path to a file which contains the runner registration token. + The file should contain exactly one line with the token without any newline. + The token can be used to re-register a runner of the same name but is time-limited. + + Changing this option or the file's content triggers a new runner registration. + ''; + example = "/run/secrets/github-runner/nixos.token"; + }; + + name = mkOption { + # Same pattern as for `networking.hostName` + type = types.strMatching "^$|^[[:alnum:]]([[:alnum:]_-]{0,61}[[:alnum:]])?$"; + description = '' + Name of the runner to configure. Defaults to the hostname. + + Changing this option triggers a new runner registration. + ''; + example = "nixos"; + default = config.networking.hostName; + }; + + runnerGroup = mkOption { + type = types.nullOr types.str; + description = '' + Name of the runner group to add this runner to (defaults to the default runner group). + + Changing this option triggers a new runner registration. + ''; + default = null; + }; + + extraLabels = mkOption { + type = types.listOf types.str; + description = '' + Extra labels in addition to the default (["self-hosted", "Linux", "X64"]). + + Changing this option triggers a new runner registration. + ''; + example = literalExample ''[ "nixos" ]''; + default = [ ]; + }; + + replace = mkOption { + type = types.bool; + description = '' + Replace any existing runner with the same name. + + Without this flag, registering a new runner with the same name fails. + ''; + default = false; + }; + + extraPackages = mkOption { + type = types.listOf types.package; + description = '' + Extra packages to add to PATH of the service to make them available to workflows. + ''; + default = [ ]; + }; + }; + + config = mkIf cfg.enable { + warnings = optionals (isStorePath cfg.tokenFile) [ + '' + `services.github-runner.tokenFile` points to the Nix store and, therefore, is world-readable. + Consider using a path outside of the Nix store to keep the token private. + '' + ]; + + systemd.services.${svcName} = { + description = "GitHub Actions runner"; + + wantedBy = [ "multi-user.target" ]; + wants = [ "network-online.target" ]; + after = [ "network.target" "network-online.target" ]; + + environment = { + HOME = runtimeDir; + RUNNER_ROOT = runtimeDir; + }; + + path = (with pkgs; [ + bash + coreutils + git + gnutar + gzip + ]) ++ [ + config.nix.package + ] ++ cfg.extraPackages; + + serviceConfig = rec { + ExecStart = "${pkgs.github-runner}/bin/runsvc.sh"; + + # Does the following, sequentially: + # - Copy the current and the previous `tokenFile` to the $RUNTIME_DIRECTORY + # and make it accessible to the service user to allow for a content + # comparison. + # - If the module configuration or the token has changed, clear the state directory. + # - Configure the runner. + # - Copy the configured `tokenFile` to the $STATE_DIRECTORY and make it + # inaccessible to the service user. + # - Set up the directory structure by creating the necessary symlinks. + ExecStartPre = + let + # Wrapper script which expects the full path of the state, runtime and logs + # directory as arguments. Overrides the respective systemd variables to provide + # unambiguous directory names. This becomes relevant, for example, if the + # caller overrides any of the StateDirectory=, RuntimeDirectory= or LogDirectory= + # to contain more than one directory. This causes systemd to set the respective + # environment variables with the path of all of the given directories, separated + # by a colon. + writeScript = name: lines: pkgs.writeShellScript "${svcName}-${name}.sh" '' + set -euo pipefail + + STATE_DIRECTORY="$1" + RUNTIME_DIRECTORY="$2" + LOGS_DIRECTORY="$3" + + ${lines} + ''; + currentConfigPath = "$STATE_DIRECTORY/.nixos-current-config.json"; + runnerRegistrationConfig = getAttrs [ "name" "tokenFile" "url" "runnerGroup" "extraLabels" ] cfg; + newConfigPath = builtins.toFile "${svcName}-config.json" (builtins.toJSON runnerRegistrationConfig); + currentConfigTokenFilename = ".current-token"; + newConfigTokenFilename = ".new-token"; + runnerCredFiles = [ + ".credentials" + ".credentials_rsaparams" + ".runner" + ]; + ownConfigTokens = writeScript "own-config-tokens" '' + # Copy current and new token file to runtime dir and make it accessible to the service user + cp ${escapeShellArg cfg.tokenFile} "$RUNTIME_DIRECTORY/${newConfigTokenFilename}" + chmod 600 "$RUNTIME_DIRECTORY/${newConfigTokenFilename}" + chown "$USER" "$RUNTIME_DIRECTORY/${newConfigTokenFilename}" + + if [[ -e "$STATE_DIRECTORY/${currentConfigTokenFilename}" ]]; then + cp "$STATE_DIRECTORY/${currentConfigTokenFilename}" "$RUNTIME_DIRECTORY/${currentConfigTokenFilename}" + chmod 600 "$RUNTIME_DIRECTORY/${currentConfigTokenFilename}" + chown "$USER" "$RUNTIME_DIRECTORY/${currentConfigTokenFilename}" + fi + ''; + disownConfigTokens = writeScript "disown-config-tokens" '' + # Make the token inaccessible to the runner service user + chmod 600 "$STATE_DIRECTORY/${currentConfigTokenFilename}" + chown root:root "$STATE_DIRECTORY/${currentConfigTokenFilename}" + ''; + unconfigureRunner = writeScript "unconfigure" '' + differs= + # Set `differs = 1` if current and new runner config differ or if `currentConfigPath` does not exist + ${pkgs.diffutils}/bin/diff -q '${newConfigPath}' "${currentConfigPath}" >/dev/null 2>&1 || differs=1 + # Also trigger a registration if the token content changed + ${pkgs.diffutils}/bin/diff -q \ + "$RUNTIME_DIRECTORY"/{${currentConfigTokenFilename},${newConfigTokenFilename}} \ + >/dev/null 2>&1 || differs=1 + + if [[ -n "$differs" ]]; then + echo "Config has changed, removing old runner state." + echo "The old runner will still appear in the GitHub Actions UI." \ + "You have to remove it manually." + find "$STATE_DIRECTORY/" -mindepth 1 -delete + fi + ''; + configureRunner = writeScript "configure" '' + empty=$(ls -A "$STATE_DIRECTORY") + if [[ -z "$empty" ]]; then + echo "Configuring GitHub Actions Runner" + token=$(< "$RUNTIME_DIRECTORY"/${newConfigTokenFilename}) + RUNNER_ROOT="$STATE_DIRECTORY" ${pkgs.github-runner}/bin/config.sh \ + --unattended \ + --work "$RUNTIME_DIRECTORY" \ + --url ${escapeShellArg cfg.url} \ + --token "$token" \ + --labels ${escapeShellArg (concatStringsSep "," cfg.extraLabels)} \ + --name ${escapeShellArg cfg.name} \ + ${optionalString cfg.replace "--replace"} \ + ${optionalString (cfg.runnerGroup != null) "--runnergroup ${escapeShellArg cfg.runnerGroup}"} + + # Move the automatically created _diag dir to the logs dir + mkdir -p "$STATE_DIRECTORY/_diag" + cp -r "$STATE_DIRECTORY/_diag/." "$LOGS_DIRECTORY/" + rm -rf "$STATE_DIRECTORY/_diag/" + + # Cleanup token from config + rm -f "$RUNTIME_DIRECTORY"/${currentConfigTokenFilename} + mv "$RUNTIME_DIRECTORY"/${newConfigTokenFilename} "$STATE_DIRECTORY/${currentConfigTokenFilename}" + + # Symlink to new config + ln -s '${newConfigPath}' "${currentConfigPath}" + fi + ''; + setupRuntimeDir = writeScript "setup-runtime-dirs" '' + # Link _diag dir + ln -s "$LOGS_DIRECTORY" "$RUNTIME_DIRECTORY/_diag" + + # Link the runner credentials to the runtime dir + ln -s "$STATE_DIRECTORY"/{${lib.concatStringsSep "," runnerCredFiles}} "$RUNTIME_DIRECTORY/" + ''; + in + map (x: "${x} ${escapeShellArgs [ stateDir runtimeDir logsDir ]}") [ + "+${ownConfigTokens}" # runs as root + unconfigureRunner + configureRunner + "+${disownConfigTokens}" # runs as root + setupRuntimeDir + ]; + + # Contains _diag + LogsDirectory = [ systemdDir ]; + # Default RUNNER_ROOT which contains ephemeral Runner data + RuntimeDirectory = [ systemdDir ]; + # Home of persistent runner data, e.g., credentials + StateDirectory = [ systemdDir ]; + StateDirectoryMode = "0700"; + WorkingDirectory = runtimeDir; + + # By default, use a dynamically allocated user + DynamicUser = true; + + KillMode = "process"; + KillSignal = "SIGTERM"; + + # Hardening (may overlap with DynamicUser=) + # The following options are only for optimizing: + # systemd-analyze security github-runner + AmbientCapabilities = ""; + CapabilityBoundingSet = ""; + # ProtectClock= adds DeviceAllow=char-rtc r + DeviceAllow = ""; + LockPersonality = true; + NoNewPrivileges = true; + PrivateDevices = true; + PrivateMounts = true; + PrivateTmp = true; + PrivateUsers = true; + ProtectClock = true; + ProtectControlGroups = true; + ProtectHome = true; + ProtectHostname = true; + ProtectKernelLogs = true; + ProtectKernelModules = true; + ProtectKernelTunables = true; + ProtectSystem = "strict"; + RemoveIPC = true; + RestrictNamespaces = true; + RestrictRealtime = true; + RestrictSUIDSGID = true; + UMask = "0066"; + + # Needs network access + PrivateNetwork = false; + # Cannot be true due to Node + MemoryDenyWriteExecute = false; + }; + }; + }; +} diff --git a/pkgs/development/tools/continuous-integration/github-runner/default.nix b/pkgs/development/tools/continuous-integration/github-runner/default.nix new file mode 100644 index 00000000000..27627ff3519 --- /dev/null +++ b/pkgs/development/tools/continuous-integration/github-runner/default.nix @@ -0,0 +1,265 @@ +{ autoPatchelfHook +, coreutils +, curl +, dotnetCorePackages +, dotnetPackages +, fetchFromGitHub +, fetchurl +, git +, glibc +, icu +, kerberos +, lib +, linkFarm +, lttng-ust +, makeWrapper +, nodejs-12_x +, openssl +, stdenv +, zlib +}: +let + pname = "github-actions-runner"; + version = "2.277.1"; + + deps = (import ./deps.nix { inherit fetchurl; }); + nugetPackages = map + (x: { + name = "${x.name}.nupkg"; + path = "${x}"; + }) + deps; + nugetSource = linkFarm "${pname}-${version}-packages" nugetPackages; + + dotnetSdk = dotnetCorePackages.sdk_3_1; + runtimeId = "linux-x64"; + + disabledTest = [ + # Self-updating is patched out, hence this test will fail + "FullyQualifiedName!=GitHub.Runner.Common.Tests.Listener.RunnerL0.TestRunOnceHandleUpdateMessage" + ] ++ map + # Online tests + (x: "FullyQualifiedName!=GitHub.Runner.Common.Tests.Worker.ActionManagerL0.PrepareActions_${x}") + [ + "DownloadActionFromGraph" + "DownloadActionFromGraph_Legacy" + "NotPullOrBuildImagesMultipleTimes" + "NotPullOrBuildImagesMultipleTimes_Legacy" + "RepositoryActionWithActionYamlFile_DockerHubImage" + "RepositoryActionWithActionYamlFile_DockerHubImage_Legacy" + "RepositoryActionWithActionfileAndDockerfile" + "RepositoryActionWithActionfileAndDockerfile_Legacy" + "RepositoryActionWithActionfile_DockerHubImage" + "RepositoryActionWithActionfile_DockerHubImage_Legacy" + "RepositoryActionWithActionfile_Dockerfile" + "RepositoryActionWithActionfile_Dockerfile_Legacy" + "RepositoryActionWithActionfile_DockerfileRelativePath" + "RepositoryActionWithActionfile_DockerfileRelativePath_Legacy" + "RepositoryActionWithActionfile_Node" + "RepositoryActionWithActionfile_Node_Legacy" + "RepositoryActionWithDockerfile" + "RepositoryActionWithDockerfile_Legacy" + "RepositoryActionWithDockerfileInRelativePath" + "RepositoryActionWithDockerfileInRelativePath_Legacy" + "RepositoryActionWithDockerfilePrepareActions_Repository" + "RepositoryActionWithInvalidWrapperActionfile_Node" + "RepositoryActionWithInvalidWrapperActionfile_Node_Legacy" + "RepositoryActionWithWrapperActionfile_PreSteps" + "RepositoryActionWithWrapperActionfile_PreSteps_Legacy" + ] ++ map + (x: "FullyQualifiedName!=GitHub.Runner.Common.Tests.DotnetsdkDownloadScriptL0.${x}") + [ + "EnsureDotnetsdkBashDownloadScriptUpToDate" + "EnsureDotnetsdkPowershellDownloadScriptUpToDate" + ]; + testFilterXml = lib.concatStringsSep "&" disabledTest; +in +stdenv.mkDerivation rec { + inherit pname version; + + src = fetchFromGitHub { + owner = "actions"; + repo = "runner"; + rev = "183a3dd9a0d4d51feddc5fe9fa6c3b5f8b08343d"; # v${version} + sha256 = "sha256-fQH4QwdR8E76ckUjMCaKOsDjNoVBIWAw2YcFRrVucX8="; + }; + + nativeBuildInputs = [ + dotnetSdk + dotnetPackages.Nuget + makeWrapper + autoPatchelfHook + ]; + + buildInputs = [ + curl # libcurl.so.4 + kerberos # libgssapi_krb5.so.2 + lttng-ust # liblttng-ust.so.0 + stdenv.cc.cc.lib # libstdc++.so.6 + zlib # libz.so.1 + icu + ]; + + patches = [ + # Don't run Git, no restore on build/test + ./patches/dir-proj.patch + # Replace some paths that originally point to Nix's read-only store + ./patches/host-context-dirs.patch + # Use GetDirectory() to obtain "diag" dir + ./patches/use-get-directory-for-diag.patch + # Don't try to install systemd service + ./patches/dont-install-systemd-service.patch + # Don't try to self-update runner (cannot be disabled, see https://github.com/actions/runner/issues/485) + ./patches/ignore-self-update.patch + ]; + + postPatch = '' + # Relax the version requirement + substituteInPlace src/global.json \ + --replace '3.1.302' '${dotnetSdk.version}' + + # Disable specific tests + substituteInPlace src/dir.proj \ + --replace 'dotnet test Test/Test.csproj' \ + "dotnet test Test/Test.csproj --filter '${testFilterXml}'" + + # Fix FHS path + substituteInPlace src/Test/L0/Util/IOUtilL0.cs \ + --replace '/bin/ln' '${coreutils}/bin/ln' + ''; + + configurePhase = '' + runHook preConfigure + + # Set up Nuget dependencies + export HOME=$(mktemp -d) + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + export DOTNET_NOLOGO=1 + + # Never use nuget.org + nuget sources Disable -Name "nuget.org" + + # Restore the dependencies + dotnet restore src/ActionsRunner.sln \ + --runtime "${runtimeId}" \ + --source "${nugetSource}" + + runHook postConfigure + ''; + + postConfigure = '' + # `crossgen` dependency is called during build + patchelf \ + --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + --set-rpath "${lib.makeLibraryPath [ stdenv.cc.cc.lib ]}" \ + $HOME/.nuget/packages/microsoft.netcore.app.runtime.${runtimeId}/*/tools/crossgen + ''; + + buildPhase = '' + runHook preBuild + + dotnet msbuild \ + -t:Build \ + -p:PackageRuntime="${runtimeId}" \ + -p:BUILDCONFIG="Release" \ + -p:RunnerVersion="${version}" \ + -p:GitInfoCommitHash="${src.rev}" \ + src/dir.proj + + runHook postBuild + ''; + + doCheck = true; + + checkInputs = [ git ]; + + checkPhase = '' + runHook preCheck + + mkdir -p _layout/externals + ln -s ${nodejs-12_x} _layout/externals/node12 + + # BUILDCONFIG needs to be "Debug" + dotnet msbuild \ + -t:test \ + -p:PackageRuntime="${runtimeId}" \ + -p:BUILDCONFIG="Debug" \ + -p:RunnerVersion="${version}" \ + -p:GitInfoCommitHash="${src.rev}" \ + src/dir.proj + + runHook postCheck + ''; + + installPhase = '' + runHook preInstall + + # Copy the built binaries to lib/ instead of bin/ as they + # have to be wrapped in the fixup phase to work + mkdir -p $out/lib + cp -r _layout/bin/. $out/lib/ + + # Delete debugging files + find "$out/lib" -type f -name '*.pdb' -delete + + # Install the helper scripts to bin/ to resemble the upstream package + mkdir -p $out/bin + install -m755 src/Misc/layoutbin/runsvc.sh $out/bin/ + install -m755 src/Misc/layoutbin/RunnerService.js $out/lib/ + install -m755 src/Misc/layoutroot/run.sh $out/lib/ + install -m755 src/Misc/layoutroot/config.sh $out/lib/ + install -m755 src/Misc/layoutroot/env.sh $out/lib/ + + # Rewrite reference in helper scripts from bin/ to lib/ + substituteInPlace $out/lib/run.sh --replace '"$DIR"/bin' "$out/lib" + substituteInPlace $out/lib/config.sh --replace './bin' "$out/lib" + + # Make paths absolute + substituteInPlace $out/bin/runsvc.sh \ + --replace './externals' "$out/externals" \ + --replace './bin' "$out/lib" + + # The upstream package includes Node 12 and expects it at the path + # externals/node12. As opposed to the official releases, we don't + # link the Alpine Node flavor. + mkdir -p $out/externals + ln -s ${nodejs-12_x} $out/externals/node12 + + runHook postInstall + ''; + + # Stripping breaks the binaries + dontStrip = true; + + postFixup = '' + fix_rpath() { + patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $out/lib/$1 + } + + wrap() { + makeWrapper $out/lib/$1 $out/bin/$1 \ + --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath (buildInputs ++ [ openssl ])} \ + ''${@:2} + } + + fix_rpath Runner.Listener + fix_rpath Runner.PluginHost + fix_rpath Runner.Worker + + wrap Runner.Listener + wrap Runner.PluginHost + wrap Runner.Worker + wrap run.sh + wrap env.sh + + wrap config.sh --prefix PATH : ${lib.makeBinPath [ glibc.bin ]} + ''; + + meta = with lib; { + description = "Self-hosted runner for GitHub Actions"; + homepage = "https://github.com/actions/runner"; + license = licenses.mit; + maintainers = with maintainers; [ veehaitch ]; + platforms = [ "x86_64-linux" ]; + }; +} diff --git a/pkgs/development/tools/continuous-integration/github-runner/deps.nix b/pkgs/development/tools/continuous-integration/github-runner/deps.nix new file mode 100644 index 00000000000..a556a83aa49 --- /dev/null +++ b/pkgs/development/tools/continuous-integration/github-runner/deps.nix @@ -0,0 +1,1217 @@ +{ fetchurl }: +let + fetchNuGet = { name, version, sha256 }: fetchurl { + inherit sha256; + name = "${name}.${version}"; + url = "https://www.nuget.org/api/v2/package/${name}/${version}"; + }; +in +[ + + (fetchNuGet { + name = "Castle.Core"; + version = "4.4.0"; + sha256 = "0rpcbmyhckvlvp6vbzpj03c1gqz56ixc6f15vgmxmyf1g40c24pf"; + }) + + (fetchNuGet { + name = "Microsoft.AspNetCore.App.Runtime.linux-x64"; + version = "3.1.8"; + sha256 = "140zr3nwkmf6xc52gq4iz6ycyh95fxy0jpgn637pkd9z423z8135"; + }) + + (fetchNuGet { + name = "Microsoft.AspNet.WebApi.Client"; + version = "5.2.4"; + sha256 = "00fkczf69z2rwarcd8kjjdp47517a0ca6lggn72qbilsp03a5scj"; + }) + + (fetchNuGet { + name = "Microsoft.IdentityModel.Logging"; + version = "5.2.1"; + sha256 = "1gpka9jm2gl6f07pcwzwvaxw9xq1a19i9fskn0qs921c5grhlp3g"; + }) + + (fetchNuGet { + name = "Microsoft.IdentityModel.Tokens"; + version = "5.2.1"; + sha256 = "03v6145vr1winq8xxfikydicds4f10qmy1ybyz2gfimnzzx51w00"; + }) + + (fetchNuGet { + name = "Microsoft.NetCore.App.Runtime.linux-x64"; + version = "3.1.8"; + sha256 = "1bv9n9wzsqf9g8h6z10p61xkcx8ad4nnip83qv8yyfvhr4kdmbsa"; + }) + + (fetchNuGet { + name = "Microsoft.NETCore.Platforms"; + version = "1.0.1"; + sha256 = "01al6cfxp68dscl15z7rxfw9zvhm64dncsw09a1vmdkacsa2v6lr"; + }) + + (fetchNuGet { + name = "Microsoft.NETCore.Platforms"; + version = "1.1.0"; + sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; + }) + + (fetchNuGet { + name = "Microsoft.NETCore.Platforms"; + version = "2.0.0"; + sha256 = "1fk2fk2639i7nzy58m9dvpdnzql4vb8yl8vr19r2fp8lmj9w2jr0"; + }) + + (fetchNuGet { + name = "Microsoft.NETCore.Targets"; + version = "1.1.0"; + sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; + }) + + (fetchNuGet { + name = "Microsoft.NET.Test.Sdk"; + version = "15.0.0"; + sha256 = "1ca9v53dphsgk22spilfwq1hjzp2sgrrj85v7hd7wfc6gjh31mb5"; + }) + + (fetchNuGet { + name = "Microsoft.TestPlatform.ObjectModel"; + version = "15.0.0"; + sha256 = "0xqssz2y8jzqph6kv1fzy00wzjcnc2whhlf8jsszgpn69ld7f1rb"; + }) + + (fetchNuGet { + name = "Microsoft.TestPlatform.TestHost"; + version = "15.0.0"; + sha256 = "1mi59wxwdqyzmkan0v9qrar96f50xs6k38xzv3l6ky859si2qk4b"; + }) + + (fetchNuGet { + name = "Microsoft.Win32.Primitives"; + version = "4.0.1"; + sha256 = "1n8ap0cmljbqskxpf8fjzn7kh1vvlndsa75k01qig26mbw97k2q7"; + }) + + (fetchNuGet { + name = "Microsoft.Win32.Primitives"; + version = "4.3.0"; + sha256 = "0j0c1wj4ndj21zsgivsc24whiya605603kxrbiw6wkfdync464wq"; + }) + + (fetchNuGet { + name = "Microsoft.Win32.Registry"; + version = "4.0.0"; + sha256 = "1spf4m9pikkc19544p29a47qnhcd885klncahz133hbnyqbkmz9k"; + }) + + (fetchNuGet { + name = "Microsoft.Win32.Registry"; + version = "4.4.0"; + sha256 = "088j2anh1rnkxdcycw5kgp97ahk7cj741y6kask84880835arsb6"; + }) + + (fetchNuGet { + name = "Minimatch"; + version = "2.0.0"; + sha256 = "1k84q1bz1qq2nh35nip8vmi65wixsh5y7piln5b4n172xzhfqvx0"; + }) + + (fetchNuGet { + name = "Moq"; + version = "4.11.0"; + sha256 = "08bnk80scjjqnkdbjam8grcqrw2rvj9z7556hiznac7in3fcp77w"; + }) + + (fetchNuGet { + name = "NETStandard.Library"; + version = "1.6.0"; + sha256 = "0nmmv4yw7gw04ik8ialj3ak0j6pxa9spih67hnn1h2c38ba8h58k"; + }) + + (fetchNuGet { + name = "NETStandard.Library"; + version = "1.6.1"; + sha256 = "1z70wvsx2d847a2cjfii7b83pjfs34q05gb037fdjikv5kbagml8"; + }) + + (fetchNuGet { + name = "Newtonsoft.Json"; + version = "10.0.1"; + sha256 = "15ncqic3p2rzs8q8ppi0irl2miq75kilw4lh8yfgjq96id0ds3hv"; + }) + + (fetchNuGet { + name = "Newtonsoft.Json"; + version = "11.0.2"; + sha256 = "1784xi44f4k8v1fr696hsccmwpy94bz7kixxqlri98zhcxn406b2"; + }) + + (fetchNuGet { + name = "Newtonsoft.Json"; + version = "9.0.1"; + sha256 = "0mcy0i7pnfpqm4pcaiyzzji4g0c8i3a5gjz28rrr28110np8304r"; + }) + + (fetchNuGet { + name = "Newtonsoft.Json.Bson"; + version = "1.0.1"; + sha256 = "1r1hvj5gjl466bya2bfl5aaj8rbwyf5x1msg710wf3k2llbci1xa"; + }) + + (fetchNuGet { + name = "runtime.any.System.Collections"; + version = "4.3.0"; + sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0"; + }) + + (fetchNuGet { + name = "runtime.any.System.Diagnostics.Tools"; + version = "4.3.0"; + sha256 = "1wl76vk12zhdh66vmagni66h5xbhgqq7zkdpgw21jhxhvlbcl8pk"; + }) + + (fetchNuGet { + name = "runtime.any.System.Diagnostics.Tracing"; + version = "4.3.0"; + sha256 = "00j6nv2xgmd3bi347k00m7wr542wjlig53rmj28pmw7ddcn97jbn"; + }) + + (fetchNuGet { + name = "runtime.any.System.Globalization"; + version = "4.3.0"; + sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x"; + }) + + (fetchNuGet { + name = "runtime.any.System.Globalization.Calendars"; + version = "4.3.0"; + sha256 = "1ghhhk5psqxcg6w88sxkqrc35bxcz27zbqm2y5p5298pv3v7g201"; + }) + + (fetchNuGet { + name = "runtime.any.System.IO"; + version = "4.3.0"; + sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x"; + }) + + (fetchNuGet { + name = "runtime.any.System.Reflection"; + version = "4.3.0"; + sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly"; + }) + + (fetchNuGet { + name = "runtime.any.System.Reflection.Extensions"; + version = "4.3.0"; + sha256 = "0zyri97dfc5vyaz9ba65hjj1zbcrzaffhsdlpxc9bh09wy22fq33"; + }) + + (fetchNuGet { + name = "runtime.any.System.Reflection.Primitives"; + version = "4.3.0"; + sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf"; + }) + + (fetchNuGet { + name = "runtime.any.System.Resources.ResourceManager"; + version = "4.3.0"; + sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl"; + }) + + (fetchNuGet { + name = "runtime.any.System.Runtime"; + version = "4.3.0"; + sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b"; + }) + + (fetchNuGet { + name = "runtime.any.System.Runtime.Handles"; + version = "4.3.0"; + sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x"; + }) + + (fetchNuGet { + name = "runtime.any.System.Runtime.InteropServices"; + version = "4.3.0"; + sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19"; + }) + + (fetchNuGet { + name = "runtime.any.System.Text.Encoding"; + version = "4.3.0"; + sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3"; + }) + + (fetchNuGet { + name = "runtime.any.System.Text.Encoding.Extensions"; + version = "4.3.0"; + sha256 = "0lqhgqi0i8194ryqq6v2gqx0fb86db2gqknbm0aq31wb378j7ip8"; + }) + + (fetchNuGet { + name = "runtime.any.System.Threading.Tasks"; + version = "4.3.0"; + sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va"; + }) + + (fetchNuGet { + name = "runtime.any.System.Threading.Timer"; + version = "4.3.0"; + sha256 = "0aw4phrhwqz9m61r79vyfl5la64bjxj8l34qnrcwb28v49fg2086"; + }) + + (fetchNuGet { + name = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "16rnxzpk5dpbbl1x354yrlsbvwylrq456xzpsha1n9y3glnhyx9d"; + }) + + (fetchNuGet { + name = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "0hkg03sgm2wyq8nqk6dbm9jh5vcq57ry42lkqdmfklrw89lsmr59"; + }) + + (fetchNuGet { + name = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "0c2p354hjx58xhhz7wv6div8xpi90sc6ibdm40qin21bvi7ymcaa"; + }) + + (fetchNuGet { + name = "runtime.native.System"; + version = "4.0.0"; + sha256 = "1ppk69xk59ggacj9n7g6fyxvzmk1g5p4fkijm0d7xqfkig98qrkf"; + }) + + (fetchNuGet { + name = "runtime.native.System"; + version = "4.3.0"; + sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4"; + }) + + (fetchNuGet { + name = "runtime.native.System.IO.Compression"; + version = "4.3.0"; + sha256 = "1vvivbqsk6y4hzcid27pqpm5bsi6sc50hvqwbcx8aap5ifrxfs8d"; + }) + + (fetchNuGet { + name = "runtime.native.System.Net.Http"; + version = "4.3.0"; + sha256 = "1n6rgz5132lcibbch1qlf0g9jk60r0kqv087hxc0lisy50zpm7kk"; + }) + + (fetchNuGet { + name = "runtime.native.System.Security.Cryptography.Apple"; + version = "4.3.0"; + sha256 = "1b61p6gw1m02cc1ry996fl49liiwky6181dzr873g9ds92zl326q"; + }) + + (fetchNuGet { + name = "runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "18pzfdlwsg2nb1jjjjzyb5qlgy6xjxzmhnfaijq5s2jw3cm3ab97"; + }) + + (fetchNuGet { + name = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "0qyynf9nz5i7pc26cwhgi8j62ps27sqmf78ijcfgzab50z9g8ay3"; + }) + + (fetchNuGet { + name = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "1klrs545awhayryma6l7g2pvnp9xy4z0r1i40r80zb45q3i9nbyf"; + }) + + (fetchNuGet { + name = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple"; + version = "4.3.0"; + sha256 = "10yc8jdrwgcl44b4g93f1ds76b176bajd3zqi2faf5rvh1vy9smi"; + }) + + (fetchNuGet { + name = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "0zcxjv5pckplvkg0r6mw3asggm7aqzbdjimhvsasb0cgm59x09l3"; + }) + + (fetchNuGet { + name = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "0vhynn79ih7hw7cwjazn87rm9z9fj0rvxgzlab36jybgcpcgphsn"; + }) + + (fetchNuGet { + name = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "160p68l2c7cqmyqjwxydcvgw7lvl1cr0znkw8fp24d1by9mqc8p3"; + }) + + (fetchNuGet { + name = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "15zrc8fgd8zx28hdghcj5f5i34wf3l6bq5177075m2bc2j34jrqy"; + }) + + (fetchNuGet { + name = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "1p4dgxax6p7rlgj4q73k73rslcnz4wdcv8q2flg1s8ygwcm58ld5"; + }) + + (fetchNuGet { + name = "runtime.unix.Microsoft.Win32.Primitives"; + version = "4.3.0"; + sha256 = "0y61k9zbxhdi0glg154v30kkq7f8646nif8lnnxbvkjpakggd5id"; + }) + + (fetchNuGet { + name = "runtime.unix.System.Console"; + version = "4.3.0"; + sha256 = "1pfpkvc6x2if8zbdzg9rnc5fx51yllprl8zkm5npni2k50lisy80"; + }) + + (fetchNuGet { + name = "runtime.unix.System.Diagnostics.Debug"; + version = "4.3.0"; + sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5"; + }) + + (fetchNuGet { + name = "runtime.unix.System.IO.FileSystem"; + version = "4.3.0"; + sha256 = "14nbkhvs7sji5r1saj2x8daz82rnf9kx28d3v2qss34qbr32dzix"; + }) + + (fetchNuGet { + name = "runtime.unix.System.Net.Primitives"; + version = "4.3.0"; + sha256 = "0bdnglg59pzx9394sy4ic66kmxhqp8q8bvmykdxcbs5mm0ipwwm4"; + }) + + (fetchNuGet { + name = "runtime.unix.System.Net.Sockets"; + version = "4.3.0"; + sha256 = "03npdxzy8gfv035bv1b9rz7c7hv0rxl5904wjz51if491mw0xy12"; + }) + + (fetchNuGet { + name = "runtime.unix.System.Private.Uri"; + version = "4.3.0"; + sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk"; + }) + + (fetchNuGet { + name = "runtime.unix.System.Runtime.Extensions"; + version = "4.3.0"; + sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p"; + }) + + (fetchNuGet { + name = "Sdk"; + version = "1.0.0"; + sha256 = "0425gviagj8xl8mwl4bwn1v98j7407sdk78xgxk37z62vgcgs73w"; + }) + + (fetchNuGet { + name = "System.AppContext"; + version = "4.3.0"; + sha256 = "1649qvy3dar900z3g817h17nl8jp4ka5vcfmsr05kh0fshn7j3ya"; + }) + + (fetchNuGet { + name = "System.Buffers"; + version = "4.3.0"; + sha256 = "0fgns20ispwrfqll4q1zc1waqcmylb3zc50ys9x8zlwxh9pmd9jy"; + }) + + (fetchNuGet { + name = "System.Collections"; + version = "4.0.11"; + sha256 = "1ga40f5lrwldiyw6vy67d0sg7jd7ww6kgwbksm19wrvq9hr0bsm6"; + }) + + (fetchNuGet { + name = "System.Collections"; + version = "4.3.0"; + sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; + }) + + (fetchNuGet { + name = "System.Collections.Concurrent"; + version = "4.3.0"; + sha256 = "0wi10md9aq33jrkh2c24wr2n9hrpyamsdhsxdcnf43b7y86kkii8"; + }) + + (fetchNuGet { + name = "System.Collections.Immutable"; + version = "1.2.0"; + sha256 = "1jm4pc666yiy7af1mcf7766v710gp0h40p228ghj6bavx7xfa38m"; + }) + + (fetchNuGet { + name = "System.Collections.NonGeneric"; + version = "4.3.0"; + sha256 = "07q3k0hf3mrcjzwj8fwk6gv3n51cb513w4mgkfxzm3i37sc9kz7k"; + }) + + (fetchNuGet { + name = "System.Collections.Specialized"; + version = "4.3.0"; + sha256 = "1sdwkma4f6j85m3dpb53v9vcgd0zyc9jb33f8g63byvijcj39n20"; + }) + + (fetchNuGet { + name = "System.ComponentModel"; + version = "4.3.0"; + sha256 = "0986b10ww3nshy30x9sjyzm0jx339dkjxjj3401r3q0f6fx2wkcb"; + }) + + (fetchNuGet { + name = "System.ComponentModel.EventBasedAsync"; + version = "4.0.11"; + sha256 = "07r5i7xwban347nsfw28hhjwpr78ywksjyhywvhj1yr0s7sr00wh"; + }) + + (fetchNuGet { + name = "System.ComponentModel.Primitives"; + version = "4.3.0"; + sha256 = "1svfmcmgs0w0z9xdw2f2ps05rdxmkxxhf0l17xk9l1l8xfahkqr0"; + }) + + (fetchNuGet { + name = "System.ComponentModel.TypeConverter"; + version = "4.1.0"; + sha256 = "178cva9p1cs043h5n2fry5xkzr3wc9n0hwbxa8m3ymld9m6wcv0y"; + }) + + (fetchNuGet { + name = "System.ComponentModel.TypeConverter"; + version = "4.3.0"; + sha256 = "17ng0p7v3nbrg3kycz10aqrrlw4lz9hzhws09pfh8gkwicyy481x"; + }) + + (fetchNuGet { + name = "System.Console"; + version = "4.3.0"; + sha256 = "1flr7a9x920mr5cjsqmsy9wgnv3lvd0h1g521pdr1lkb2qycy7ay"; + }) + + (fetchNuGet { + name = "System.Diagnostics.Debug"; + version = "4.0.11"; + sha256 = "0gmjghrqmlgzxivd2xl50ncbglb7ljzb66rlx8ws6dv8jm0d5siz"; + }) + + (fetchNuGet { + name = "System.Diagnostics.Debug"; + version = "4.3.0"; + sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; + }) + + (fetchNuGet { + name = "System.Diagnostics.DiagnosticSource"; + version = "4.3.0"; + sha256 = "0z6m3pbiy0qw6rn3n209rrzf9x1k4002zh90vwcrsym09ipm2liq"; + }) + + (fetchNuGet { + name = "System.Diagnostics.Process"; + version = "4.1.0"; + sha256 = "061lrcs7xribrmq7kab908lww6kn2xn1w3rdc41q189y0jibl19s"; + }) + + (fetchNuGet { + name = "System.Diagnostics.TextWriterTraceListener"; + version = "4.0.0"; + sha256 = "1xigiwkwyxak0dhm0p8i2zb7a9syly9cdb5s9zkr9rbad4f2fqhs"; + }) + + (fetchNuGet { + name = "System.Diagnostics.Tools"; + version = "4.3.0"; + sha256 = "0in3pic3s2ddyibi8cvgl102zmvp9r9mchh82ns9f0ms4basylw1"; + }) + + (fetchNuGet { + name = "System.Diagnostics.TraceSource"; + version = "4.0.0"; + sha256 = "1mc7r72xznczzf6mz62dm8xhdi14if1h8qgx353xvhz89qyxsa3h"; + }) + + (fetchNuGet { + name = "System.Diagnostics.TraceSource"; + version = "4.3.0"; + sha256 = "1kyw4d7dpjczhw6634nrmg7yyyzq72k75x38y0l0nwhigdlp1766"; + }) + + (fetchNuGet { + name = "System.Diagnostics.Tracing"; + version = "4.1.0"; + sha256 = "1d2r76v1x610x61ahfpigda89gd13qydz6vbwzhpqlyvq8jj6394"; + }) + + (fetchNuGet { + name = "System.Diagnostics.Tracing"; + version = "4.3.0"; + sha256 = "1m3bx6c2s958qligl67q7grkwfz3w53hpy7nc97mh6f7j5k168c4"; + }) + + (fetchNuGet { + name = "System.Dynamic.Runtime"; + version = "4.3.0"; + sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk"; + }) + + (fetchNuGet { + name = "System.Globalization"; + version = "4.0.11"; + sha256 = "070c5jbas2v7smm660zaf1gh0489xanjqymkvafcs4f8cdrs1d5d"; + }) + + (fetchNuGet { + name = "System.Globalization"; + version = "4.3.0"; + sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; + }) + + (fetchNuGet { + name = "System.Globalization.Calendars"; + version = "4.3.0"; + sha256 = "1xwl230bkakzzkrggy1l1lxmm3xlhk4bq2pkv790j5lm8g887lxq"; + }) + + (fetchNuGet { + name = "System.Globalization.Extensions"; + version = "4.3.0"; + sha256 = "02a5zfxavhv3jd437bsncbhd2fp1zv4gxzakp1an9l6kdq1mcqls"; + }) + + (fetchNuGet { + name = "System.IdentityModel.Tokens.Jwt"; + version = "5.2.1"; + sha256 = "08n1z9ngsi26qlhwpjzxafhwl3p279widfci64l2ahxf1gprfqsx"; + }) + + (fetchNuGet { + name = "System.IO"; + version = "4.1.0"; + sha256 = "1g0yb8p11vfd0kbkyzlfsbsp5z44lwsvyc0h3dpw6vqnbi035ajp"; + }) + + (fetchNuGet { + name = "System.IO"; + version = "4.3.0"; + sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; + }) + + (fetchNuGet { + name = "System.IO.Compression"; + version = "4.3.0"; + sha256 = "084zc82yi6yllgda0zkgl2ys48sypiswbiwrv7irb3r0ai1fp4vz"; + }) + + (fetchNuGet { + name = "System.IO.Compression.ZipFile"; + version = "4.3.0"; + sha256 = "1yxy5pq4dnsm9hlkg9ysh5f6bf3fahqqb6p8668ndy5c0lk7w2ar"; + }) + + (fetchNuGet { + name = "System.IO.FileSystem"; + version = "4.0.1"; + sha256 = "0kgfpw6w4djqra3w5crrg8xivbanh1w9dh3qapb28q060wb9flp1"; + }) + + (fetchNuGet { + name = "System.IO.FileSystem"; + version = "4.3.0"; + sha256 = "0z2dfrbra9i6y16mm9v1v6k47f0fm617vlb7s5iybjjsz6g1ilmw"; + }) + + (fetchNuGet { + name = "System.IO.FileSystem.AccessControl"; + version = "4.4.0"; + sha256 = "11sna2bv5ai4sivrs7g2gp7g0yjp02s0kasl01j3fa1cvnwwvgkv"; + }) + + (fetchNuGet { + name = "System.IO.FileSystem.Primitives"; + version = "4.0.1"; + sha256 = "1s0mniajj3lvbyf7vfb5shp4ink5yibsx945k6lvxa96r8la1612"; + }) + + (fetchNuGet { + name = "System.IO.FileSystem.Primitives"; + version = "4.3.0"; + sha256 = "0j6ndgglcf4brg2lz4wzsh1av1gh8xrzdsn9f0yznskhqn1xzj9c"; + }) + + (fetchNuGet { + name = "System.Linq"; + version = "4.1.0"; + sha256 = "1ppg83svb39hj4hpp5k7kcryzrf3sfnm08vxd5sm2drrijsla2k5"; + }) + + (fetchNuGet { + name = "System.Linq"; + version = "4.3.0"; + sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; + }) + + (fetchNuGet { + name = "System.Linq.Expressions"; + version = "4.3.0"; + sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv"; + }) + + (fetchNuGet { + name = "System.Net.Http"; + version = "4.3.0"; + sha256 = "1i4gc757xqrzflbk7kc5ksn20kwwfjhw9w7pgdkn19y3cgnl302j"; + }) + + (fetchNuGet { + name = "System.Net.NameResolution"; + version = "4.3.0"; + sha256 = "15r75pwc0rm3vvwsn8rvm2krf929mjfwliv0mpicjnii24470rkq"; + }) + + (fetchNuGet { + name = "System.Net.Primitives"; + version = "4.3.0"; + sha256 = "0c87k50rmdgmxx7df2khd9qj7q35j9rzdmm2572cc55dygmdk3ii"; + }) + + (fetchNuGet { + name = "System.Net.Sockets"; + version = "4.3.0"; + sha256 = "1ssa65k6chcgi6mfmzrznvqaxk8jp0gvl77xhf1hbzakjnpxspla"; + }) + + (fetchNuGet { + name = "System.ObjectModel"; + version = "4.3.0"; + sha256 = "191p63zy5rpqx7dnrb3h7prvgixmk168fhvvkkvhlazncf8r3nc2"; + }) + + (fetchNuGet { + name = "System.Private.DataContractSerialization"; + version = "4.1.1"; + sha256 = "1xk9wvgzipssp1393nsg4n16zbr5481k03nkdlj954hzq5jkx89r"; + }) + + (fetchNuGet { + name = "System.Private.DataContractSerialization"; + version = "4.3.0"; + sha256 = "06fjipqvjp559rrm825x6pll8gimdj9x1n3larigh5hsm584gndw"; + }) + + (fetchNuGet { + name = "System.Private.Uri"; + version = "4.3.0"; + sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx"; + }) + + (fetchNuGet { + name = "System.Reflection"; + version = "4.1.0"; + sha256 = "1js89429pfw79mxvbzp8p3q93il6rdff332hddhzi5wqglc4gml9"; + }) + + (fetchNuGet { + name = "System.Reflection"; + version = "4.3.0"; + sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; + }) + + (fetchNuGet { + name = "System.Reflection.Emit"; + version = "4.3.0"; + sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74"; + }) + + (fetchNuGet { + name = "System.Reflection.Emit.ILGeneration"; + version = "4.3.0"; + sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q"; + }) + + (fetchNuGet { + name = "System.Reflection.Emit.Lightweight"; + version = "4.3.0"; + sha256 = "0ql7lcakycrvzgi9kxz1b3lljd990az1x6c4jsiwcacrvimpib5c"; + }) + + (fetchNuGet { + name = "System.Reflection.Extensions"; + version = "4.0.1"; + sha256 = "0m7wqwq0zqq9gbpiqvgk3sr92cbrw7cp3xn53xvw7zj6rz6fdirn"; + }) + + (fetchNuGet { + name = "System.Reflection.Extensions"; + version = "4.3.0"; + sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq"; + }) + + (fetchNuGet { + name = "System.Reflection.Metadata"; + version = "1.3.0"; + sha256 = "1y5m6kryhjpqqm2g3h3b6bzig13wkiw954x3b7icqjm6xypm1x3b"; + }) + + (fetchNuGet { + name = "System.Reflection.Primitives"; + version = "4.0.1"; + sha256 = "1bangaabhsl4k9fg8khn83wm6yial8ik1sza7401621jc6jrym28"; + }) + + (fetchNuGet { + name = "System.Reflection.Primitives"; + version = "4.3.0"; + sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; + }) + + (fetchNuGet { + name = "System.Reflection.TypeExtensions"; + version = "4.1.0"; + sha256 = "1bjli8a7sc7jlxqgcagl9nh8axzfl11f4ld3rjqsyxc516iijij7"; + }) + + (fetchNuGet { + name = "System.Reflection.TypeExtensions"; + version = "4.3.0"; + sha256 = "0y2ssg08d817p0vdag98vn238gyrrynjdj4181hdg780sif3ykp1"; + }) + + (fetchNuGet { + name = "System.Reflection.TypeExtensions"; + version = "4.4.0"; + sha256 = "0n9r1w4lp2zmadyqkgp4sk9wy90sj4ygq4dh7kzamx26i9biys5h"; + }) + + (fetchNuGet { + name = "System.Resources.ResourceManager"; + version = "4.0.1"; + sha256 = "0b4i7mncaf8cnai85jv3wnw6hps140cxz8vylv2bik6wyzgvz7bi"; + }) + + (fetchNuGet { + name = "System.Resources.ResourceManager"; + version = "4.3.0"; + sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; + }) + + (fetchNuGet { + name = "System.Runtime"; + version = "4.1.0"; + sha256 = "02hdkgk13rvsd6r9yafbwzss8kr55wnj8d5c7xjnp8gqrwc8sn0m"; + }) + + (fetchNuGet { + name = "System.Runtime"; + version = "4.3.0"; + sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; + }) + + (fetchNuGet { + name = "System.Runtime.Extensions"; + version = "4.1.0"; + sha256 = "0rw4rm4vsm3h3szxp9iijc3ksyviwsv6f63dng3vhqyg4vjdkc2z"; + }) + + (fetchNuGet { + name = "System.Runtime.Extensions"; + version = "4.3.0"; + sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; + }) + + (fetchNuGet { + name = "System.Runtime.Handles"; + version = "4.0.1"; + sha256 = "1g0zrdi5508v49pfm3iii2hn6nm00bgvfpjq1zxknfjrxxa20r4g"; + }) + + (fetchNuGet { + name = "System.Runtime.Handles"; + version = "4.3.0"; + sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; + }) + + (fetchNuGet { + name = "System.Runtime.InteropServices"; + version = "4.1.0"; + sha256 = "01kxqppx3dr3b6b286xafqilv4s2n0gqvfgzfd4z943ga9i81is1"; + }) + + (fetchNuGet { + name = "System.Runtime.InteropServices"; + version = "4.3.0"; + sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; + }) + + (fetchNuGet { + name = "System.Runtime.InteropServices.RuntimeInformation"; + version = "4.0.0"; + sha256 = "0glmvarf3jz5xh22iy3w9v3wyragcm4hfdr17v90vs7vcrm7fgp6"; + }) + + (fetchNuGet { + name = "System.Runtime.InteropServices.RuntimeInformation"; + version = "4.3.0"; + sha256 = "0q18r1sh4vn7bvqgd6dmqlw5v28flbpj349mkdish2vjyvmnb2ii"; + }) + + (fetchNuGet { + name = "System.Runtime.Loader"; + version = "4.0.0"; + sha256 = "0lpfi3psqcp6zxsjk2qyahal7zaawviimc8lhrlswhip2mx7ykl0"; + }) + + (fetchNuGet { + name = "System.Runtime.Loader"; + version = "4.3.0"; + sha256 = "07fgipa93g1xxgf7193a6vw677mpzgr0z0cfswbvqqb364cva8dk"; + }) + + (fetchNuGet { + name = "System.Runtime.Numerics"; + version = "4.3.0"; + sha256 = "19rav39sr5dky7afygh309qamqqmi9kcwvz3i0c5700v0c5cg61z"; + }) + + (fetchNuGet { + name = "System.Runtime.Serialization.Json"; + version = "4.0.2"; + sha256 = "08ypbzs0sb302ga04ds5b2wxa2gg0q50zpa0nvc87ipjhs0v66dn"; + }) + + (fetchNuGet { + name = "System.Runtime.Serialization.Primitives"; + version = "4.1.1"; + sha256 = "042rfjixknlr6r10vx2pgf56yming8lkjikamg3g4v29ikk78h7k"; + }) + + (fetchNuGet { + name = "System.Runtime.Serialization.Primitives"; + version = "4.3.0"; + sha256 = "01vv2p8h4hsz217xxs0rixvb7f2xzbh6wv1gzbfykcbfrza6dvnf"; + }) + + (fetchNuGet { + name = "System.Runtime.Serialization.Xml"; + version = "4.3.0"; + sha256 = "1b2cxl2h7s8cydbhbmxhvvq071n9ck61g08npg4gyw7nvg37rfni"; + }) + + (fetchNuGet { + name = "System.Security.AccessControl"; + version = "4.4.0"; + sha256 = "0ixqw47krkazsw0ycm22ivkv7dpg6cjz8z8g0ii44bsx4l8gcx17"; + }) + + (fetchNuGet { + name = "System.Security.Claims"; + version = "4.3.0"; + sha256 = "0jvfn7j22l3mm28qjy3rcw287y9h65ha4m940waaxah07jnbzrhn"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Algorithms"; + version = "4.2.0"; + sha256 = "148s9g5dgm33ri7dnh19s4lgnlxbpwvrw2jnzllq2kijj4i4vs85"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Algorithms"; + version = "4.3.0"; + sha256 = "03sq183pfl5kp7gkvq77myv7kbpdnq3y0xj7vi4q1kaw54sny0ml"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Cng"; + version = "4.3.0"; + sha256 = "1k468aswafdgf56ab6yrn7649kfqx2wm9aslywjam1hdmk5yypmv"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Cng"; + version = "4.4.0"; + sha256 = "1grg9id80m358crr5y4q4rhhbrm122yw8jrlcl1ybi7nkmmck40n"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Csp"; + version = "4.3.0"; + sha256 = "1x5wcrddf2s3hb8j78cry7yalca4lb5vfnkrysagbn6r9x6xvrx1"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Encoding"; + version = "4.3.0"; + sha256 = "1jr6w70igqn07k5zs1ph6xja97hxnb3mqbspdrff6cvssgrixs32"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.OpenSsl"; + version = "4.3.0"; + sha256 = "0givpvvj8yc7gv4lhb6s1prq6p2c4147204a0wib89inqzd87gqc"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Pkcs"; + version = "4.4.0"; + sha256 = "1bn7d2czpc994qzdph4drv7p1cv4x55j2dhbmr113p0gs4hx33zh"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.Primitives"; + version = "4.3.0"; + sha256 = "0pyzncsv48zwly3lw4f2dayqswcfvdwq2nz0dgwmi7fj3pn64wby"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.ProtectedData"; + version = "4.4.0"; + sha256 = "1q8ljvqhasyynp94a1d7jknk946m20lkwy2c3wa8zw2pc517fbj6"; + }) + + (fetchNuGet { + name = "System.Security.Cryptography.X509Certificates"; + version = "4.3.0"; + sha256 = "0valjcz5wksbvijylxijjxb1mp38mdhv03r533vnx1q3ikzdav9h"; + }) + + (fetchNuGet { + name = "System.Security.Principal"; + version = "4.3.0"; + sha256 = "12cm2zws06z4lfc4dn31iqv7072zyi4m910d4r6wm8yx85arsfxf"; + }) + + (fetchNuGet { + name = "System.Security.Principal.Windows"; + version = "4.3.0"; + sha256 = "00a0a7c40i3v4cb20s2cmh9csb5jv2l0frvnlzyfxh848xalpdwr"; + }) + + (fetchNuGet { + name = "System.Security.Principal.Windows"; + version = "4.4.0"; + sha256 = "11rr16fp68apc0arsymgj18w8ajs9a4366wgx9iqwny4glrl20wp"; + }) + + (fetchNuGet { + name = "System.ServiceProcess.ServiceController"; + version = "4.4.0"; + sha256 = "0hyijvysbcjh20mbbgajg9wh04nkjd6y5lqxgm0a6m28zjcjshl6"; + }) + + (fetchNuGet { + name = "System.Text.Encoding"; + version = "4.0.11"; + sha256 = "1dyqv0hijg265dwxg6l7aiv74102d6xjiwplh2ar1ly6xfaa4iiw"; + }) + + (fetchNuGet { + name = "System.Text.Encoding"; + version = "4.3.0"; + sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; + }) + + (fetchNuGet { + name = "System.Text.Encoding.CodePages"; + version = "4.4.0"; + sha256 = "07bzjnflxjk9vgpljfybrpqmvsr9qr2f20nq5wf11imwa5pbhgfc"; + }) + + (fetchNuGet { + name = "System.Text.Encoding.Extensions"; + version = "4.0.11"; + sha256 = "08nsfrpiwsg9x5ml4xyl3zyvjfdi4mvbqf93kjdh11j4fwkznizs"; + }) + + (fetchNuGet { + name = "System.Text.Encoding.Extensions"; + version = "4.3.0"; + sha256 = "11q1y8hh5hrp5a3kw25cb6l00v5l5dvirkz8jr3sq00h1xgcgrxy"; + }) + + (fetchNuGet { + name = "System.Text.RegularExpressions"; + version = "4.3.0"; + sha256 = "1bgq51k7fwld0njylfn7qc5fmwrk2137gdq7djqdsw347paa9c2l"; + }) + + (fetchNuGet { + name = "System.Threading"; + version = "4.0.11"; + sha256 = "19x946h926bzvbsgj28csn46gak2crv2skpwsx80hbgazmkgb1ls"; + }) + + (fetchNuGet { + name = "System.Threading"; + version = "4.3.0"; + sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; + }) + + (fetchNuGet { + name = "System.Threading.Channels"; + version = "4.5.0"; + sha256 = "0n6z3wjia7h2a5vl727p97riydnb6jhhkb1pdcnizza02dwkz0nz"; + }) + + (fetchNuGet { + name = "System.Threading.Tasks"; + version = "4.0.11"; + sha256 = "0nr1r41rak82qfa5m0lhk9mp0k93bvfd7bbd9sdzwx9mb36g28p5"; + }) + + (fetchNuGet { + name = "System.Threading.Tasks"; + version = "4.3.0"; + sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; + }) + + (fetchNuGet { + name = "System.Threading.Tasks.Extensions"; + version = "4.3.0"; + sha256 = "1xxcx2xh8jin360yjwm4x4cf5y3a2bwpn2ygkfkwkicz7zk50s2z"; + }) + + (fetchNuGet { + name = "System.Threading.Tasks.Extensions"; + version = "4.5.1"; + sha256 = "1ikrplvw4m6pzjbq3bfbpr572n4i9mni577zvmrkaygvx85q3myw"; + }) + + (fetchNuGet { + name = "System.Threading.Thread"; + version = "4.0.0"; + sha256 = "1gxxm5fl36pjjpnx1k688dcw8m9l7nmf802nxis6swdaw8k54jzc"; + }) + + (fetchNuGet { + name = "System.Threading.ThreadPool"; + version = "4.0.10"; + sha256 = "0fdr61yjcxh5imvyf93n2m3n5g9pp54bnw2l1d2rdl9z6dd31ypx"; + }) + + (fetchNuGet { + name = "System.Threading.ThreadPool"; + version = "4.3.0"; + sha256 = "027s1f4sbx0y1xqw2irqn6x161lzj8qwvnh2gn78ciiczdv10vf1"; + }) + + (fetchNuGet { + name = "System.Threading.Timer"; + version = "4.3.0"; + sha256 = "1nx773nsx6z5whv8kaa1wjh037id2f1cxhb69pvgv12hd2b6qs56"; + }) + + (fetchNuGet { + name = "System.Xml.ReaderWriter"; + version = "4.0.11"; + sha256 = "0c6ky1jk5ada9m94wcadih98l6k1fvf6vi7vhn1msjixaha419l5"; + }) + + (fetchNuGet { + name = "System.Xml.ReaderWriter"; + version = "4.3.0"; + sha256 = "0c47yllxifzmh8gq6rq6l36zzvw4kjvlszkqa9wq3fr59n0hl3s1"; + }) + + (fetchNuGet { + name = "System.Xml.XDocument"; + version = "4.3.0"; + sha256 = "08h8fm4l77n0nd4i4fk2386y809bfbwqb7ih9d7564ifcxr5ssxd"; + }) + + (fetchNuGet { + name = "System.Xml.XmlDocument"; + version = "4.0.1"; + sha256 = "0ihsnkvyc76r4dcky7v3ansnbyqjzkbyyia0ir5zvqirzan0bnl1"; + }) + + (fetchNuGet { + name = "System.Xml.XmlDocument"; + version = "4.3.0"; + sha256 = "0bmz1l06dihx52jxjr22dyv5mxv6pj4852lx68grjm7bivhrbfwi"; + }) + + (fetchNuGet { + name = "System.Xml.XmlSerializer"; + version = "4.3.0"; + sha256 = "07pa4sx196vxkgl3csvdmw94nydlsm9ir38xxcs84qjn8cycd912"; + }) + + (fetchNuGet { + name = "System.Xml.XPath"; + version = "4.0.1"; + sha256 = "0fjqgb6y66d72d5n8qq1h213d9nv2vi8mpv8p28j3m9rccmsh04m"; + }) + + (fetchNuGet { + name = "System.Xml.XPath.XmlDocument"; + version = "4.0.1"; + sha256 = "0l7yljgif41iv5g56l3nxy97hzzgck2a7rhnfnljhx9b0ry41bvc"; + }) + + (fetchNuGet { + name = "xunit"; + version = "2.4.1"; + sha256 = "0xf3kaywpg15flqaqfgywqyychzk15kz0kz34j21rcv78q9ywq20"; + }) + + (fetchNuGet { + name = "xunit.abstractions"; + version = "2.0.3"; + sha256 = "00wl8qksgkxld76fgir3ycc5rjqv1sqds6x8yx40927q5py74gfh"; + }) + + (fetchNuGet { + name = "xunit.analyzers"; + version = "0.10.0"; + sha256 = "15n02q3akyqbvkp8nq75a8rd66d4ax0rx8fhdcn8j78pi235jm7j"; + }) + + (fetchNuGet { + name = "xunit.assert"; + version = "2.4.1"; + sha256 = "1imynzh80wxq2rp9sc4gxs4x1nriil88f72ilhj5q0m44qqmqpc6"; + }) + + (fetchNuGet { + name = "xunit.core"; + version = "2.4.1"; + sha256 = "1nnb3j4kzmycaw1g76ii4rfqkvg6l8gqh18falwp8g28h802019a"; + }) + + (fetchNuGet { + name = "xunit.extensibility.core"; + version = "2.4.1"; + sha256 = "103qsijmnip2pnbhciqyk2jyhdm6snindg5z2s57kqf5pcx9a050"; + }) + + (fetchNuGet { + name = "xunit.extensibility.execution"; + version = "2.4.1"; + sha256 = "1pbilxh1gp2ywm5idfl0klhl4gb16j86ib4x83p8raql1dv88qia"; + }) + + (fetchNuGet { + name = "xunit.runner.visualstudio"; + version = "2.4.1"; + sha256 = "0fln5pk18z98gp0zfshy1p9h6r9wc55nyqhap34k89yran646vhn"; + }) + + (fetchNuGet { + name = "YamlDotNet.Signed"; + version = "5.3.0"; + sha256 = "1gnp5aa2zzg7v61bbn2ra1npy0p07szp5w8vqk44fdj3fcvrdxib"; + }) + +] diff --git a/pkgs/development/tools/continuous-integration/github-runner/patches/dir-proj.patch b/pkgs/development/tools/continuous-integration/github-runner/patches/dir-proj.patch new file mode 100644 index 00000000000..9a75b12544a --- /dev/null +++ b/pkgs/development/tools/continuous-integration/github-runner/patches/dir-proj.patch @@ -0,0 +1,53 @@ +From 4267ee7fa5169b4fd5ce732118769e559806a390 Mon Sep 17 00:00:00 2001 +From: Vincent Haupert +Date: Sat, 13 Mar 2021 21:52:03 +0100 +Subject: [PATCH] Patch dir.proj + +Don't execute Git for GitInfoCommitHash property +Don't restore for build target +Don't restore for test target +--- + src/dir.proj | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/src/dir.proj b/src/dir.proj +index 1c91e0c..8b27d3f 100644 +--- a/src/dir.proj ++++ b/src/dir.proj +@@ -2,9 +2,6 @@ + + +- +- +- + + + +@@ -39,14 +36,13 @@ + + + +- + + + + + +- +- ++ ++ + + + +@@ -84,4 +80,4 @@ + + + +- +\ No newline at end of file ++ +-- +2.30.1 + diff --git a/pkgs/development/tools/continuous-integration/github-runner/patches/dont-install-systemd-service.patch b/pkgs/development/tools/continuous-integration/github-runner/patches/dont-install-systemd-service.patch new file mode 100644 index 00000000000..6279a4ecb4b --- /dev/null +++ b/pkgs/development/tools/continuous-integration/github-runner/patches/dont-install-systemd-service.patch @@ -0,0 +1,15 @@ +diff --git a/src/Runner.Listener/Configuration/ConfigurationManager.cs b/src/Runner.Listener/Configuration/ConfigurationManager.cs +index 8d08b06..bdfa3a2 100644 +--- a/src/Runner.Listener/Configuration/ConfigurationManager.cs ++++ b/src/Runner.Listener/Configuration/ConfigurationManager.cs +@@ -320,10 +320,6 @@ namespace GitHub.Runner.Listener.Configuration + serviceControlManager.ConfigureService(runnerSettings, command); + } + +-#elif OS_LINUX || OS_OSX +- // generate service config script for OSX and Linux, GenerateScripts() will no-opt on windows. +- var serviceControlManager = HostContext.GetService(); +- serviceControlManager.GenerateScripts(runnerSettings); + #endif + } + diff --git a/pkgs/development/tools/continuous-integration/github-runner/patches/host-context-dirs.patch b/pkgs/development/tools/continuous-integration/github-runner/patches/host-context-dirs.patch new file mode 100644 index 00000000000..662ad9676da --- /dev/null +++ b/pkgs/development/tools/continuous-integration/github-runner/patches/host-context-dirs.patch @@ -0,0 +1,20 @@ +diff --git a/src/Runner.Common/HostContext.cs b/src/Runner.Common/HostContext.cs +index d4ea48c..2ec8455 100644 +--- a/src/Runner.Common/HostContext.cs ++++ b/src/Runner.Common/HostContext.cs +@@ -220,12 +220,13 @@ namespace GitHub.Runner.Common + + case WellKnownDirectory.Externals: + path = Path.Combine( +- GetDirectory(WellKnownDirectory.Root), ++ new DirectoryInfo(GetDirectory(WellKnownDirectory.Bin)).Parent.FullName, + Constants.Path.ExternalsDirectory); + break; + + case WellKnownDirectory.Root: +- path = new DirectoryInfo(GetDirectory(WellKnownDirectory.Bin)).Parent.FullName; ++ path = Environment.GetEnvironmentVariable("RUNNER_ROOT") ++ ?? new DirectoryInfo(GetDirectory(WellKnownDirectory.Bin)).Parent.FullName; + break; + + case WellKnownDirectory.Temp: diff --git a/pkgs/development/tools/continuous-integration/github-runner/patches/ignore-self-update.patch b/pkgs/development/tools/continuous-integration/github-runner/patches/ignore-self-update.patch new file mode 100644 index 00000000000..b505bbc7503 --- /dev/null +++ b/pkgs/development/tools/continuous-integration/github-runner/patches/ignore-self-update.patch @@ -0,0 +1,24 @@ +diff --git a/src/Runner.Listener/Runner.cs b/src/Runner.Listener/Runner.cs +index 68b0b4e..5da21fe 100644 +--- a/src/Runner.Listener/Runner.cs ++++ b/src/Runner.Listener/Runner.cs +@@ -391,18 +391,7 @@ namespace GitHub.Runner.Listener + HostContext.WritePerfCounter($"MessageReceived_{message.MessageType}"); + if (string.Equals(message.MessageType, AgentRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase)) + { +- if (autoUpdateInProgress == false) +- { +- autoUpdateInProgress = true; +- var runnerUpdateMessage = JsonUtility.FromString(message.Body); +- var selfUpdater = HostContext.GetService(); +- selfUpdateTask = selfUpdater.SelfUpdate(runnerUpdateMessage, jobDispatcher, !runOnce && HostContext.StartupType != StartupType.Service, HostContext.RunnerShutdownToken); +- Trace.Info("Refresh message received, kick-off selfupdate background process."); +- } +- else +- { +- Trace.Info("Refresh message received, skip autoupdate since a previous autoupdate is already running."); +- } ++ Trace.Info("Ignoring received refresh message (would trigger self-update)."); + } + else if (string.Equals(message.MessageType, JobRequestMessageTypes.PipelineAgentJobRequest, StringComparison.OrdinalIgnoreCase)) + { diff --git a/pkgs/development/tools/continuous-integration/github-runner/patches/use-get-directory-for-diag.patch b/pkgs/development/tools/continuous-integration/github-runner/patches/use-get-directory-for-diag.patch new file mode 100644 index 00000000000..ff91bcff158 --- /dev/null +++ b/pkgs/development/tools/continuous-integration/github-runner/patches/use-get-directory-for-diag.patch @@ -0,0 +1,25 @@ +diff --git a/src/Runner.Common/HostContext.cs b/src/Runner.Common/HostContext.cs +index d4ea48c..15c1800 100644 +--- a/src/Runner.Common/HostContext.cs ++++ b/src/Runner.Common/HostContext.cs +@@ -109,7 +109,7 @@ namespace GitHub.Runner.Common + } + + // this should give us _diag folder under runner root directory +- string diagLogDirectory = Path.Combine(new DirectoryInfo(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)).Parent.FullName, Constants.Path.DiagDirectory); ++ string diagLogDirectory = GetDirectory(WellKnownDirectory.Diag); + _traceManager = new TraceManager(new HostTraceListener(diagLogDirectory, hostType, logPageSize, logRetentionDays), this.SecretMasker); + } + else +@@ -272,7 +272,10 @@ namespace GitHub.Runner.Common + throw new NotSupportedException($"Unexpected well known directory: '{directory}'"); + } + +- _trace.Info($"Well known directory '{directory}': '{path}'"); ++ if (_trace != null) ++ { ++ _trace.Info($"Well known directory '{directory}': '{path}'"); ++ } + return path; + } + diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 91e3e9c70a3..403ed59ba32 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4888,6 +4888,8 @@ in github-backup = callPackage ../tools/misc/github-backup { }; + github-runner = callPackage ../development/tools/continuous-integration/github-runner { }; + gitin = callPackage ../applications/version-management/git-and-tools/gitin { }; gitinspector = callPackage ../applications/version-management/gitinspector { };