Skip to content

Commit

Permalink
Merge pull request jenkinsci/docker-inbound-agent#347 from dduportal/…
Browse files Browse the repository at this point in the history
…chore/factorize-Dockerfile-per-JDK

chore(linux) factorize JDK specification to docker bakefile
  • Loading branch information
dduportal authored May 19, 2023
2 parents 7afdf6e + 9aaaaa2 commit 94765e0
Showing 1 changed file with 57 additions and 70 deletions.
127 changes: 57 additions & 70 deletions tests/inboundAgent.Tests.ps1
Original file line number Diff line number Diff line change
@@ -1,188 +1,175 @@
Import-Module -DisableNameChecking -Force $PSScriptRoot/test_helpers.psm1

$global:AGENT_IMAGE='jenkins-inbound-agent'
$global:AGENT_CONTAINER='pester-jenkins-inbound-agent'
$global:SHELL="powershell.exe"

$global:AGENT_IMAGE = Get-EnvOrDefault 'AGENT_IMAGE' ''
$global:FOLDER = Get-EnvOrDefault 'FOLDER' ''
$global:JAVA_MAJOR_VERSION = Get-EnvOrDefault 'JAVA_MAJOR_VERSION' ''
$global:VERSION = Get-EnvOrDefault 'VERSION' ''

# TODO: make this name unique for concurency
$global:CONTAINERNAME = 'pester-jenkins-inbound-agent-{0}' -f $global:AGENT_IMAGE

$REAL_FOLDER=Resolve-Path -Path "$PSScriptRoot/../${global:FOLDER}"

if(($global:FOLDER -match '^(?<jdk>[0-9]+)[\\/](?<flavor>.+)$') -and (Test-Path $REAL_FOLDER)) {
$global:JDK = $Matches['jdk']
$global:FLAVOR = $Matches['flavor']
} else {
Write-Error "Wrong folder format or folder does not exist: $global:FOLDER"
exit 1
}
$items = $global:AGENT_IMAGE.Split("-")

if($global:FLAVOR -match "nanoserver-(\d+)") {
$global:AGENT_IMAGE += "-nanoserver"
$global:AGENT_CONTAINER += "-nanoserver-$($Matches[1])"
$global:SHELL = "pwsh.exe"
}
# Remove the 'jdk' prefix (3 first characters)
$global:JDKMAJORVERSION = $items[0].Remove(0,3)
$global:WINDOWSFLAVOR = $items[1]
$global:WINDOWSVERSION = $items[2]

