You've already forked woodpecker
mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-11-23 21:44:44 +02:00
Docker Backend: fully support windows container (#4381)
This commit is contained in:
@@ -15,8 +15,10 @@
|
||||
package docker
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"reflect"
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker/api/types/container"
|
||||
@@ -166,7 +168,7 @@ func TestEncodeAuthToBase64(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestToConfigSmall(t *testing.T) {
|
||||
engine := docker{info: system.Info{OSType: "linux/riscv64"}}
|
||||
engine := docker{info: system.Info{OSType: "linux", Architecture: "riscv64"}}
|
||||
|
||||
conf := engine.toConfig(&backend.Step{
|
||||
Name: "test",
|
||||
@@ -193,7 +195,7 @@ func TestToConfigSmall(t *testing.T) {
|
||||
|
||||
func TestToConfigFull(t *testing.T) {
|
||||
engine := docker{
|
||||
info: system.Info{OSType: "linux/riscv64"},
|
||||
info: system.Info{OSType: "linux", Architecture: "riscv64"},
|
||||
config: config{
|
||||
enableIPv6: true,
|
||||
resourceLimit: resourceLimit{
|
||||
@@ -255,3 +257,84 @@ func TestToConfigFull(t *testing.T) {
|
||||
},
|
||||
}, conf)
|
||||
}
|
||||
|
||||
func TestToWindowsConfig(t *testing.T) {
|
||||
engine := docker{
|
||||
info: system.Info{OSType: "windows", Architecture: "x86_64"},
|
||||
config: config{
|
||||
enableIPv6: true,
|
||||
},
|
||||
}
|
||||
|
||||
conf := engine.toConfig(&backend.Step{
|
||||
Name: "test",
|
||||
UUID: "23434553",
|
||||
Type: backend.StepTypeCommands,
|
||||
Image: "golang:1.2.3",
|
||||
WorkingDir: "/src/abc",
|
||||
WorkspaceBase: "/src",
|
||||
Environment: map[string]string{
|
||||
"TAGS": "sqlite",
|
||||
"CI_WORKSPACE": "/src",
|
||||
},
|
||||
Commands: []string{"go test", "go vet ./..."},
|
||||
ExtraHosts: []backend.HostAlias{{Name: "t", IP: "1.2.3.4"}},
|
||||
Volumes: []string{"wp_default_abc:/src", "/cache:/cache/some/more", "test:/test"},
|
||||
Networks: []backend.Conn{{Name: "extra-net", Aliases: []string{"extra.net"}}},
|
||||
DNS: []string{"9.9.9.9", "8.8.8.8"},
|
||||
Failure: "fail",
|
||||
AuthConfig: backend.Auth{Username: "user", Password: "123456"},
|
||||
NetworkMode: "nat",
|
||||
Ports: []backend.Port{{Number: 21}, {Number: 22}},
|
||||
})
|
||||
|
||||
assert.NotNil(t, conf)
|
||||
sort.Strings(conf.Env)
|
||||
assert.EqualValues(t, &container.Config{
|
||||
Image: "golang:1.2.3",
|
||||
WorkingDir: "C:/src",
|
||||
AttachStdout: true,
|
||||
AttachStderr: true,
|
||||
Entrypoint: []string{"powershell", "-noprofile", "-noninteractive", "-command", "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Env:CI_SCRIPT)) | iex"},
|
||||
Labels: map[string]string{
|
||||
"wp_step": "test",
|
||||
"wp_uuid": "23434553",
|
||||
},
|
||||
Env: []string{
|
||||
"CI_SCRIPT=CiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCc7CmlmICgtbm90IChUZXN0LVBhdGggIkM6L3NyYy9hYmMiKSkgeyBOZXctSXRlbSAtUGF0aCAiQzovc3JjL2FiYyIgLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UgfTsKaWYgKC1ub3QgW0Vudmlyb25tZW50XTo6R2V0RW52aXJvbm1lbnRWYXJpYWJsZSgnSE9NRScpKSB7IFtFbnZpcm9ubWVudF06OlNldEVudmlyb25tZW50VmFyaWFibGUoJ0hPTUUnLCAnYzpccm9vdCcpIH07CmlmICgtbm90IChUZXN0LVBhdGggIiRlbnY6SE9NRSIpKSB7IE5ldy1JdGVtIC1QYXRoICIkZW52OkhPTUUiIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUZvcmNlIH07CmlmICgkRW52OkNJX05FVFJDX01BQ0hJTkUpIHsKJG5ldHJjPVtzdHJpbmddOjpGb3JtYXQoInswfVxfbmV0cmMiLCRFbnY6SE9NRSk7CiJtYWNoaW5lICRFbnY6Q0lfTkVUUkNfTUFDSElORSIgPj4gJG5ldHJjOwoibG9naW4gJEVudjpDSV9ORVRSQ19VU0VSTkFNRSIgPj4gJG5ldHJjOwoicGFzc3dvcmQgJEVudjpDSV9ORVRSQ19QQVNTV09SRCIgPj4gJG5ldHJjOwp9OwpbRW52aXJvbm1lbnRdOjpTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCJDSV9ORVRSQ19QQVNTV09SRCIsJG51bGwpOwpbRW52aXJvbm1lbnRdOjpTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCJDSV9TQ1JJUFQiLCRudWxsKTsKY2QgIkM6L3NyYy9hYmMiOwoKV3JpdGUtT3V0cHV0ICgnKyAiZ28gdGVzdCInKTsKJiBnbyB0ZXN0OyBpZiAoJExBU1RFWElUQ09ERSAtbmUgMCkge2V4aXQgJExBU1RFWElUQ09ERX0KCldyaXRlLU91dHB1dCAoJysgImdvIHZldCAuLy4uLiInKTsKJiBnbyB2ZXQgLi8uLi47IGlmICgkTEFTVEVYSVRDT0RFIC1uZSAwKSB7ZXhpdCAkTEFTVEVYSVRDT0RFfQo=",
|
||||
"CI_WORKSPACE=C:/src",
|
||||
"SHELL=powershell.exe",
|
||||
"TAGS=sqlite",
|
||||
},
|
||||
Volumes: map[string]struct{}{
|
||||
"C:/cache/some/more": {},
|
||||
"C:/src": {},
|
||||
"C:/test": {},
|
||||
},
|
||||
}, conf)
|
||||
|
||||
ciScript, err := base64.StdEncoding.DecodeString(strings.TrimPrefix(conf.Env[0], "CI_SCRIPT="))
|
||||
if assert.NoError(t, err) {
|
||||
assert.EqualValues(t, `
|
||||
$ErrorActionPreference = 'Stop';
|
||||
if (-not (Test-Path "C:/src/abc")) { New-Item -Path "C:/src/abc" -ItemType Directory -Force };
|
||||
if (-not [Environment]::GetEnvironmentVariable('HOME')) { [Environment]::SetEnvironmentVariable('HOME', 'c:\root') };
|
||||
if (-not (Test-Path "$env:HOME")) { New-Item -Path "$env:HOME" -ItemType Directory -Force };
|
||||
if ($Env:CI_NETRC_MACHINE) {
|
||||
$netrc=[string]::Format("{0}\_netrc",$Env:HOME);
|
||||
"machine $Env:CI_NETRC_MACHINE" >> $netrc;
|
||||
"login $Env:CI_NETRC_USERNAME" >> $netrc;
|
||||
"password $Env:CI_NETRC_PASSWORD" >> $netrc;
|
||||
};
|
||||
[Environment]::SetEnvironmentVariable("CI_NETRC_PASSWORD",$null);
|
||||
[Environment]::SetEnvironmentVariable("CI_SCRIPT",$null);
|
||||
cd "C:/src/abc";
|
||||
|
||||
Write-Output ('+ "go test"');
|
||||
& go test; if ($LASTEXITCODE -ne 0) {exit $LASTEXITCODE}
|
||||
|
||||
Write-Output ('+ "go vet ./..."');
|
||||
& go vet ./...; if ($LASTEXITCODE -ne 0) {exit $LASTEXITCODE}
|
||||
`, string(ciScript))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user