-
Notifications
You must be signed in to change notification settings - Fork 1
/
build_image.ps1
118 lines (103 loc) · 3.6 KB
/
build_image.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/env pwsh
<#
.SYNOPSIS
Builds a container image
.EXAMPLE
./build_image.ps1 -Acr -Registry <registry>
.EXAMPLE
./build_image.ps1 -DevContainer
.EXAMPLE
./build_image.ps1 -Local
#>
#Requires -Version 7.2
[CmdLetBinding(DefaultParameterSetName='LocalBuild')]
param (
[parameter(Mandatory=$false,ParameterSetName='AcrBuild')]
[parameter(Mandatory=$false,ParameterSetName='LocalBuild')]
[ValidateNotNull()]
[string]
$ImageName="ubuntu-dev-tools",
[parameter(Mandatory=$false)]
[ValidateNotNull()]
[string]
$Repository="pipelineagent",
[parameter(Mandatory=$false,ParameterSetName='LocalBuild')]
[switch]
$Local=$false,
[parameter(Mandatory=$false,ParameterSetName='DevContainerBuild')]
[switch]
$DevContainer=$false,
[parameter(Mandatory=$false,ParameterSetName='AcrBuild')]
[switch]
$Acr=$false,
[parameter(Mandatory=$true,ParameterSetName='AcrBuild')]
[parameter(Mandatory=$false)]
[string]
$Registry,
[parameter(Mandatory=$false)]
[string]
$Tag="scripted",
[parameter(Mandatory=$false,ParameterSetName='LocalBuild')]
[switch]
$Scan=$false
)
. (Join-Path $PSScriptRoot functions.ps1)
try {
$imageDirectory = Join-Path (Split-Path $PSScriptRoot) images $ImageName
$dockerFile = Join-Path $imageDirectory Dockerfile
if (Test-Path $dockerFile) {
Write-Verbose "Using ${dockerFile}"
} else {
Write-Warning "${dockerFile} does not exist"
exit
}
Push-Location $imageDirectory
if ($Local) {
# Local build
Start-ContainerEngine
docker build -t ${Repository}/${ImageName}:${ImageName} .
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
$Tags = @('docker','latest',$Tag,(Get-Date).ToString("yyyyMMdd"))
foreach ($individualTag in $Tags) {
docker tag ${Repository}/${ImageName}:${ImageName} "${Repository}/${ImageName}:${individualTag}"
if ($Registry) {
docker tag ${Repository}/${ImageName}:${ImageName} ${Registry}/${Repository}/${ImageName}:${individualTag}
}
}
if ($Scan) {
docker scan $ImageName --accept-license
}
docker images --filter=reference="${Repository}/${ImageName}:*" --filter=reference="${Registry}/${Repository}/${ImageName}:*"
}
if ($DevContainer) {
Start-ContainerEngine
if ((Get-Command devcontainer)) {
$devContainerConfigPath = Get-DevContainerConfigPath
Write-Host "Building devcontainer using ${devContainerConfigPath}"
devcontainer build --config $devContainerConfigPath
} else {
Write-Warning "devcontainer-cli is not installed"
return
}
}
if ($Acr) {
# ACR build
Login-Az -DisplayMessages
az acr build -t ${Repository}/${ImageName}:acr `
-t ${Repository}/${ImageName}:latest `
-t ${Repository}/${ImageName}:${Tag} `
-t ${Repository}/${ImageName}:$((Get-Date).ToString("yyyyMMdd")) `
-r $Registry `
. `
--platform linux/amd64
az acr repository show-tags -n $Registry `
--repository ${Repository}/${ImageName} `
--detail `
--query "reverse(sort_by([].{name: '${Repository}/${ImageName}', tags: name, time: createdTime, digest: digest},&time))" `
-o table
}
} finally {
Pop-Location
}