Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ONPREM-1829] [HACKWEEK] Add initial support for Windows containers #96

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Set executable file extension
  • Loading branch information
christian-stephen committed Feb 21, 2025
commit 9519489324f3ee14588bc48cd569a72191bfaf39
26 changes: 19 additions & 7 deletions acceptance/init_test.go
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@ package acceptance
import (
"os"
"path/filepath"
"runtime"
"testing"
"time"

@@ -14,11 +15,11 @@ import (
func TestInit(t *testing.T) {
srcDir := createMockSourceFiles(t)
destDir := t.TempDir()
orchSrc := filepath.Join(srcDir, "orchestrator")
orchDest := filepath.Join(destDir, "orchestrator")
agentSrc := filepath.Join(srcDir, "circleci-agent")
agentDest := filepath.Join(destDir, "circleci-agent")
circleciDest := filepath.Join(destDir, "circleci")
orchSrc := path(t, srcDir, "orchestrator")
orchDest := path(t, destDir, "orchestrator")
agentSrc := path(t, srcDir, "circleci-agent")
agentDest := path(t, destDir, "circleci-agent")
circleciDest := path(t, destDir, "circleci")

r := runner.New(
"SOURCE="+srcDir,
@@ -54,10 +55,10 @@ func createMockSourceFiles(t *testing.T) string {

srcDir := t.TempDir()

err := os.WriteFile(filepath.Join(srcDir, "orchestrator"), []byte("mock orchestrator data"), 0600)
err := os.WriteFile(path(t, srcDir, "orchestrator"), []byte("mock orchestrator data"), 0600)
assert.NilError(t, err)

err = os.WriteFile(filepath.Join(srcDir, "circleci-agent"), []byte("mock agent data"), 0600)
err = os.WriteFile(path(t, srcDir, "circleci-agent"), []byte("mock agent data"), 0600)
assert.NilError(t, err)

return srcDir
@@ -78,3 +79,14 @@ func assertFileIsCopied(t *testing.T, src, dest string) {
assert.NilError(t, err)
assert.Check(t, cmp.DeepEqual(srcContents, destContents), "files should have same contents")
}

func path(t *testing.T, a, b string) string {
t.Helper()

p := filepath.Join(a, b)

if runtime.GOOS == "windows" {
return p + ".exe"
}
return p
}
4 changes: 3 additions & 1 deletion docker/windows.Dockerfile
Original file line number Diff line number Diff line change
@@ -13,4 +13,6 @@ FROM mcr.microsoft.com/windows/nanoserver:ltsc2025

COPY --from=builder / /

ENTRYPOINT ["c:\\orchestrator.exe", "init"]
WORKDIR /

ENTRYPOINT ["orchestrator.exe", "init"]
9 changes: 9 additions & 0 deletions init/binaries_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//go:build !windows

package init

const (
binOrchestrator = "orchestrator"
binCircleciAgent = "circleci-agent"
binCircleci = "circleci"
)
7 changes: 7 additions & 0 deletions init/binaries_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package init

const (
binOrchestrator = "orchestrator.exe"
binCircleciAgent = "circleci-agent.exe"
binCircleci = "circleci.exe"
)
10 changes: 5 additions & 5 deletions init/init.go
Original file line number Diff line number Diff line change
@@ -10,20 +10,20 @@ import (
// Run function performs the copying of specific files and symlink creation
func Run(srcDir, destDir string) error {
// Copy the orchestrator binary
orchestratorSrc := filepath.Join(srcDir, "orchestrator")
orchestratorDest := filepath.Join(destDir, "orchestrator")
orchestratorSrc := filepath.Join(srcDir, binOrchestrator)
orchestratorDest := filepath.Join(destDir, binOrchestrator)
if err := copyFile(orchestratorSrc, orchestratorDest); err != nil {
return err
}

// Copy the task agent binary
agentSrc := filepath.Join(srcDir, "circleci-agent")
agentDest := filepath.Join(destDir, "circleci-agent")
agentSrc := filepath.Join(srcDir, binCircleciAgent)
agentDest := filepath.Join(destDir, binCircleciAgent)
if err := copyFile(agentSrc, agentDest); err != nil {
return err
}
// Create symbolic link from "circleci-agent" to "circleci"
if err := os.Symlink(agentDest, filepath.Join(destDir, "circleci")); err != nil {
if err := os.Symlink(agentDest, filepath.Join(destDir, binCircleci)); err != nil {
return err
}

14 changes: 7 additions & 7 deletions init/init_test.go
Original file line number Diff line number Diff line change
@@ -13,11 +13,11 @@ import (
func TestRun(t *testing.T) {
srcDir := createMockSourceFiles(t)
destDir := t.TempDir()
orchSrc := filepath.Join(srcDir, "orchestrator")
orchDest := filepath.Join(destDir, "orchestrator")
agentSrc := filepath.Join(srcDir, "circleci-agent")
agentDest := filepath.Join(destDir, "circleci-agent")
circleciDest := filepath.Join(destDir, "circleci")
orchSrc := filepath.Join(srcDir, binOrchestrator)
orchDest := filepath.Join(destDir, binOrchestrator)
agentSrc := filepath.Join(srcDir, binCircleciAgent)
agentDest := filepath.Join(destDir, binCircleciAgent)
circleciDest := filepath.Join(destDir, binCircleci)

t.Run("Copy files and create symlink", func(t *testing.T) {
err := Run(srcDir, destDir)
@@ -47,10 +47,10 @@ func createMockSourceFiles(t *testing.T) string {

srcDir := t.TempDir()

err := os.WriteFile(filepath.Join(srcDir, "orchestrator"), []byte("mock orchestrator data"), 0600)
err := os.WriteFile(filepath.Join(srcDir, binOrchestrator), []byte("mock orchestrator data"), 0600)
assert.NilError(t, err)

err = os.WriteFile(filepath.Join(srcDir, "circleci-agent"), []byte("mock agent data"), 0600)
err = os.WriteFile(filepath.Join(srcDir, binCircleciAgent), []byte("mock agent data"), 0600)
assert.NilError(t, err)

return srcDir