if($global:JDK -eq "17") {
$global:AGENT_IMAGE += ":jdk17"
$global:AGENT_CONTAINER += "-jdk17"
} else {
$global:AGENT_IMAGE += ":latest"
$global:CONTAINERSHELL="powershell.exe"
if($global:WINDOWSFLAVOR -eq 'nanoserver') {
$global:CONTAINERSHELL = "pwsh.exe"
}

Cleanup($global:AGENT_CONTAINER)

Cleanup($global:CONTAINERNAME)
Cleanup("nmap")
CleanupNetwork("jnlp-network")

BuildNcatImage

Describe "[$global:JDK $global:FLAVOR] build image" {
BeforeAll {
Push-Location -StackName 'agent' -Path "$PSScriptRoot/.."
}

Describe "[$global:AGENT_IMAGE] build image" {
It 'builds image' {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "build --tag $global:AGENT_IMAGE --file $global:FOLDER/Dockerfile ./"
$exitCode, $stdout, $stderr = Run-Program 'docker' "build --build-arg version=${global:VERSION} --build-arg JAVA_MAJOR_VERSION=${global:JAVA_MAJOR_VERSION} --tag=${global:AGENT_IMAGE} --file $global:FOLDER/Dockerfile ./"
$exitCode | Should -Be 0
}

AfterAll {
Pop-Location -StackName 'agent'
}
}

Describe "[$global:JDK $global:FLAVOR] check default user account" {
Describe "[$global:AGENT_IMAGE] check default user account" {
BeforeAll {
docker run --detach --tty --name "$global:AGENT_CONTAINER" "$global:AGENT_IMAGE" -Cmd "$global:SHELL"
docker run --detach --tty --name "$global:CONTAINERNAME" "$global:AGENT_IMAGE" -Cmd "$global:CONTAINERSHELL"
$LASTEXITCODE | Should -Be 0
Is-ContainerRunning $global:AGENT_CONTAINER | Should -BeTrue
Is-ContainerRunning $global:CONTAINERNAME | Should -BeTrue
}

It 'has a password that never expires' {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "exec $global:AGENT_CONTAINER $global:SHELL -C `"if((net user jenkins | Select-String -Pattern 'Password expires') -match 'Never') { exit 0 } else { net user jenkins ; exit -1 }`""
$exitCode, $stdout, $stderr = Run-Program 'docker' "exec $global:CONTAINERNAME $global:CONTAINERSHELL -C `"if((net user jenkins | Select-String -Pattern 'Password expires') -match 'Never') { exit 0 } else { net user jenkins ; exit -1 }`""
$exitCode | Should -Be 0
}

It 'has password policy of "not required"' {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "exec $global:AGENT_CONTAINER $global:SHELL -C `"if((net user jenkins | Select-String -Pattern 'Password required') -match 'No') { exit 0 } else { net user jenkins ; exit -1 }`""
$exitCode, $stdout, $stderr = Run-Program 'docker' "exec $global:CONTAINERNAME $global:CONTAINERSHELL -C `"if((net user jenkins | Select-String -Pattern 'Password required') -match 'No') { exit 0 } else { net user jenkins ; exit -1 }`""
$exitCode | Should -Be 0
}

AfterAll {
Cleanup($global:AGENT_CONTAINER)
Cleanup($global:CONTAINERNAME)
}
}

Describe "[$global:JDK $global:FLAVOR] image has jenkins-agent.ps1 in the correct location" {
Describe "[$global:AGENT_IMAGE] image has jenkins-agent.ps1 in the correct location" {
BeforeAll {
docker run --detach --tty --name "$global:AGENT_CONTAINER" "$global:AGENT_IMAGE" -Cmd "$global:SHELL"
docker run --detach --tty --name "$global:CONTAINERNAME" "$global:AGENT_IMAGE" -Cmd "$global:CONTAINERSHELL"
$LASTEXITCODE | Should -Be 0
Is-ContainerRunning $global:AGENT_CONTAINER | Should -BeTrue
Is-ContainerRunning $global:CONTAINERNAME | Should -BeTrue
}

It 'has jenkins-agent.ps1 in C:/ProgramData/Jenkins' {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "exec $global:AGENT_CONTAINER $global:SHELL -C `"if(Test-Path 'C:/ProgramData/Jenkins/jenkins-agent.ps1') { exit 0 } else { exit 1 }`""
$exitCode, $stdout, $stderr = Run-Program 'docker' "exec $global:CONTAINERNAME $global:CONTAINERSHELL -C `"if(Test-Path 'C:/ProgramData/Jenkins/jenkins-agent.ps1') { exit 0 } else { exit 1 }`""
$exitCode | Should -Be 0
}

AfterAll {
Cleanup($global:AGENT_CONTAINER)
Cleanup($global:CONTAINERNAME)
}
}

Describe "[$global:JDK $global:FLAVOR] image starts jenkins-agent.ps1 correctly (slow test)" {
Describe "[$global:AGENT_IMAGE] image starts jenkins-agent.ps1 correctly (slow test)" {
It 'connects to the nmap container' {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "network create --driver nat jnlp-network"
$exitCode, $stdout, $stderr = Run-Program 'docker' "network create --driver nat jnlp-network"
# Launch the netcat utility, listening at port 5000 for 30 sec
# bats will capture the output from netcat and compare the first line
# of the header of the first HTTP request with the expected one
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "run --detach --tty --name nmap --network=jnlp-network nmap:latest ncat.exe -w 30 -l 5000"
$exitCode, $stdout, $stderr = Run-Program 'docker' "run --detach --tty --name nmap --network=jnlp-network nmap:latest ncat.exe -w 30 -l 5000"
$exitCode | Should -Be 0
Is-ContainerRunning "nmap" | Should -BeTrue

# get the ip address of the nmap container
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "inspect --format `"{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}`" nmap"
$exitCode, $stdout, $stderr = Run-Program 'docker' "inspect --format `"{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}`" nmap"
$exitCode | Should -Be 0
$nmap_ip = $stdout.Trim()

# run Jenkins agent which tries to connect to the nmap container at port 5000
$secret = "aaa"
$name = "bbb"
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "run --detach --tty --network=jnlp-network --name $global:AGENT_CONTAINER $global:AGENT_IMAGE -Url http://${nmap_ip}:5000 $secret $name"
$exitCode, $stdout, $stderr = Run-Program 'docker' "run --detach --tty --network=jnlp-network --name $global:CONTAINERNAME $global:AGENT_IMAGE -Url http://${nmap_ip}:5000 $secret $name"
$exitCode | Should -Be 0
Is-ContainerRunning $global:AGENT_CONTAINER | Should -BeTrue
Is-ContainerRunning $global:CONTAINERNAME | Should -BeTrue

$exitCode, $stdout, $stderr = Run-Program 'docker.exe' 'wait nmap'
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' 'logs nmap'
$exitCode, $stdout, $stderr = Run-Program 'docker' 'wait nmap'
$exitCode, $stdout, $stderr = Run-Program 'docker' 'logs nmap'
$exitCode | Should -Be 0
$stdout | Should -Match "GET /tcpSlaveAgentListener/ HTTP/1.1`r"
}

AfterAll {
Cleanup($global:AGENT_CONTAINER)
Cleanup($global:CONTAINERNAME)
Cleanup("nmap")
CleanupNetwork("jnlp-network")
}
}

Describe "[$global:JDK $global:FLAVOR] build args" {
Describe "[$global:AGENT_IMAGE] custom build args" {
BeforeAll {
Push-Location -StackName 'agent' -Path "$PSScriptRoot/.."
# Old version used to test overriding the build arguments.
# This old version must have the same tag suffixes as the current 4 windows images (`-jdk11-nanoserver` etc.)
$TEST_VERSION="3046.v38db_38a_b_7a_86"
$DOCKER_AGENT_VERSION_SUFFIX="1"
$ARG_TEST_VERSION="${TEST_VERSION}-${DOCKER_AGENT_VERSION_SUFFIX}"
$TEST_VERSION = "3046.v38db_38a_b_7a_86"
$DOCKER_AGENT_VERSION_SUFFIX = "1"
$ARG_TEST_VERSION = "${TEST_VERSION}-${DOCKER_AGENT_VERSION_SUFFIX}"
$customImageName = "custom-${global:AGENT_IMAGE}"
}

It 'builds image with arguments' {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "build --build-arg version=${ARG_TEST_VERSION} -t $global:AGENT_IMAGE $global:FOLDER"
$exitCode, $stdout, $stderr = Run-Program 'docker' "build --build-arg version=${ARG_TEST_VERSION} --build-arg JAVA_MAJOR_VERSION=${global:JAVA_MAJOR_VERSION} --tag=${customImageName} --file=${global:FOLDER}/Dockerfile ./"
$exitCode | Should -Be 0

$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "run --detach --tty --name $global:AGENT_CONTAINER $global:AGENT_IMAGE -Cmd $global:SHELL"
$exitCode, $stdout, $stderr = Run-Program 'docker' "run --detach --tty --name $global:CONTAINERNAME $customImageName -Cmd $global:CONTAINERSHELL"
$exitCode | Should -Be 0
Is-ContainerRunning "$global:AGENT_CONTAINER" | Should -BeTrue
Is-ContainerRunning "$global:CONTAINERNAME" | Should -BeTrue
}

It "has the correct agent.jar version" {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "exec $global:AGENT_CONTAINER $global:SHELL -c `"java -cp C:/ProgramData/Jenkins/agent.jar hudson.remoting.jnlp.Main -version`""
$exitCode, $stdout, $stderr = Run-Program 'docker' "exec $global:CONTAINERNAME $global:CONTAINERSHELL -c `"java -cp C:/ProgramData/Jenkins/agent.jar hudson.remoting.jnlp.Main -version`""
$exitCode | Should -Be 0
$stdout | Should -Match $TEST_VERSION
}

AfterAll {
Cleanup($global:AGENT_CONTAINER)
Cleanup($global:CONTAINERNAME)
Pop-Location -StackName 'agent'
}
}

Describe "[$global:JDK $global:FLAVOR] passing JVM options (slow test)" {
Describe "[$global:AGENT_IMAGE] passing JVM options (slow test)" {
It "shows the java version with --show-version" {
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "network create --driver nat jnlp-network"
$exitCode, $stdout, $stderr = Run-Program 'docker' "network create --driver nat jnlp-network"
# Launch the netcat utility, listening at port 5000 for 30 sec
# bats will capture the output from netcat and compare the first line
# of the header of the first HTTP request with the expected one
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "run --detach --tty --name nmap --network=jnlp-network nmap:latest ncat.exe -w 30 -l 5000"
$exitCode, $stdout, $stderr = Run-Program 'docker' "run --detach --tty --name nmap --network=jnlp-network nmap:latest ncat.exe -w 30 -l 5000"
$exitCode | Should -Be 0
Is-ContainerRunning "nmap" | Should -BeTrue

# get the ip address of the nmap container
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "inspect --format `"{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}`" nmap"
$exitCode, $stdout, $stderr = Run-Program 'docker' "inspect --format `"{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}`" nmap"
$exitCode | Should -Be 0
$nmap_ip = $stdout.Trim()

# run Jenkins agent which tries to connect to the nmap container at port 5000
$secret = "aaa"
$name = "bbb"
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "run --detach --tty --network=jnlp-network --name $global:AGENT_CONTAINER $global:AGENT_IMAGE -Url http://${nmap_ip}:5000 -JenkinsJavaOpts `"--show-version`" $secret $name"
$exitCode, $stdout, $stderr = Run-Program 'docker' "run --detach --tty --network=jnlp-network --name $global:CONTAINERNAME $global:AGENT_IMAGE -Url http://${nmap_ip}:5000 -JenkinsJavaOpts `"--show-version`" $secret $name"
$exitCode | Should -Be 0
Is-ContainerRunning $global:AGENT_CONTAINER | Should -BeTrue
$exitCode, $stdout, $stderr = Run-Program 'docker.exe' "logs $global:AGENT_CONTAINER"
Is-ContainerRunning $global:CONTAINERNAME | Should -BeTrue
$exitCode, $stdout, $stderr = Run-Program 'docker' "logs $global:CONTAINERNAME"
$exitCode | Should -Be 0
$stdout | Should -Match "OpenJDK Runtime Environment Temurin-${global:JDK}"
$stdout | Should -Match "OpenJDK Runtime Environment Temurin-${global:JDKMAJORVERSION}"
}

AfterAll {
Cleanup($global:AGENT_CONTAINER)
Cleanup($global:CONTAINERNAME)
Cleanup("nmap")
CleanupNetwork("jnlp-network")
}
Expand Down

0 comments on commit 94765e0

Please sign in to comment.