From 097ada9374c9bde944aa9fa3de59ae2e656e79cf Mon Sep 17 00:00:00 2001 From: Ben De St Paer-Gotch Date: Mon, 9 Jun 2025 18:16:35 +0100 Subject: [PATCH 01/13] Update README.md (#3898) --- README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7b79464264e..a2e3bcc97ef 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,20 @@ Runner releases: ![linux](docs/res/linux_sm.png) [Pre-reqs](docs/start/envlinux.md) | [Download](https://github.com/actions/runner/releases) -## Contribute +### Note -We accept contributions in the form of issues and pull requests. The runner typically requires changes across the entire system and we aim for issues in the runner to be entirely self contained and fixable here. Therefore, we will primarily handle bug issues opened in this repo and we kindly request you to create all feature and enhancement requests on the [GitHub Feedback](https://github.com/community/community/discussions/categories/actions-and-packages) page. [Read more about our guidelines here](docs/contribute.md) before contributing. +Thank you for your interest in this GitHub repo, however, right now we are not taking contributions. + +We continue to focus our resources on strategic areas that help our customers be successful while making developers' lives easier. While GitHub Actions remains a key part of this vision, we are allocating resources towards other areas of Actions and are not taking contributions to this repository at this time. The GitHub public roadmap is the best place to follow along for any updates on features we’re working on and what stage they’re in. + +We are taking the following steps to better direct requests related to GitHub Actions, including: + +1. We will be directing questions and support requests to our [Community Discussions area](https://github.com/orgs/community/discussions/categories/actions) + +2. High Priority bugs can be reported through Community Discussions or you can report these to our support team https://support.github.com/contact/bug-report. + +3. Security Issues should be handled as per our [security.md](security.md) + +We will still provide security updates for this project and fix major breaking changes during this time. + +You are welcome to still raise bugs in this repo. From 60563d82d13529ebfb686d09dd11ca63247c31ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 11:42:02 -0400 Subject: [PATCH 02/13] Update dotnet sdk to latest version @8.0.411 (#3911) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .devcontainer/devcontainer.json | 2 +- src/dev.sh | 2 +- src/global.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4a044fb215a..e6e28e5b3d0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,7 +4,7 @@ "features": { "ghcr.io/devcontainers/features/docker-in-docker:1": {}, "ghcr.io/devcontainers/features/dotnet": { - "version": "8.0.410" + "version": "8.0.411" }, "ghcr.io/devcontainers/features/node:1": { "version": "20" diff --git a/src/dev.sh b/src/dev.sh index 84dceb7e461..948d27be188 100755 --- a/src/dev.sh +++ b/src/dev.sh @@ -17,7 +17,7 @@ LAYOUT_DIR="$SCRIPT_DIR/../_layout" DOWNLOAD_DIR="$SCRIPT_DIR/../_downloads/netcore2x" PACKAGE_DIR="$SCRIPT_DIR/../_package" DOTNETSDK_ROOT="$SCRIPT_DIR/../_dotnetsdk" -DOTNETSDK_VERSION="8.0.410" +DOTNETSDK_VERSION="8.0.411" DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION" RUNNER_VERSION=$(cat runnerversion) diff --git a/src/global.json b/src/global.json index f2f4b022766..e5f41726d05 100644 --- a/src/global.json +++ b/src/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "8.0.410" + "version": "8.0.411" } } From 9f57d37642fd2cc6a4cedc970280de173f846b9b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 12:43:59 -0400 Subject: [PATCH 03/13] Update Docker to v28.2.2 and Buildx to v0.25.0 (#3918) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- images/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/images/Dockerfile b/images/Dockerfile index 1b8428ce809..6c771235dd8 100644 --- a/images/Dockerfile +++ b/images/Dockerfile @@ -5,8 +5,8 @@ ARG TARGETOS ARG TARGETARCH ARG RUNNER_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION=0.7.0 -ARG DOCKER_VERSION=28.2.1 -ARG BUILDX_VERSION=0.24.0 +ARG DOCKER_VERSION=28.3.0 +ARG BUILDX_VERSION=0.25.0 RUN apt update -y && apt install curl unzip -y From 5969cbe20810562bcd103006a960aa3adbf3395e Mon Sep 17 00:00:00 2001 From: Tingluo Huang Date: Tue, 1 Jul 2025 15:49:30 -0400 Subject: [PATCH 04/13] Bump windows service app to dotnet 4.7 (#3926) --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- src/Runner.Service/Windows/App.config | 2 +- src/Runner.Service/Windows/RunnerService.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ab9057257ce..550fe738b7a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,7 @@ jobs: devScript: ./dev.sh - runtime: win-x64 - os: windows-2019 + os: windows-latest devScript: ./dev - runtime: win-arm64 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90e76971166..60e1b6bd457 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -77,7 +77,7 @@ jobs: devScript: ./dev.sh - runtime: win-x64 - os: windows-2019 + os: windows-latest devScript: ./dev - runtime: win-arm64 diff --git a/src/Runner.Service/Windows/App.config b/src/Runner.Service/Windows/App.config index 486e3ea0979..e1798d31b32 100644 --- a/src/Runner.Service/Windows/App.config +++ b/src/Runner.Service/Windows/App.config @@ -1,6 +1,6 @@  - + diff --git a/src/Runner.Service/Windows/RunnerService.csproj b/src/Runner.Service/Windows/RunnerService.csproj index 238e67aac6e..ed43de7b06a 100644 --- a/src/Runner.Service/Windows/RunnerService.csproj +++ b/src/Runner.Service/Windows/RunnerService.csproj @@ -18,7 +18,7 @@ v4.8 - v4.5 + v4.7 AnyCPU From 20912234a5c7978101fad0b94ef67c964373c53b Mon Sep 17 00:00:00 2001 From: Tingluo Huang Date: Mon, 7 Jul 2025 11:47:48 -0400 Subject: [PATCH 05/13] Upgrade node.js to latest version. (#3935) --- src/Misc/expressionFunc/hashFiles/package-lock.json | 13 +++++++------ src/Misc/externals.sh | 2 +- src/Misc/layoutbin/hashFiles/index.js | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Misc/expressionFunc/hashFiles/package-lock.json b/src/Misc/expressionFunc/hashFiles/package-lock.json index da8dde30c45..f67017be9a4 100644 --- a/src/Misc/expressionFunc/hashFiles/package-lock.json +++ b/src/Misc/expressionFunc/hashFiles/package-lock.json @@ -716,9 +716,10 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4751,9 +4752,9 @@ } }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" diff --git a/src/Misc/externals.sh b/src/Misc/externals.sh index b2216ba2ddf..c6c893a0be6 100755 --- a/src/Misc/externals.sh +++ b/src/Misc/externals.sh @@ -6,7 +6,7 @@ NODE_URL=https://nodejs.org/dist NODE_ALPINE_URL=https://github.com/actions/alpine_nodejs/releases/download # When you update Node versions you must also create a new release of alpine_nodejs at that updated version. # Follow the instructions here: https://github.com/actions/alpine_nodejs?tab=readme-ov-file#getting-started -NODE20_VERSION="20.19.1" +NODE20_VERSION="20.19.3" get_abs_path() { # exploits the fact that pwd will print abs path when no args diff --git a/src/Misc/layoutbin/hashFiles/index.js b/src/Misc/layoutbin/hashFiles/index.js index fa283f880d2..6e3d2d59d13 100644 --- a/src/Misc/layoutbin/hashFiles/index.js +++ b/src/Misc/layoutbin/hashFiles/index.js @@ -3299,7 +3299,7 @@ function expand(str, isTop) { var isOptions = m.body.indexOf(',') >= 0; if (!isSequence && !isOptions) { // {a},b} - if (m.post.match(/,.*\}/)) { + if (m.post.match(/,(?!,).*\}/)) { str = m.pre + '{' + m.body + escClose + m.post; return expand(str); } From 0d24afa114c2ee4b6451e35f2ba2cb9b96955789 Mon Sep 17 00:00:00 2001 From: Tingluo Huang Date: Mon, 7 Jul 2025 15:19:21 -0400 Subject: [PATCH 06/13] Prepare 2.326.0 runner release. (#3936) --- releaseNote.md | 20 +++++++++++--------- src/runnerversion | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/releaseNote.md b/releaseNote.md index cfaeb974a8d..2dc0786b8a0 100644 --- a/releaseNote.md +++ b/releaseNote.md @@ -1,13 +1,15 @@ ## What's Changed -* Create schedule workflow to upgrade docker and buildx version. by @TingluoHuang in https://github.com/actions/runner/pull/3859 -* Update dotnet sdk to latest version @8.0.409 by @github-actions in https://github.com/actions/runner/pull/3860 -* Allow runner to use authv2 during config. by @TingluoHuang in https://github.com/actions/runner/pull/3866 -* show helpful error message when resolving actions directly with launch by @aiqiaoy in https://github.com/actions/runner/pull/3874 -* Update dotnet sdk to latest version @8.0.410 by @github-actions in https://github.com/actions/runner/pull/3871 -* Update Docker to v28.2.1 and Buildx to v0.24.0 by @github-actions in https://github.com/actions/runner/pull/3881 -* Allow NO_SSL_VERIFY in RawHttpMessageHandler. by @TingluoHuang in https://github.com/actions/runner/pull/3883 - -**Full Changelog**: https://github.com/actions/runner/compare/v2.324.0...v2.325.0 +* runner timestamps invariant by @GhadimiR in https://github.com/actions/runner/pull/3888 +* Update README.md by @nebuk89 in https://github.com/actions/runner/pull/3898 +* Update dotnet sdk to latest version @8.0.411 by @github-actions in https://github.com/actions/runner/pull/3911 +* Update Docker to v28.2.2 and Buildx to v0.25.0 by @github-actions in https://github.com/actions/runner/pull/3918 +* Bump windows service app to dotnet 4.7 by @TingluoHuang in https://github.com/actions/runner/pull/3926 +* Upgrade node.js to latest version. by @TingluoHuang in https://github.com/actions/runner/pull/3935 + +## New Contributors +* @nebuk89 made their first contribution in https://github.com/actions/runner/pull/3898 + +**Full Changelog**: https://github.com/actions/runner/compare/v2.325.0...v2.326.0 _Note: Actions Runner follows a progressive release policy, so the latest release might not be available to your enterprise, organization, or repository yet. To confirm which version of the Actions Runner you should expect, please view the download instructions for your enterprise, organization, or repository. diff --git a/src/runnerversion b/src/runnerversion index 3ba5855e2dc..73c5522c143 100644 --- a/src/runnerversion +++ b/src/runnerversion @@ -1 +1 @@ -2.325.0 +2.326.0 From 14856e63bc026c3e17916a99623d80e92e2a6efb Mon Sep 17 00:00:00 2001 From: Tingluo Huang Date: Wed, 16 Jul 2025 14:11:09 -0400 Subject: [PATCH 07/13] Try add orchestrationid into user-agent using token claim. (#3945) --- src/Runner.Common/HostContext.cs | 31 ++++++++++++++++++++++++++++ src/Runner.Listener/JobDispatcher.cs | 7 ++++++- src/Runner.Worker/JobRunner.cs | 7 +++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/Runner.Common/HostContext.cs b/src/Runner.Common/HostContext.cs index 73ca108ae9d..ffb08684a53 100644 --- a/src/Runner.Common/HostContext.cs +++ b/src/Runner.Common/HostContext.cs @@ -15,6 +15,7 @@ using GitHub.DistributedTask.Logging; using GitHub.Runner.Common.Util; using GitHub.Runner.Sdk; +using GitHub.Services.WebApi.Jwt; namespace GitHub.Runner.Common { @@ -306,6 +307,36 @@ public void LoadDefaultUserAgents() { _userAgents.Add(new ProductInfoHeaderValue("ClientId", clientId)); } + + // for Hosted runner, we can pull orchestrationId from JWT claims of the runner listening token. + if (credData != null && + credData.Scheme == Constants.Configuration.OAuthAccessToken && + credData.Data.TryGetValue(Constants.Runner.CommandLine.Args.Token, out var accessToken) && + !string.IsNullOrEmpty(accessToken)) + { + try + { + var jwt = JsonWebToken.Create(accessToken); + var claims = jwt.ExtractClaims(); + var orchestrationId = claims.FirstOrDefault(x => string.Equals(x.Type, "orch_id", StringComparison.OrdinalIgnoreCase))?.Value; + if (string.IsNullOrEmpty(orchestrationId)) + { + // fallback to orchid for C# actions-service + orchestrationId = claims.FirstOrDefault(x => string.Equals(x.Type, "orchid", StringComparison.OrdinalIgnoreCase))?.Value; + } + + if (!string.IsNullOrEmpty(orchestrationId)) + { + _trace.Info($"Pull OrchestrationId {orchestrationId} from runner JWT claims"); + _userAgents.Insert(0, new ProductInfoHeaderValue("OrchestrationId", orchestrationId)); + } + } + catch (Exception ex) + { + _trace.Error("Fail to extract OrchestrationId from runner JWT claims"); + _trace.Error(ex); + } + } } var runnerFile = GetConfigFile(WellKnownConfigFile.Runner); diff --git a/src/Runner.Listener/JobDispatcher.cs b/src/Runner.Listener/JobDispatcher.cs index b908c8b07a4..f98204b42a5 100644 --- a/src/Runner.Listener/JobDispatcher.cs +++ b/src/Runner.Listener/JobDispatcher.cs @@ -110,7 +110,12 @@ public void Run(Pipelines.AgentJobRequestMessage jobRequestMessage, bool runOnce { var jwt = JsonWebToken.Create(accessToken); var claims = jwt.ExtractClaims(); - orchestrationId = claims.FirstOrDefault(x => string.Equals(x.Type, "orchid", StringComparison.OrdinalIgnoreCase))?.Value; + orchestrationId = claims.FirstOrDefault(x => string.Equals(x.Type, "orch_id", StringComparison.OrdinalIgnoreCase))?.Value; + if (string.IsNullOrEmpty(orchestrationId)) + { + orchestrationId = claims.FirstOrDefault(x => string.Equals(x.Type, "orchid", StringComparison.OrdinalIgnoreCase))?.Value; + } + if (!string.IsNullOrEmpty(orchestrationId)) { Trace.Info($"Pull OrchestrationId {orchestrationId} from JWT claims"); diff --git a/src/Runner.Worker/JobRunner.cs b/src/Runner.Worker/JobRunner.cs index 32447470645..1af7d8b3bcd 100644 --- a/src/Runner.Worker/JobRunner.cs +++ b/src/Runner.Worker/JobRunner.cs @@ -50,8 +50,11 @@ public async Task RunAsync(AgentJobRequestMessage message, Cancellat if (message.Variables.TryGetValue(Constants.Variables.System.OrchestrationId, out VariableValue orchestrationId) && !string.IsNullOrEmpty(orchestrationId.Value)) { - // make the orchestration id the first item in the user-agent header to avoid get truncated in server log. - HostContext.UserAgents.Insert(0, new ProductInfoHeaderValue("OrchestrationId", orchestrationId.Value)); + if (!HostContext.UserAgents.Any(x => string.Equals(x.Product.Name, "OrchestrationId", StringComparison.OrdinalIgnoreCase))) + { + // make the orchestration id the first item in the user-agent header to avoid get truncated in server log. + HostContext.UserAgents.Insert(0, new ProductInfoHeaderValue("OrchestrationId", orchestrationId.Value)); + } // make sure orchestration id is in the user-agent header. VssUtil.InitializeVssClientSettings(HostContext.UserAgents, HostContext.WebProxy); From a1e6ad8d2ebe2eb807efabbf32850c49b0aca49b Mon Sep 17 00:00:00 2001 From: Salman Chishti Date: Thu, 17 Jul 2025 01:12:03 +0100 Subject: [PATCH 08/13] Fix null reference exception in user agent handling (#3946) --- src/Runner.Worker/JobRunner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Runner.Worker/JobRunner.cs b/src/Runner.Worker/JobRunner.cs index 1af7d8b3bcd..1390af13b2f 100644 --- a/src/Runner.Worker/JobRunner.cs +++ b/src/Runner.Worker/JobRunner.cs @@ -50,7 +50,7 @@ public async Task RunAsync(AgentJobRequestMessage message, Cancellat if (message.Variables.TryGetValue(Constants.Variables.System.OrchestrationId, out VariableValue orchestrationId) && !string.IsNullOrEmpty(orchestrationId.Value)) { - if (!HostContext.UserAgents.Any(x => string.Equals(x.Product.Name, "OrchestrationId", StringComparison.OrdinalIgnoreCase))) + if (!HostContext.UserAgents.Any(x => string.Equals(x.Product?.Name, "OrchestrationId", StringComparison.OrdinalIgnoreCase))) { // make the orchestration id the first item in the user-agent header to avoid get truncated in server log. HostContext.UserAgents.Insert(0, new ProductInfoHeaderValue("OrchestrationId", orchestrationId.Value)); From ed48ddd08c9350e49b7fdfaf42512091585af4e1 Mon Sep 17 00:00:00 2001 From: Salman Chishti Date: Thu, 17 Jul 2025 02:00:17 +0100 Subject: [PATCH 09/13] Runner Support for executing Node24 Actions (#3940) --- docs/checks/nodejs.md | 4 +- src/Misc/externals.sh | 10 +++ src/Misc/layoutbin/update.sh.template | 11 ++- src/Runner.Common/Util/NodeUtil.cs | 17 +++++ src/Runner.Worker/ActionManifestManager.cs | 7 +- src/Runner.Worker/Handlers/StepHost.cs | 28 ++++++-- src/Test/L0/Worker/ActionManagerL0.cs | 70 +++++++++++++++++++ src/Test/L0/Worker/ActionManifestManagerL0.cs | 45 +++++++++++- src/Test/L0/Worker/HandlerFactoryL0.cs | 46 +++++++++++- src/Test/L0/Worker/Handlers/NodeHandlerL0.cs | 35 ++++++++++ src/Test/L0/Worker/StepHostL0.cs | 54 ++++++++++++++ src/Test/L0/Worker/StepHostNodeVersionL0.cs | 63 +++++++++++++++++ src/Test/TestData/node24action.yml | 20 ++++++ 13 files changed, 394 insertions(+), 16 deletions(-) create mode 100644 src/Test/L0/Worker/Handlers/NodeHandlerL0.cs create mode 100644 src/Test/L0/Worker/StepHostNodeVersionL0.cs create mode 100644 src/Test/TestData/node24action.yml diff --git a/docs/checks/nodejs.md b/docs/checks/nodejs.md index 7308dcadc50..62b2958cd95 100644 --- a/docs/checks/nodejs.md +++ b/docs/checks/nodejs.md @@ -4,9 +4,9 @@ Make sure the built-in node.js has access to GitHub.com or GitHub Enterprise Server. -The runner carries its own copy of node.js executable under `/externals/node20/`. +The runner carries its own copies of node.js executables under `/externals/node20/` and `/externals/node24/`. -All javascript base Actions will get executed by the built-in `node` at `/externals/node20/`. +All javascript base Actions will get executed by the built-in `node` at either `/externals/node20/` or `/externals/node24/` depending on the version specified in the action's metadata. > Not the `node` from `$PATH` diff --git a/src/Misc/externals.sh b/src/Misc/externals.sh index c6c893a0be6..7f8baf4c8b1 100755 --- a/src/Misc/externals.sh +++ b/src/Misc/externals.sh @@ -7,6 +7,7 @@ NODE_ALPINE_URL=https://github.com/actions/alpine_nodejs/releases/download # When you update Node versions you must also create a new release of alpine_nodejs at that updated version. # Follow the instructions here: https://github.com/actions/alpine_nodejs?tab=readme-ov-file#getting-started NODE20_VERSION="20.19.3" +NODE24_VERSION="24.4.0" get_abs_path() { # exploits the fact that pwd will print abs path when no args @@ -139,6 +140,8 @@ function acquireExternalTool() { if [[ "$PACKAGERUNTIME" == "win-x64" || "$PACKAGERUNTIME" == "win-x86" ]]; then acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/$PACKAGERUNTIME/node.exe" node20/bin acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/$PACKAGERUNTIME/node.lib" node20/bin + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/$PACKAGERUNTIME/node.exe" node24/bin + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/$PACKAGERUNTIME/node.lib" node24/bin if [[ "$PRECACHE" != "" ]]; then acquireExternalTool "https://github.com/microsoft/vswhere/releases/download/2.6.7/vswhere.exe" vswhere fi @@ -149,6 +152,8 @@ if [[ "$PACKAGERUNTIME" == "win-arm64" ]]; then # todo: replace these with official release when available acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/$PACKAGERUNTIME/node.exe" node20/bin acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/$PACKAGERUNTIME/node.lib" node20/bin + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/$PACKAGERUNTIME/node.exe" node24/bin + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/$PACKAGERUNTIME/node.lib" node24/bin if [[ "$PRECACHE" != "" ]]; then acquireExternalTool "https://github.com/microsoft/vswhere/releases/download/2.6.7/vswhere.exe" vswhere fi @@ -157,21 +162,26 @@ fi # Download the external tools only for OSX. if [[ "$PACKAGERUNTIME" == "osx-x64" ]]; then acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/node-v${NODE20_VERSION}-darwin-x64.tar.gz" node20 fix_nested_dir + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/node-v${NODE24_VERSION}-darwin-x64.tar.gz" node24 fix_nested_dir fi if [[ "$PACKAGERUNTIME" == "osx-arm64" ]]; then # node.js v12 doesn't support macOS on arm64. acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/node-v${NODE20_VERSION}-darwin-arm64.tar.gz" node20 fix_nested_dir + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/node-v${NODE24_VERSION}-darwin-arm64.tar.gz" node24 fix_nested_dir fi # Download the external tools for Linux PACKAGERUNTIMEs. if [[ "$PACKAGERUNTIME" == "linux-x64" ]]; then acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/node-v${NODE20_VERSION}-linux-x64.tar.gz" node20 fix_nested_dir acquireExternalTool "$NODE_ALPINE_URL/v${NODE20_VERSION}/node-v${NODE20_VERSION}-alpine-x64.tar.gz" node20_alpine + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/node-v${NODE24_VERSION}-linux-x64.tar.gz" node24 fix_nested_dir + acquireExternalTool "$NODE_ALPINE_URL/v${NODE24_VERSION}/node-v${NODE24_VERSION}-alpine-x64.tar.gz" node24_alpine fi if [[ "$PACKAGERUNTIME" == "linux-arm64" ]]; then acquireExternalTool "$NODE_URL/v${NODE20_VERSION}/node-v${NODE20_VERSION}-linux-arm64.tar.gz" node20 fix_nested_dir + acquireExternalTool "$NODE_URL/v${NODE24_VERSION}/node-v${NODE24_VERSION}-linux-arm64.tar.gz" node24 fix_nested_dir fi if [[ "$PACKAGERUNTIME" == "linux-arm" ]]; then diff --git a/src/Misc/layoutbin/update.sh.template b/src/Misc/layoutbin/update.sh.template index 832385edd5f..476ae11e57d 100755 --- a/src/Misc/layoutbin/update.sh.template +++ b/src/Misc/layoutbin/update.sh.template @@ -135,12 +135,17 @@ if [[ "$currentplatform" == 'darwin' && restartinteractiverunner -eq 0 ]]; then then # inspect the open file handles to find the node process # we can't actually inspect the process using ps because it uses relative paths and doesn't follow symlinks - nodever="node20" + # Try finding node24 first, then fallback to earlier versions if needed + nodever="node24" path=$(lsof -a -g "$procgroup" -F n | grep $nodever/bin/node | grep externals | tail -1 | cut -c2-) - if [[ $? -ne 0 || -z "$path" ]] # Fallback if RunnerService.js was started with node16 + if [[ $? -ne 0 || -z "$path" ]] # Fallback if RunnerService.js was started with node20 then - nodever="node16" + nodever="node20" path=$(lsof -a -g "$procgroup" -F n | grep $nodever/bin/node | grep externals | tail -1 | cut -c2-) + if [[ $? -ne 0 || -z "$path" ]] # Fallback if RunnerService.js was started with node16 + then + nodever="node16" + path=$(lsof -a -g "$procgroup" -F n | grep $nodever/bin/node | grep externals | tail -1 | cut -c2-) if [[ $? -ne 0 || -z "$path" ]] # Fallback if RunnerService.js was started with node12 then nodever="node12" diff --git a/src/Runner.Common/Util/NodeUtil.cs b/src/Runner.Common/Util/NodeUtil.cs index 1a9252cde0f..65a3278fb02 100644 --- a/src/Runner.Common/Util/NodeUtil.cs +++ b/src/Runner.Common/Util/NodeUtil.cs @@ -18,5 +18,22 @@ public static string GetInternalNodeVersion() } return _defaultNodeVersion; } + + /// + /// Checks if Node24 is requested but running on ARM32 Linux, and determines if fallback is needed. + /// + /// The preferred Node version + /// A tuple containing the adjusted node version and an optional warning message + public static (string nodeVersion, string warningMessage) CheckNodeVersionForLinuxArm32(string preferredVersion) + { + if (string.Equals(preferredVersion, "node24", StringComparison.OrdinalIgnoreCase) && + Constants.Runner.PlatformArchitecture.Equals(Constants.Architecture.Arm) && + Constants.Runner.Platform.Equals(Constants.OSPlatform.Linux)) + { + return ("node20", "Node 24 is not supported on Linux ARM32 platforms. Falling back to Node 20."); + } + + return (preferredVersion, null); + } } } diff --git a/src/Runner.Worker/ActionManifestManager.cs b/src/Runner.Worker/ActionManifestManager.cs index 351c2427daf..c731b3d5d5c 100644 --- a/src/Runner.Worker/ActionManifestManager.cs +++ b/src/Runner.Worker/ActionManifestManager.cs @@ -450,7 +450,8 @@ private ActionExecutionData ConvertRuns( } else if (string.Equals(usingToken.Value, "node12", StringComparison.OrdinalIgnoreCase) || string.Equals(usingToken.Value, "node16", StringComparison.OrdinalIgnoreCase) || - string.Equals(usingToken.Value, "node20", StringComparison.OrdinalIgnoreCase)) + string.Equals(usingToken.Value, "node20", StringComparison.OrdinalIgnoreCase) || + string.Equals(usingToken.Value, "node24", StringComparison.OrdinalIgnoreCase)) { if (string.IsNullOrEmpty(mainToken?.Value)) { @@ -490,7 +491,7 @@ private ActionExecutionData ConvertRuns( } else { - throw new ArgumentOutOfRangeException($"'using: {usingToken.Value}' is not supported, use 'docker', 'node12', 'node16' or 'node20' instead."); + throw new ArgumentOutOfRangeException($"'using: {usingToken.Value}' is not supported, use 'docker', 'node12', 'node16', 'node20' or 'node24' instead."); } } else if (pluginToken != null) @@ -501,7 +502,7 @@ private ActionExecutionData ConvertRuns( }; } - throw new NotSupportedException("Missing 'using' value. 'using' requires 'composite', 'docker', 'node12', 'node16' or 'node20'."); + throw new NotSupportedException("Missing 'using' value. 'using' requires 'composite', 'docker', 'node12', 'node16', 'node20' or 'node24'."); } private void ConvertInputs( diff --git a/src/Runner.Worker/Handlers/StepHost.cs b/src/Runner.Worker/Handlers/StepHost.cs index 1270dd90e6f..211009658e4 100644 --- a/src/Runner.Worker/Handlers/StepHost.cs +++ b/src/Runner.Worker/Handlers/StepHost.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using GitHub.DistributedTask.Pipelines.ContextData; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -9,7 +8,6 @@ using GitHub.Runner.Sdk; using System.Linq; using GitHub.Runner.Worker.Container.ContainerHooks; -using System.IO; using System.Threading.Channels; namespace GitHub.Runner.Worker.Handlers @@ -60,7 +58,14 @@ public string ResolvePathForStepHost(IExecutionContext executionContext, string public Task DetermineNodeRuntimeVersion(IExecutionContext executionContext, string preferredVersion) { - return Task.FromResult(preferredVersion); + // Use NodeUtil to check if Node24 is requested but we're on ARM32 Linux + var (nodeVersion, warningMessage) = Common.Util.NodeUtil.CheckNodeVersionForLinuxArm32(preferredVersion); + if (!string.IsNullOrEmpty(warningMessage)) + { + executionContext.Warning(warningMessage); + } + + return Task.FromResult(nodeVersion); } public async Task ExecuteAsync(IExecutionContext context, @@ -137,8 +142,12 @@ public string ResolvePathForStepHost(IExecutionContext executionContext, string public async Task DetermineNodeRuntimeVersion(IExecutionContext executionContext, string preferredVersion) { - // Optimistically use the default - string nodeExternal = preferredVersion; + // Use NodeUtil to check if Node24 is requested but we're on ARM32 Linux + var (nodeExternal, warningMessage) = Common.Util.NodeUtil.CheckNodeVersionForLinuxArm32(preferredVersion); + if (!string.IsNullOrEmpty(warningMessage)) + { + executionContext.Warning(warningMessage); + } if (FeatureManager.IsContainerHooksEnabled(executionContext.Global.Variables)) { @@ -264,7 +273,14 @@ await containerHookManager.RunScriptStepAsync(context, private string CheckPlatformForAlpineContainer(IExecutionContext executionContext, string preferredVersion) { - string nodeExternal = preferredVersion; + // Use NodeUtil to check if Node24 is requested but we're on ARM32 Linux + var (nodeExternal, warningMessage) = Common.Util.NodeUtil.CheckNodeVersionForLinuxArm32(preferredVersion); + if (!string.IsNullOrEmpty(warningMessage)) + { + executionContext.Warning(warningMessage); + } + + // Check for Alpine container compatibility if (!Constants.Runner.PlatformArchitecture.Equals(Constants.Architecture.X64)) { var os = Constants.Runner.Platform.ToString(); diff --git a/src/Test/L0/Worker/ActionManagerL0.cs b/src/Test/L0/Worker/ActionManagerL0.cs index 50d5b99d106..328c5b5f61b 100644 --- a/src/Test/L0/Worker/ActionManagerL0.cs +++ b/src/Test/L0/Worker/ActionManagerL0.cs @@ -1659,6 +1659,76 @@ public void LoadsNode20ActionDefinition() Teardown(); } } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void LoadsNode24ActionDefinition() + { + try + { + // Arrange. + Setup(); + const string Content = @" +# Container action +name: 'Hello World' +description: 'Greet the world and record the time' +author: 'GitHub' +inputs: + greeting: # id of input + description: 'The greeting we choose - will print ""{greeting}, World!"" on stdout' + required: true + default: 'Hello' + entryPoint: # id of input + description: 'optional docker entrypoint overwrite.' + required: false +outputs: + time: # id of output + description: 'The time we did the greeting' +icon: 'hello.svg' # vector art to display in the GitHub Marketplace +color: 'green' # optional, decorates the entry in the GitHub Marketplace +runs: + using: 'node24' + main: 'task.js' +"; + Pipelines.ActionStep instance; + string directory; + CreateAction(yamlContent: Content, instance: out instance, directory: out directory); + + // Act. + Definition definition = _actionManager.LoadAction(_ec.Object, instance); + + // Assert. + Assert.NotNull(definition); + Assert.Equal(directory, definition.Directory); + Assert.NotNull(definition.Data); + Assert.NotNull(definition.Data.Inputs); // inputs + Dictionary inputDefaults = new(StringComparer.OrdinalIgnoreCase); + foreach (var input in definition.Data.Inputs) + { + var name = input.Key.AssertString("key").Value; + var value = input.Value.AssertScalar("value").ToString(); + + _hc.GetTrace().Info($"Default: {name} = {value}"); + inputDefaults[name] = value; + } + + Assert.Equal(2, inputDefaults.Count); + Assert.True(inputDefaults.ContainsKey("greeting")); + Assert.Equal("Hello", inputDefaults["greeting"]); + Assert.True(string.IsNullOrEmpty(inputDefaults["entryPoint"])); + Assert.NotNull(definition.Data.Execution); // execution + + Assert.NotNull(definition.Data.Execution as NodeJSActionExecutionData); + Assert.Equal("task.js", (definition.Data.Execution as NodeJSActionExecutionData).Script); + Assert.Equal("node24", (definition.Data.Execution as NodeJSActionExecutionData).NodeVersion); + } + finally + { + Teardown(); + } + } + [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] diff --git a/src/Test/L0/Worker/ActionManifestManagerL0.cs b/src/Test/L0/Worker/ActionManifestManagerL0.cs index 91f604c0645..dae75c8f600 100644 --- a/src/Test/L0/Worker/ActionManifestManagerL0.cs +++ b/src/Test/L0/Worker/ActionManifestManagerL0.cs @@ -502,6 +502,49 @@ public void Load_Node20Action() } } + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void Load_Node24Action() + { + try + { + //Arrange + Setup(); + + var actionManifest = new ActionManifestManager(); + actionManifest.Initialize(_hc); + + //Act + var result = actionManifest.Load(_ec.Object, Path.Combine(TestUtil.GetTestDataPath(), "node24action.yml")); + + //Assert + Assert.Equal("Hello World", result.Name); + Assert.Equal("Greet the world and record the time", result.Description); + Assert.Equal(2, result.Inputs.Count); + Assert.Equal("greeting", result.Inputs[0].Key.AssertString("key").Value); + Assert.Equal("Hello", result.Inputs[0].Value.AssertString("value").Value); + Assert.Equal("entryPoint", result.Inputs[1].Key.AssertString("key").Value); + Assert.Equal("", result.Inputs[1].Value.AssertString("value").Value); + Assert.Equal(1, result.Deprecated.Count); + + Assert.True(result.Deprecated.ContainsKey("greeting")); + result.Deprecated.TryGetValue("greeting", out string value); + Assert.Equal("This property has been deprecated", value); + + Assert.Equal(ActionExecutionType.NodeJS, result.Execution.ExecutionType); + + var nodeAction = result.Execution as NodeJSActionExecutionData; + + Assert.Equal("main.js", nodeAction.Script); + Assert.Equal("node24", nodeAction.NodeVersion); + } + finally + { + Teardown(); + } + } + [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] @@ -758,7 +801,7 @@ public void Load_CompositeActionNoUsing() //Assert var err = Assert.Throws(() => actionManifest.Load(_ec.Object, action_path)); Assert.Contains($"Failed to load {action_path}", err.Message); - _ec.Verify(x => x.AddIssue(It.Is(s => s.Message.Contains("Missing 'using' value. 'using' requires 'composite', 'docker', 'node12', 'node16' or 'node20'.")), It.IsAny()), Times.Once); + _ec.Verify(x => x.AddIssue(It.Is(s => s.Message.Contains("Missing 'using' value. 'using' requires 'composite', 'docker', 'node12', 'node16', 'node20' or 'node24'.")), It.IsAny()), Times.Once); } finally { diff --git a/src/Test/L0/Worker/HandlerFactoryL0.cs b/src/Test/L0/Worker/HandlerFactoryL0.cs index 5f88d5211d0..37981e46aa9 100644 --- a/src/Test/L0/Worker/HandlerFactoryL0.cs +++ b/src/Test/L0/Worker/HandlerFactoryL0.cs @@ -33,6 +33,7 @@ private TestHostContext CreateTestContext([CallerMemberName] string testName = " [InlineData("node12", "node20")] [InlineData("node16", "node20")] [InlineData("node20", "node20")] + [InlineData("node24", "node24")] public void IsNodeVersionUpgraded(string inputVersion, string expectedVersion) { using (TestHostContext hc = CreateTestContext()) @@ -41,7 +42,7 @@ public void IsNodeVersionUpgraded(string inputVersion, string expectedVersion) var hf = new HandlerFactory(); hf.Initialize(hc); - // Server Feature Flag + // Setup variables var variables = new Dictionary(); Variables serverVariables = new(hc, variables); @@ -72,5 +73,48 @@ public void IsNodeVersionUpgraded(string inputVersion, string expectedVersion) Assert.Equal(expectedVersion, handler.Data.NodeVersion); } } + + + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void Node24ExplicitlyRequested_HonoredByDefault() + { + using (TestHostContext hc = CreateTestContext()) + { + // Arrange. + var hf = new HandlerFactory(); + hf.Initialize(hc); + + // Basic variables setup + var variables = new Dictionary(); + Variables serverVariables = new(hc, variables); + + _ec.Setup(x => x.Global).Returns(new GlobalContext() + { + Variables = serverVariables, + EnvironmentVariables = new Dictionary() + }); + + // Act - Node 24 explicitly requested in action.yml + var data = new NodeJSActionExecutionData(); + data.NodeVersion = "node24"; + var handler = hf.Create( + _ec.Object, + new ScriptReference(), + new Mock().Object, + data, + new Dictionary(), + new Dictionary(), + new Variables(hc, new Dictionary()), + "", + new List() + ) as INodeScriptActionHandler; + + // Assert - should be node24 as requested + Assert.Equal("node24", handler.Data.NodeVersion); + } + } } } diff --git a/src/Test/L0/Worker/Handlers/NodeHandlerL0.cs b/src/Test/L0/Worker/Handlers/NodeHandlerL0.cs new file mode 100644 index 00000000000..78c4053f174 --- /dev/null +++ b/src/Test/L0/Worker/Handlers/NodeHandlerL0.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using GitHub.DistributedTask.WebApi; +using GitHub.Runner.Sdk; +using GitHub.Runner.Worker; +using GitHub.Runner.Worker.Handlers; +using Moq; +using Xunit; + +namespace GitHub.Runner.Common.Tests.Worker.Handlers +{ + public sealed class NodeHandlerL0 + { + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void NodeJSActionExecutionDataSupportsNode24() + { + // Create NodeJSActionExecutionData with node24 + var nodeJSData = new NodeJSActionExecutionData + { + NodeVersion = "node24", + Script = "test.js" + }; + + // Act & Assert + Assert.Equal("node24", nodeJSData.NodeVersion); + Assert.Equal(ActionExecutionType.NodeJS, nodeJSData.ExecutionType); + } + } +} diff --git a/src/Test/L0/Worker/StepHostL0.cs b/src/Test/L0/Worker/StepHostL0.cs index 47a5d3344da..bac7d41d90a 100644 --- a/src/Test/L0/Worker/StepHostL0.cs +++ b/src/Test/L0/Worker/StepHostL0.cs @@ -162,6 +162,60 @@ public async Task DetermineNode20RuntimeVersionInUnknowContainerAsync() Assert.Equal("node20", nodeVersion); } } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public async Task DetermineNode24RuntimeVersionInAlpineContainerAsync() + { + using (TestHostContext hc = CreateTestContext()) + { + // Arrange. + var sh = new ContainerStepHost(); + sh.Initialize(hc); + sh.Container = new ContainerInfo() { ContainerId = "1234abcd" }; + + _dc.Setup(d => d.DockerExec(_ec.Object, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + .Callback((IExecutionContext ec, string id, string options, string command, List output) => + { + output.Add("alpine"); + }) + .ReturnsAsync(0); + + // Act. + var nodeVersion = await sh.DetermineNodeRuntimeVersion(_ec.Object, "node24"); + + // Assert. + Assert.Equal("node24_alpine", nodeVersion); + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public async Task DetermineNode24RuntimeVersionInUnknownContainerAsync() + { + using (TestHostContext hc = CreateTestContext()) + { + // Arrange. + var sh = new ContainerStepHost(); + sh.Initialize(hc); + sh.Container = new ContainerInfo() { ContainerId = "1234abcd" }; + + _dc.Setup(d => d.DockerExec(_ec.Object, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) + .Callback((IExecutionContext ec, string id, string options, string command, List output) => + { + output.Add("github"); + }) + .ReturnsAsync(0); + + // Act. + var nodeVersion = await sh.DetermineNodeRuntimeVersion(_ec.Object, "node24"); + + // Assert. + Assert.Equal("node24", nodeVersion); + } + } #endif } } diff --git a/src/Test/L0/Worker/StepHostNodeVersionL0.cs b/src/Test/L0/Worker/StepHostNodeVersionL0.cs new file mode 100644 index 00000000000..6ba8c9fa4e7 --- /dev/null +++ b/src/Test/L0/Worker/StepHostNodeVersionL0.cs @@ -0,0 +1,63 @@ +using GitHub.Runner.Worker; +using GitHub.Runner.Worker.Handlers; +using Moq; +using System; +using System.Runtime.InteropServices; +using Xunit; + +namespace GitHub.Runner.Common.Tests.Worker +{ + public sealed class StepHostNodeVersionL0 + { + private Mock _ec; + private DefaultStepHost _defaultStepHost; + + public StepHostNodeVersionL0() + { + _ec = new Mock(); + _defaultStepHost = new DefaultStepHost(); + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void CheckNodeVersionForArm32_Node24OnArm32Linux() + { + // Test via NodeUtil directly + string preferredVersion = "node24"; + var (nodeVersion, warningMessage) = Common.Util.NodeUtil.CheckNodeVersionForLinuxArm32(preferredVersion); + + // On ARM32 Linux, we should fall back to node20 + bool isArm32 = RuntimeInformation.ProcessArchitecture == Architecture.Arm || + Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")?.Contains("ARM") == true; + bool isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + + if (isArm32 && isLinux) + { + // Should downgrade to node20 on ARM32 Linux + Assert.Equal("node20", nodeVersion); + Assert.NotNull(warningMessage); + Assert.Contains("Node 24 is not supported on Linux ARM32 platforms", warningMessage); + } + else + { + // On non-ARM32 platforms, should pass through the version unmodified + Assert.Equal("node24", nodeVersion); + Assert.Null(warningMessage); + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void CheckNodeVersionForArm32_PassThroughNonNode24Versions() + { + string preferredVersion = "node20"; + var (nodeVersion, warningMessage) = Common.Util.NodeUtil.CheckNodeVersionForLinuxArm32(preferredVersion); + + // Should never modify the version for non-node24 inputs + Assert.Equal("node20", nodeVersion); + Assert.Null(warningMessage); + } + } +} diff --git a/src/Test/TestData/node24action.yml b/src/Test/TestData/node24action.yml new file mode 100644 index 00000000000..653e558a0c0 --- /dev/null +++ b/src/Test/TestData/node24action.yml @@ -0,0 +1,20 @@ +name: 'Hello World' +description: 'Greet the world and record the time' +author: 'Test Corporation' +inputs: + greeting: # id of input + description: 'The greeting we choose - will print ""{greeting}, World!"" on stdout' + required: true + default: 'Hello' + deprecationMessage: 'This property has been deprecated' + entryPoint: # id of input + description: 'optional docker entrypoint overwrite.' + required: false +outputs: + time: # id of output + description: 'The time we did the greeting' +icon: 'hello.svg' # vector art to display in the GitHub Marketplace +color: 'green' # optional, decorates the entry in the GitHub Marketplace +runs: + using: 'node24' + main: 'main.js' \ No newline at end of file From c765c990b9b50d78443df91cd9b54ec61b1c8a40 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:32:03 -0400 Subject: [PATCH 10/13] Update dotnet sdk to latest version @8.0.412 (#3941) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .devcontainer/devcontainer.json | 2 +- src/dev.sh | 2 +- src/global.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e6e28e5b3d0..108da52473e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,7 +4,7 @@ "features": { "ghcr.io/devcontainers/features/docker-in-docker:1": {}, "ghcr.io/devcontainers/features/dotnet": { - "version": "8.0.411" + "version": "8.0.412" }, "ghcr.io/devcontainers/features/node:1": { "version": "20" diff --git a/src/dev.sh b/src/dev.sh index 948d27be188..61c4d8286de 100755 --- a/src/dev.sh +++ b/src/dev.sh @@ -17,7 +17,7 @@ LAYOUT_DIR="$SCRIPT_DIR/../_layout" DOWNLOAD_DIR="$SCRIPT_DIR/../_downloads/netcore2x" PACKAGE_DIR="$SCRIPT_DIR/../_package" DOTNETSDK_ROOT="$SCRIPT_DIR/../_dotnetsdk" -DOTNETSDK_VERSION="8.0.411" +DOTNETSDK_VERSION="8.0.412" DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION" RUNNER_VERSION=$(cat runnerversion) diff --git a/src/global.json b/src/global.json index e5f41726d05..70253f4fb44 100644 --- a/src/global.json +++ b/src/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "8.0.411" + "version": "8.0.412" } } From dc9cf684c93b057f4eec0e67056f884944fbe2db Mon Sep 17 00:00:00 2001 From: Salman Chishti Date: Tue, 22 Jul 2025 18:59:15 +0100 Subject: [PATCH 11/13] Prepare runner release 2.327.0 (#3951) --- releaseNote.md | 14 ++++++-------- src/runnerversion | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/releaseNote.md b/releaseNote.md index 2dc0786b8a0..10c1cdcf70c 100644 --- a/releaseNote.md +++ b/releaseNote.md @@ -1,15 +1,13 @@ ## What's Changed -* runner timestamps invariant by @GhadimiR in https://github.com/actions/runner/pull/3888 -* Update README.md by @nebuk89 in https://github.com/actions/runner/pull/3898 -* Update dotnet sdk to latest version @8.0.411 by @github-actions in https://github.com/actions/runner/pull/3911 -* Update Docker to v28.2.2 and Buildx to v0.25.0 by @github-actions in https://github.com/actions/runner/pull/3918 -* Bump windows service app to dotnet 4.7 by @TingluoHuang in https://github.com/actions/runner/pull/3926 -* Upgrade node.js to latest version. by @TingluoHuang in https://github.com/actions/runner/pull/3935 +* Try add orchestrationid into user-agent using token claim. by @TingluoHuang in https://github.com/actions/runner/pull/3945 +* Fix null reference exception in user agent handling by @salmanmkc in https://github.com/actions/runner/pull/3946 +* Runner Support for executing Node24 Actions by @salmanmkc in https://github.com/actions/runner/pull/3940 +* Update dotnet sdk to latest version @8.0.412 by @github-actions[bot] in https://github.com/actions/runner/pull/3941 ## New Contributors -* @nebuk89 made their first contribution in https://github.com/actions/runner/pull/3898 +* @salmanmkc made their first contribution in https://github.com/actions/runner/pull/3946 -**Full Changelog**: https://github.com/actions/runner/compare/v2.325.0...v2.326.0 +**Full Changelog**: https://github.com/actions/runner/compare/v2.326.0...v2.327.0 _Note: Actions Runner follows a progressive release policy, so the latest release might not be available to your enterprise, organization, or repository yet. To confirm which version of the Actions Runner you should expect, please view the download instructions for your enterprise, organization, or repository. diff --git a/src/runnerversion b/src/runnerversion index 73c5522c143..fe24dbf391b 100644 --- a/src/runnerversion +++ b/src/runnerversion @@ -1 +1 @@ -2.326.0 +2.327.0 From 8a9b96806d12343f7d123c669e29c629138023dd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 22:41:02 -0400 Subject: [PATCH 12/13] Update Docker to v28.3.2 and Buildx to v0.26.1 (#3953) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- images/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/images/Dockerfile b/images/Dockerfile index 6c771235dd8..3a7294f7133 100644 --- a/images/Dockerfile +++ b/images/Dockerfile @@ -5,8 +5,8 @@ ARG TARGETOS ARG TARGETARCH ARG RUNNER_VERSION ARG RUNNER_CONTAINER_HOOKS_VERSION=0.7.0 -ARG DOCKER_VERSION=28.3.0 -ARG BUILDX_VERSION=0.25.0 +ARG DOCKER_VERSION=28.3.2 +ARG BUILDX_VERSION=0.26.1 RUN apt update -y && apt install curl unzip -y From 6ca97eeb88810dc898e04d53efcd80d8b24bc4e4 Mon Sep 17 00:00:00 2001 From: Salman Chishti Date: Fri, 25 Jul 2025 16:42:28 +0100 Subject: [PATCH 13/13] Fix if statement structure in update script and variable reference (#3956) --- src/Misc/layoutbin/update.sh.template | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Misc/layoutbin/update.sh.template b/src/Misc/layoutbin/update.sh.template index 476ae11e57d..82ada18b917 100755 --- a/src/Misc/layoutbin/update.sh.template +++ b/src/Misc/layoutbin/update.sh.template @@ -123,7 +123,7 @@ fi # fix upgrade issue with macOS when running as a service attemptedtargetedfix=0 currentplatform=$(uname | awk '{print tolower($0)}') -if [[ "$currentplatform" == 'darwin' && restartinteractiverunner -eq 0 ]]; then +if [[ "$currentplatform" == 'darwin' && $restartinteractiverunner -eq 0 ]]; then # We needed a fix for https://github.com/actions/runner/issues/743 # We will recreate the ./externals/nodeXY/bin/node of the past runner version that launched the runnerlistener service # Otherwise mac gatekeeper kills the processes we spawn on creation as we are running a process with no backing file @@ -146,10 +146,11 @@ if [[ "$currentplatform" == 'darwin' && restartinteractiverunner -eq 0 ]]; then then nodever="node16" path=$(lsof -a -g "$procgroup" -F n | grep $nodever/bin/node | grep externals | tail -1 | cut -c2-) - if [[ $? -ne 0 || -z "$path" ]] # Fallback if RunnerService.js was started with node12 - then - nodever="node12" - path=$(lsof -a -g "$procgroup" -F n | grep $nodever/bin/node | grep externals | tail -1 | cut -c2-) + if [[ $? -ne 0 || -z "$path" ]] # Fallback if RunnerService.js was started with node12 + then + nodever="node12" + path=$(lsof -a -g "$procgroup" -F n | grep $nodever/bin/node | grep externals | tail -1 | cut -c2-) + fi fi fi if [[ $? -eq 0 && -n "$path" ]]