mirror of
https://gitea.com/gitea/runner.git
synced 2026-11-04 22:37:55 +00:00
Adds a weekly and on-demand workflow that runs the cross-compiled tests on Windows Server 2025 Core in a [dockur/windows](https://github.com/dockur/windows) QEMU VM, and fixes the Windows bugs it found in host and UNC paths, env handling, shell quoting, post-task scripts, health checks, checkout, action symlinks, step summaries, Git client certificates and docker mode from a Windows host. Host-mode steps now emit UTF-8, `bash` falls back to Git's bash instead of the WSL launcher, the runner can run as a native Windows service, steps can keep background helpers with `RUNNER_TRACKING_ID`, and Windows arm64 binaries are released. Fixes: https://gitea.com/gitea/runner/issues/1339 Fixes: https://gitea.com/gitea/runner/issues/637 Fixes: https://gitea.com/gitea/runner/issues/1172 Fixes: https://gitea.com/gitea/runner/issues/347 Reviewed-on: https://gitea.com/gitea/runner/pulls/1348 Reviewed-by: bircni <[email protected]>
70 lines
2.2 KiB
Go
70 lines
2.2 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package process
|
|
|
|
import (
|
|
"os/exec"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGroupClosePropagatesToOrphan(t *testing.T) {
|
|
group, err := NewGroup()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { _ = group.Close() })
|
|
|
|
cmd, ready := newTestProcess(t, "orphan", false)
|
|
require.NoError(t, cmd.Start())
|
|
require.NoError(t, group.Assign(cmd.Process))
|
|
|
|
childPID := ready()
|
|
|
|
require.NoError(t, cmd.Wait())
|
|
require.Eventually(t, func() bool {
|
|
return !processAlive(cmd.Process.Pid)
|
|
}, 20*time.Second, 200*time.Millisecond, "the step process should have exited on its own")
|
|
|
|
require.True(t, processAlive(childPID), "orphan should outlive its parent")
|
|
|
|
require.NoError(t, group.Close())
|
|
require.Eventually(t, func() bool {
|
|
return !processAlive(childPID)
|
|
}, 20*time.Second, 200*time.Millisecond, "closing the job must terminate the orphan")
|
|
}
|
|
|
|
// TestGroupNestsWithKiller: assigned to the group first and the step's Killer
|
|
// second, cancelling the step still kills exactly that step's tree.
|
|
func TestGroupNestsWithKiller(t *testing.T) {
|
|
group, err := NewGroup()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { _ = group.Close() })
|
|
|
|
cmd := exec.Command("powershell.exe", "-NoProfile", "-Command", "Start-Sleep -Seconds 600")
|
|
require.NoError(t, cmd.Start())
|
|
t.Cleanup(func() { _ = cmd.Process.Kill() })
|
|
|
|
require.NoError(t, group.Assign(cmd.Process))
|
|
|
|
// Nesting must be accepted, else cancellation falls back to a single-process kill.
|
|
killer, err := NewKiller(cmd.Process)
|
|
require.NoError(t, err, "the step's job object must nest inside the group's")
|
|
defer killer.Close()
|
|
|
|
require.NoError(t, killer.Kill())
|
|
require.Eventually(t, func() bool {
|
|
return !processAlive(cmd.Process.Pid)
|
|
}, 20*time.Second, 200*time.Millisecond, "cancelling the step should still kill its tree")
|
|
}
|
|
|
|
// TestGroupNilSafe covers the fallback path: when the job object cannot be
|
|
// created the caller holds a nil *Group and must still be able to use it.
|
|
func TestGroupNilSafe(t *testing.T) {
|
|
var group *Group
|
|
require.NoError(t, group.Assign(nil))
|
|
require.NoError(t, group.Close())
|
|
require.NoError(t, group.Close())
|
|
}
|