podman/winmake.ps1
Mario Loriedo 2e4b640ad2 Fix windows installer deleting machine provider config file
Signed-off-by: Mario Loriedo <mario.loriedo@gmail.com>
2024-07-18 16:56:39 +02:00

338 lines
11 KiB
PowerShell

#!/usr/bin/env powershell
. ./contrib/cirrus/win-lib.ps1
# Targets
function Podman-Remote{
New-Item -ItemType Directory -Force -Path "./bin/windows"
$buildInfo = Get-Date -UFormat %s -Millisecond 0
$buildInfo = "-X github.com/containers/podman/v5/libpod/define.buildInfo=$buildInfo "
$commit = Git-Commit
$commit = "-X github.com/containers/podman/v5/libpod/define.gitCommit=$commit "
Run-Command "go build --ldflags `"$commit $buildInfo `" --tags `"$remotetags`" --o ./bin/windows/podman.exe ./cmd/podman/."
}
function Make-Clean{
Remove-Item ./bin -Recurse -Force -Confirm:$false
}
function Local-Machine {
param (
[string]$files
);
Build-Ginkgo
if ($files) {
$files = " --focus-file $files "
}
Run-Command "./test/tools/build/ginkgo.exe -vv --tags `"$remotetags`" -timeout=90m --trace --no-color $files pkg/machine/e2e/."
}
# Expect starting directory to be /podman
function Win-SSHProxy {
param (
[string]$Version
);
New-Item -ItemType Directory -Force -Path "./bin/windows"
if (-Not $Version) {
$Version = "v0.7.2"
}
curl.exe -sSL -o "./bin/windows/gvproxy.exe" --retry 5 "https://github.com/containers/gvisor-tap-vsock/releases/download/$Version/gvproxy-windowsgui.exe"
curl.exe -sSL -o "./bin/windows/win-sshproxy.exe" --retry 5 "https://github.com/containers/gvisor-tap-vsock/releases/download/$Version/win-sshproxy.exe"
}
function Installer{
param (
[string]$version,
[string]$suffix = "dev"
);
Write-Host "Building the windows installer"
# Check for the files to include in the installer
$requiredArtifacts = @(
"$PSScriptRoot\bin\windows\podman.exe"
"$PSScriptRoot\bin\windows\gvproxy.exe"
"$PSScriptRoot\bin\windows\win-sshproxy.exe"
"$PSScriptRoot\docs\build\remote\podman-for-windows.html"
)
$requiredArtifacts | ForEach-Object {
if (!(Test-Path -Path $PSItem -PathType Leaf)) {
Write-Host "$PSItem not found."
Write-Host "Make 'podman', 'win-gvproxy' and 'docs' before making the installer:"
Write-Host " .\winmake.ps1 podman-remote"
Write-Host " .\winmake.ps1 win-gvproxy"
Write-Host " .\winmake.ps1 docs"
Exit 1
}
}
# Create the ZIP file with the full client distribution
$zipFileDest = "$PSScriptRoot\contrib\win-installer\current"
Build-Distribution-Zip-File -destinationPath $zipFileDest
if (-Not $version) {
# Get Podman version from local source code
$version = Get-Podman-Version
}
# Run \contrib\win-installer\build.ps1
Push-Location $PSScriptRoot\contrib\win-installer
Run-Command ".\build.ps1 $version $suffix `"$zipFileDest`""
Pop-Location
}
function Test-Installer{
param (
[string]$version,
[ValidateSet("dev", "prod")]
[string]$flavor = "dev",
[ValidateSet("wsl", "hyperv")]
[string]$provider = "wsl"
);
if (-Not $version) {
# Get Podman version from local source code
$version = Get-Podman-Version
}
if ($flavor -eq "prod") {
$suffix = ""
} else {
$suffix = "-dev"
}
$setupExePath = "$PSScriptRoot\contrib\win-installer\podman-${version}${suffix}-setup.exe"
if (!(Test-Path -Path $setupExePath -PathType Leaf)) {
Write-Host "Setup executable not found in path $setupExePath."
Write-Host "Make 'installer' before making the installer test:"
Write-Host " .\winmake.ps1 installer"
Exit 1
}
$command = "$PSScriptRoot\contrib\win-installer\test-installer.ps1"
$command += " -scenario all"
$command += " -provider $provider"
$command += " -setupExePath $setupExePath"
Run-Command "${command}"
}
function Documentation{
Write-Host "Generating the documentation artifacts"
# Check that pandoc is installed
if (!(Get-Command -Name "pandoc" -ErrorAction SilentlyContinue)) {
Write-Host "Pandoc not found. Pandoc is required to convert the documentation Markdown files into HTML files."
Exit 1
}
# Check that the podman client is built
$podmanClient = "$PSScriptRoot\bin\windows\podman.exe"
if (!(Test-Path -Path $podmanClient -PathType Leaf)) {
Write-Host "$podmanClient not found. Make 'podman-remote' before 'documentation'."
Exit 1
}
Run-Command "$PSScriptRoot\docs\make.ps1 $podmanClient"
}
function Validate{
$podmanExecutable = "podman"
$podmanSrcVolumeMount = "${PSScriptRoot}:/go/src/github.com/containers/podman"
# All files bind mounted from a Windows host are marked as executable.
# That makes the pre-commit hook "check-executables-have-shebangs" fail.
# Setting the environment variable "SKIP=check-executables-have-shebangs"
# allow to skip that pre-commit hook.
$podmanEnvVariable = "-e SKIP=check-executables-have-shebangs"
$podmanRunArgs = "--rm -v $podmanSrcVolumeMount --security-opt label=disable -t -w /go/src/github.com/containers/podman $podmanEnvVariable"
$validateImage = "quay.io/libpod/validatepr:latest"
$validateCommand = "make .validatepr"
# Check that podman is installed
if (!(Get-Command -Name $podmanExecutable -ErrorAction SilentlyContinue)) {
Write-Host "$podmanExecutable not found. $podmanExecutable is required to run the validate script."
Exit 1
}
# Check that a podman machine exist
$currentMachine = (podman machine info -f json | ConvertFrom-Json).Host.CurrentMachine
if (!$currentMachine) {
Write-Host "Podman machine doesn't exist. Initialize and start one before running the validate script."
Exit 1
}
# Check that the podman machine is running
$state = (podman machine info -f json | ConvertFrom-Json).Host.MachineState
if ($state -ne "Running") {
Write-Host "Podman machine is not running. Start the machine before running the validate script."
Exit 1
}
Run-Command "$podmanExecutable run $podmanRunArgs $validateImage $validateCommand"
}
function Lint{
# Check that golangci-lint is installed
if (!(Get-Command -Name "golangci-lint" -ErrorAction SilentlyContinue)) {
Write-Host "The tool ""golangci-lint"" not found. Install https://golangci-lint.run/ before running the lint script."
Exit 1
}
# Check that pre-commit is installed
if (!(Get-Command -Name "pre-commit" -ErrorAction SilentlyContinue)) {
Write-Host "The tool ""pre-commit"" not found. Install https://pre-commit.com/ before running the lint script."
Exit 1
}
Run-Command "golangci-lint run --timeout=10m --build-tags=`"$remotetags`" $PSScriptRoot\cmd\podman"
Run-Command "pre-commit run --all-files"
}
# Helpers
function Build-Ginkgo{
if (Test-Path -Path ./test/tools/build/ginkgo.exe -PathType Leaf) {
return
}
Write-Host "Building Ginkgo"
Push-Location ./test/tools
Run-Command "go build -o build/ginkgo.exe ./vendor/github.com/onsi/ginkgo/v2/ginkgo"
Pop-Location
}
function Git-Commit{
# git is not installed by default on windows,
# so if we can't get the commit, we don't include this info
Get-Command git -ErrorAction SilentlyContinue | out-null
if(!$?){
return
}
$commit = git rev-parse HEAD
$dirty = git status --porcelain --untracked-files=no
if ($dirty){
$commit = "$commit-dirty"
}
return $commit
}
function Build-Distribution-Zip-File{
param (
[string]$destinationPath
);
$binariesFolder = "$PSScriptRoot\bin\windows"
$documentationFolder = "$PSScriptRoot\docs\build\remote\"
$zipFile = "$destinationPath\podman-remote-release-windows_amd64.zip"
# Create a temporary folder to store the distribution files
$tempFolder = New-Item -ItemType Directory -Force -Path "$env:TEMP\podman-windows"
# Copy bin\windows\ content to the temporary folder
Copy-Item -Recurse -Force -Path "$binariesFolder\*" -Destination "$tempFolder\"
# Copy docs\build\remote to the temporary folder
Copy-Item -Recurse -Force -Path "$documentationFolder" -Destination "$tempFolder\docs\"
# If $destination path doesn't exist, create it
if (-Not (Test-Path -Path $destinationPath -PathType Container)) {
New-Item -ItemType Directory -Force -Path $destinationPath
}
# Create the ZIP file with the full client distribution
Compress-Archive -Path "$tempFolder\*" -DestinationPath $zipFile -Force
# Delete the temporary folder
Remove-Item -Recurse -Force -Path "$tempFolder"
}
function Get-Podman-Version{
$versionSrc = "$PSScriptRoot\test\version\"
$versionBin = "$PSScriptRoot\test\version\version.exe"
# If version.exe doesn't exist, build it
if (-Not (Test-Path -Path "$versionBin" -PathType Leaf)) {
Run-Command "go build --o `"$versionBin`" `"$versionSrc`""
}
$version = Invoke-Expression "$versionBin"
# Remove the '-dev' suffix from the version
$version = $version -replace "-.*", ""
return $version
}
# Init script
$target = $args[0]
$remotetags = "remote exclude_graphdriver_btrfs btrfs_noversion exclude_graphdriver_devicemapper containers_image_openpgp"
switch ($target) {
{$_ -in '', 'podman-remote', 'podman'} {
Podman-Remote
}
'localmachine' {
if ($args.Count -gt 1) {
$files = $args[1]
}
Local-Machine -files $files
}
'clean' {
Make-Clean
}
{$_ -in 'win-sshproxy', 'win-gvproxy'} {
if ($args.Count -gt 1) {
$ref = $args[1]
}
Win-SSHProxy -Ref $ref
}
'installer' {
if ($args.Count -gt 1) {
Installer -version $args[1]
} else {
Installer
}
}
'installertest' {
if ($args.Count -gt 1) {
Test-Installer -provider $args[1]
} else {
Test-Installer
}
}
'docs' {
Documentation
}
'validatepr' {
Validate
}
'lint' {
Lint
}
default {
Write-Host "Usage: " $MyInvocation.MyCommand.Name "<target> [options]"
Write-Host
Write-Host "Example: Build podman-remote "
Write-Host " .\winmake podman-remote"
Write-Host
Write-Host "Example: Run all machine tests "
Write-Host " .\winmake localmachine"
Write-Host
Write-Host "Example: Run specfic machine tests "
Write-Host " .\winmake localmachine "basic_test.go""
Write-Host
Write-Host "Example: Download win-gvproxy and win-sshproxy helpers"
Write-Host " .\winmake win-gvproxy"
Write-Host
Write-Host "Example: Build the windows installer"
Write-Host " .\winmake installer"
Write-Host
Write-Host "Example: Run windows installer tests"
Write-Host " .\winmake installertest"
Write-Host
Write-Host "Example: Generate the documetation artifacts"
Write-Host " .\winmake docs"
Write-Host
Write-Host "Example: Validate code changes before submitting a PR"
Write-Host " .\winmake validatepr"
Write-Host
Write-Host "Example: Run linters"
Write-Host " .\winmake lint"
}
}