From 1efda78f2bccb7b5654e6d02131ff2b1260b2663 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Tue, 12 Apr 2022 13:15:54 +0200 Subject: [PATCH] use go-winres for windows build and cleanup autogen and winresources Signed-off-by: CrazyMax --- .gitignore | 3 - Dockerfile.windows | 20 ++++- Makefile | 13 +-- cmd/dockerd/docker_windows.go | 1 - dockerversion/version_lib.go | 4 - hack/ci/windows.ps1 | 9 -- hack/make.ps1 | 22 +++-- hack/make/.go-autogen.ps1 | 151 ++++++++++++++++++++++++---------- vendor.mod | 4 - vendor/modules.txt | 4 - 10 files changed, 144 insertions(+), 87 deletions(-) diff --git a/.gitignore b/.gitignore index 18acfe87de..aa50be77c6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ test.main .editorconfig .gopath/ .go-pkg-cache/ -autogen/ bundles/ cli/winresources/**/winres.json cli/winresources/**/*.syso @@ -26,5 +25,3 @@ junit-report.xml # top-level go.mod is not meant to be checked in /go.mod -# workaround go.mod for autogen/winresources/dockerd -/hack/make/.resources-windows/go.mod diff --git a/Dockerfile.windows b/Dockerfile.windows index 881b111ed7..ff23934cf8 100644 --- a/Dockerfile.windows +++ b/Dockerfile.windows @@ -168,6 +168,7 @@ SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPref ARG GO_VERSION=1.18.0 ARG CONTAINERD_VERSION=1.6.2 ARG GOTESTSUM_VERSION=v1.7.0 +ARG GOWINRES_VERSION=v0.2.3 # Environment variable notes: # - GO_VERSION must be consistent with 'Dockerfile' used by Linux. @@ -179,7 +180,8 @@ ENV GO_VERSION=${GO_VERSION} ` GOPATH=C:\gopath ` GO111MODULE=off ` FROM_DOCKERFILE=1 ` - GOTESTSUM_VERSION=${GOTESTSUM_VERSION} + GOTESTSUM_VERSION=${GOTESTSUM_VERSION} ` + GOWINRES_VERSION=${GOWINRES_VERSION} RUN ` Function Test-Nano() { ` @@ -289,6 +291,22 @@ RUN ` ` Install-GoTestSum +RUN ` + Function Install-GoWinres() { ` + $Env:GO111MODULE = 'on'; ` + $tmpGobin = "${Env:GOBIN_TMP}"; ` + $Env:GOBIN = """${Env:GOPATH}`\bin"""; ` + Write-Host "INFO: Installing go-winres version $Env:GOWINRES_VERSION in $Env:GOBIN"; ` + &go install "github.com/tc-hib/go-winres@${Env:GOWINRES_VERSION}"; ` + $Env:GOBIN = "${tmpGobin}"; ` + $Env:GO111MODULE = 'off'; ` + if ($LASTEXITCODE -ne 0) { ` + Throw '"go-winres install failed..."'; ` + } ` + } ` + ` + Install-GoWinres + # Make PowerShell the default entrypoint ENTRYPOINT ["powershell.exe"] diff --git a/Makefile b/Makefile index a4ff173782..b3a8d410be 100644 --- a/Makefile +++ b/Makefile @@ -166,21 +166,14 @@ default: binary all: build ## validate all checks, build linux binaries, run all tests,\ncross build non-linux binaries, and generate archives $(DOCKER_RUN_DOCKER) bash -c 'hack/validate/default && hack/make.sh' -# This is only used to work around read-only bind mounts of the source code into -# binary build targets. We end up mounting a tmpfs over autogen which allows us -# to write build-time generated assets even though the source is mounted read-only -# ...But in order to do so, this dir needs to already exist. -autogen: - mkdir -p autogen - -binary: buildx autogen ## build statically linked linux binaries +binary: buildx ## build statically linked linux binaries $(BUILD_CMD) $(BUILD_OPTS) --output=bundles/ --target=$@ $(VERSION_AUTOGEN_ARGS) . -dynbinary: buildx autogen ## build dynamically linked linux binaries +dynbinary: buildx ## build dynamically linked linux binaries $(BUILD_CMD) $(BUILD_OPTS) --output=bundles/ --target=$@ $(VERSION_AUTOGEN_ARGS) . cross: BUILD_OPTS += --build-arg CROSS=true --build-arg DOCKER_CROSSPLATFORMS -cross: buildx autogen ## cross build the binaries for darwin, freebsd and\nwindows +cross: buildx ## cross build the binaries for darwin, freebsd and\nwindows $(BUILD_CMD) $(BUILD_OPTS) --output=bundles/ --target=$@ $(VERSION_AUTOGEN_ARGS) . bundles: diff --git a/cmd/dockerd/docker_windows.go b/cmd/dockerd/docker_windows.go index a9e942a38b..9295741217 100644 --- a/cmd/dockerd/docker_windows.go +++ b/cmd/dockerd/docker_windows.go @@ -5,7 +5,6 @@ import ( "path/filepath" "github.com/Microsoft/go-winio/pkg/etwlogrus" - _ "github.com/docker/docker/autogen/winresources/dockerd" "github.com/sirupsen/logrus" ) diff --git a/dockerversion/version_lib.go b/dockerversion/version_lib.go index 96954560cd..0004619f02 100644 --- a/dockerversion/version_lib.go +++ b/dockerversion/version_lib.go @@ -1,7 +1,3 @@ -//go:build !autogen -// +build !autogen - -// Package dockerversion is auto-generated at build-time package dockerversion // import "github.com/docker/docker/dockerversion" // Default build-time variable for library-import. diff --git a/hack/ci/windows.ps1 b/hack/ci/windows.ps1 index 69b9e46192..54c3e05623 100644 --- a/hack/ci/windows.ps1 +++ b/hack/ci/windows.ps1 @@ -551,14 +551,6 @@ Try { Write-Host -ForegroundColor Magenta "WARN: Skipping building the binaries" } - Write-Host -ForegroundColor Green "INFO: Copying dockerversion from the container..." - $ErrorActionPreference = "SilentlyContinue" - docker cp "$contPath\..\dockerversion\version_autogen.go" "$env:SOURCES_DRIVE`:\$env:SOURCES_SUBDIR\src\github.com\docker\docker\dockerversion" - if (-not($LastExitCode -eq 0)) { - Throw "ERROR: Failed to docker cp the generated version_autogen.go to $env:SOURCES_DRIVE`:\$env:SOURCES_SUBDIR\src\github.com\docker\docker\dockerversion" - } - $ErrorActionPreference = "Stop" - # Grab the golang installer out of the built image. That way, we know we are consistent once extracted and paths set, # so there's no need to re-deploy on account of an upgrade to the version of GO being used in docker. if ($null -eq $env:SKIP_COPY_GO) { @@ -854,7 +846,6 @@ Try { $c += "`"$env:INTEGRATION_TEST_NAME`" " Write-Host -ForegroundColor Magenta "WARN: Only running integration tests matching $env:INTEGRATION_TEST_NAME" } - $c += "`"-tags`" " + "`"autogen`" " $c += "`"-test.timeout`" " + "`"200m`" " if ($null -ne $env:INTEGRATION_IN_CONTAINER) { diff --git a/hack/make.ps1 b/hack/make.ps1 index a183253e27..d7d3d581c0 100644 --- a/hack/make.ps1 +++ b/hack/make.ps1 @@ -168,9 +168,10 @@ Function Get-UpstreamCommit() { } # Build a binary (client or daemon) -Function Execute-Build($type, $additionalBuildTags, $directory) { +Function Execute-Build($type, $additionalBuildTags, $directory, $ldflags) { # Generate the build flags - $buildTags = "autogen" + $buildTags = "" + $ldflags = "-linkmode=internal " + $ldflags if ($Noisy) { $verboseParm=" -v" } if ($Race) { Write-Warning "Using race detector"; $raceParm=" -race"} if ($ForceBuildAll) { $allParm=" -a" } @@ -188,7 +189,7 @@ Function Execute-Build($type, $additionalBuildTags, $directory) { $allParm + ` $optParm + ` " -tags """ + $buildTags + """" + ` - " -ldflags """ + "-linkmode=internal" + """" + ` + " -ldflags """ + $ldflags + """" + ` " -o $root\bundles\"+$directory+".exe" Invoke-Expression $buildCommand if ($LASTEXITCODE -ne 0) { Throw "Failed to compile $type" } @@ -427,13 +428,20 @@ Try { # Verify GOPATH is set if ($env:GOPATH.Length -eq 0) { Throw "Missing GOPATH environment variable. See https://golang.org/doc/code.html#GOPATH" } - # Run autogen if building binaries or running unit tests. - if ($Client -or $Daemon -or $TestUnit) { + # Run autogen if building daemon. + if ($Daemon) { Write-Host "INFO: Invoking autogen..." - Try { .\hack\make\.go-autogen.ps1 -CommitString $gitCommit -DockerVersion $dockerVersion -Platform "$env:PLATFORM" -Product "$env:PRODUCT" } + Try { .\hack\make\.go-autogen.ps1 -CommitString $gitCommit -DockerVersion $dockerVersion -Platform "$env:PLATFORM" -Product "$env:PRODUCT" -PackagerName "$env:PACKAGER_NAME" } Catch [Exception] { Throw $_ } } + $ldflags = "-X 'github.com/docker/docker/dockerversion.Version="+$dockerVersion+"'" + $ldflags += " -X 'github.com/docker/docker/dockerversion.GitCommit="+$gitCommit+"'" + $ldflags += " -X 'github.com/docker/docker/dockerversion.BuildTime="+$env:BUILDTIME+"'" + $ldflags += " -X 'github.com/docker/docker/dockerversion.PlatformName="+$env:PLATFORM+"'" + $ldflags += " -X 'github.com/docker/docker/dockerversion.ProductName="+$env:PRODUCT+"'" + $ldflags += " -X 'github.com/docker/docker/dockerversion.DefaultProductLicense="+$env:DEFAULT_PRODUCT_LICENSE+"'" + # DCO, Package import and Go formatting tests. if ($DCO -or $PkgImports -or $GoFormat) { # We need the head and upstream commits for these @@ -454,7 +462,7 @@ Try { if ($Client -or $Daemon) { # Perform the actual build - if ($Daemon) { Execute-Build "daemon" "daemon" "dockerd" } + if ($Daemon) { Execute-Build "daemon" "daemon" "dockerd" $ldflags } if ($Client) { # Get the Docker channel and version from the environment, or use the defaults. if (-not ($channel = $env:DOCKERCLI_CHANNEL)) { $channel = "stable" } diff --git a/hack/make/.go-autogen.ps1 b/hack/make/.go-autogen.ps1 index 6cc658b510..1db8dac9bf 100644 --- a/hack/make/.go-autogen.ps1 +++ b/hack/make/.go-autogen.ps1 @@ -10,6 +10,22 @@ .PARAMETER DockerVersion The version such as 17.04.0-dev. This is calculated externally to this script. + +.PARAMETER Platform + The platform name, such as "Docker Engine - Community". + +.PARAMETER Product + The product name, used to set version.ProductName, which is used to set BuildKit's + ExportedProduct variable in order to show useful error messages to users when a + certain version of the product doesn't support a BuildKit feature. + +.PARAMETER DefaultProductLicense + Sets the version.DefaultProductLicense string, such as "Community Engine". This field + can contain a summary of the product license of the daemon if a commercial license has + been applied to the daemon. + +.PARAMETER PackagerName + The name of the packager (e.g. "Docker, Inc."). This used to set CompanyName in the manifest. #> param( @@ -17,7 +33,8 @@ param( [Parameter(Mandatory=$true)][string]$DockerVersion, [Parameter(Mandatory=$false)][string]$Platform, [Parameter(Mandatory=$false)][string]$Product, - [Parameter(Mandatory=$false)][string]$DefaultProductLicense + [Parameter(Mandatory=$false)][string]$DefaultProductLicense, + [Parameter(Mandatory=$false)][string]$PackagerName ) $ErrorActionPreference = "Stop" @@ -27,63 +44,109 @@ Function Get-BuildDateTime() { return $(Get-Date).ToUniversalTime() } +Function Get-Year() { + return $(Get-Date).year +} + +Function Get-FixQuadVersionNumber($number) { + if ($number -eq 0) { + return $number + } + return $number.TrimStart("0") +} + try { $buildDateTime=Get-BuildDateTime + $currentYear=Get-Year - if (Test-Path ".\autogen") { - Remove-Item ".\autogen" -Recurse -Force | Out-Null - } - - $fileContents = ' -// +build autogen - -// Package dockerversion is auto-generated at build-time -package dockerversion - -// Default build-time variable for library-import. -// This file is overridden on build with build-time information. -const ( - GitCommit string = "'+$CommitString+'" - Version string = "'+$DockerVersion+'" - BuildTime string = "'+$buildDateTime+'" - PlatformName string = "'+$Platform+'" - ProductName string = "'+$Product+'" - DefaultProductLicense string = "'+$DefaultProductLicense+'" -) - -// AUTOGENERATED FILE; see hack\make\.go-autogen.ps1 -' - - # Write the file without BOM - $outputFile="$(Get-Location)\dockerversion\version_autogen.go" - if (Test-Path $outputFile) { Remove-Item $outputFile } - [System.IO.File]::WriteAllText($outputFile, $fileContents, (New-Object System.Text.UTF8Encoding($False))) - - New-Item -ItemType Directory -Path "autogen\winresources\tmp" | Out-Null - New-Item -ItemType Directory -Path "autogen\winresources\dockerd" | Out-Null - Copy-Item "hack\make\.resources-windows\resources.go" "autogen\winresources\dockerd" + # Update PATH + $env:PATH="$env:GOPATH\bin;$env:PATH" # Generate a version in the form major,minor,patch,build - $versionQuad=$DockerVersion -replace "[^0-9.]*" -replace "\.", "," + $versionQuad=($DockerVersion -replace "[^0-9.]*") + if ($versionQuad -Match "^\d+`.\d+`.\d+$"){ + $versionQuad = $versionQuad + ".0" + } + $versionMatches = $($versionQuad | Select-String -AllMatches -Pattern "(\d+)`.(\d+)`.(\d+)`.(\d+)").Matches - # Compile the messages - windmc hack\make\.resources-windows\event_messages.mc -h autogen\winresources\tmp -r autogen\winresources\tmp - if ($LASTEXITCODE -ne 0) { Throw "Failed to compile event message resources" } + $mkwinresContents = '{ + "RT_GROUP_ICON": { + "#1": { + "0409": "../../winresources/docker.ico" + } + }, + "RT_MANIFEST": { + "#1": { + "0409": { + "identity": {}, + "description": "Docker Engine", + "minimum-os": "vista", + "execution-level": "", + "ui-access": false, + "auto-elevate": false, + "dpi-awareness": "unaware", + "disable-theming": false, + "disable-window-filtering": false, + "high-resolution-scrolling-aware": false, + "ultra-high-resolution-scrolling-aware": false, + "long-path-aware": false, + "printer-driver-isolation": false, + "gdi-scaling": false, + "segment-heap": false, + "use-common-controls-v6": false + } + } + }, + "RT_MESSAGETABLE": { + "#1": { + "0409": "../../winresources/event_messages.bin" + } + }, + "RT_VERSION": { + "#1": { + "0409": { + "fixed": { + "file_version": "'+(Get-FixQuadVersionNumber($versionMatches.Groups[1].Value))+'.'+(Get-FixQuadVersionNumber($versionMatches.Groups[2].Value))+'.'+(Get-FixQuadVersionNumber($versionMatches.Groups[3].Value))+'.'+(Get-FixQuadVersionNumber($versionMatches.Groups[4].Value))+'", + "product_version": "'+(Get-FixQuadVersionNumber($versionMatches.Groups[1].Value))+'.'+(Get-FixQuadVersionNumber($versionMatches.Groups[2].Value))+'.'+(Get-FixQuadVersionNumber($versionMatches.Groups[3].Value))+'.'+(Get-FixQuadVersionNumber($versionMatches.Groups[4].Value))+'", + "type": "Unknown" + }, + "info": { + "0000": { + "CompanyName": "'+$PackagerName+'", + "FileVersion": "'+$DockerVersion+'", + "LegalCopyright": "Copyright (C) 2015-'+$currentYear+' Docker Inc.", + "OriginalFileName": "dockerd.exe", + "ProductName": "'+$Product+'", + "ProductVersion": "'+$DockerVersion+'", + "SpecialBuild": "'+$CommitString+'" + } + } + } + } + } +}' - # If you really want to understand this madness below, search the Internet for powershell variables after verbatim arguments... Needed to get double-quotes passed through to the compiler options. - # Generate the .syso files containing all the resources and manifest needed to compile the final docker binaries. Both 32 and 64-bit clients. - $env:_ag_dockerVersion=$DockerVersion - $env:_ag_gitCommit=$CommitString + # Write the file + $outputFile="$(Get-Location)\cli\winresources\dockerd\winres.json" + if (Test-Path $outputFile) { Remove-Item $outputFile } + [System.IO.File]::WriteAllText($outputFile, $mkwinresContents) + Get-Content $outputFile | Out-Host - windres -i hack/make/.resources-windows/dockerd.rc -o autogen/winresources/dockerd/rsrc_amd64.syso -F pe-x86-64 --use-temp-file -I autogen/winresources/tmp -D DOCKER_VERSION_QUAD=$versionQuad --% -D DOCKER_VERSION=\"%_ag_dockerVersion%\" -D DOCKER_COMMIT=\"%_ag_gitCommit%\" - if ($LASTEXITCODE -ne 0) { Throw "Failed to compile daemon resources" } + # Create winresources package stub if removed while using tmpfs in Dockerfile + $stubPackage="$(Get-Location)\cli\winresources\dockerd\winresources.go" + if(![System.IO.File]::Exists($stubPackage)){ + Set-Content -NoNewline -Path $stubPackage -Value 'package winresources' + } + + # Generate + go generate -v "github.com/docker/docker/cmd/dockerd" + if ($LASTEXITCODE -ne 0) { Throw "Failed to generate version info" } } Catch [Exception] { # Throw the error onto the caller to display errors. We don't expect this script to be called directly Throw ".go-autogen.ps1 failed with error $_" } Finally { - Remove-Item .\autogen\winresources\tmp -Recurse -Force -ErrorAction SilentlyContinue | Out-Null $env:_ag_dockerVersion="" $env:_ag_gitCommit="" } diff --git a/vendor.mod b/vendor.mod index de1fbb95f2..908f416f2c 100644 --- a/vendor.mod +++ b/vendor.mod @@ -26,7 +26,6 @@ require ( github.com/creack/pty v1.1.11 github.com/deckarep/golang-set v0.0.0-20141123011944-ef32fa3046d9 github.com/docker/distribution v2.8.1+incompatible - github.com/docker/docker/autogen/winresources/dockerd v0.0.0-00010101000000-000000000000 github.com/docker/go-connections v0.4.0 github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c github.com/docker/go-metrics v0.0.1 @@ -185,6 +184,3 @@ replace ( // Removes etcd dependency replace github.com/rexray/gocsi => github.com/dperny/gocsi v1.2.3-pre - -// autogen/winresources/dockerd is generated a build time, this replacement is only for the purpose of `go mod vendor` -replace github.com/docker/docker/autogen/winresources/dockerd => ./hack/make/.resources-windows diff --git a/vendor/modules.txt b/vendor/modules.txt index f23e7e00ec..f03860640a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -284,9 +284,6 @@ github.com/docker/distribution/registry/client/auth/challenge github.com/docker/distribution/registry/client/transport github.com/docker/distribution/registry/storage/cache github.com/docker/distribution/registry/storage/cache/memory -# github.com/docker/docker/autogen/winresources/dockerd v0.0.0-00010101000000-000000000000 => ./hack/make/.resources-windows -## explicit; go 1.17 -github.com/docker/docker/autogen/winresources/dockerd # github.com/docker/go-connections v0.4.0 ## explicit github.com/docker/go-connections/nat @@ -1132,4 +1129,3 @@ gotest.tools/v3/skip # github.com/vishvananda/netlink => github.com/vishvananda/netlink v1.1.0 # go.opencensus.io => go.opencensus.io v0.22.3 # github.com/rexray/gocsi => github.com/dperny/gocsi v1.2.3-pre -# github.com/docker/docker/autogen/winresources/dockerd => ./hack/make/.resources-windows