我正在创建一个Jenkins主/从群集,我很难找到一种方法让新的奴隶自动向主人注册。
我目前的设置是运行一些Terraform脚本,这些脚本将创建主服务器和5个从服务器。然后我必须登录主节点和管理Jenkins - >管理节点 - >新节点并手动创建我想要的节点数。
然后我RDP进入我的奴隶并运行命令java -jar agent.jar -jnlpUrl http://yourserver:port/computer/agent-name/slave-agent.jnlp
。这非常好用,但是我想要一种自动扩展/减少代理数量的方法,而不必在每次创建新的代理时手动登录到从属服务器。
是否有关于如何动态自注册节点的插件或一些文档?
注意:这仅适用于Windows节点。我正在使用Kubernetes插件自动扩展/缩小linux节点,但Kubernetes没有稳定的Windows节点支持,所以我不能使用它。我必须支持经典的.NET应用程序(不是.NET Core),因此我必须在Windows节点上构建。
我一直在AWS上测试它。
https://plugins.jenkins.io/swarm
虽然您无法在AWS上使用广播,但您可以添加到java命令并指定jenkins master的LB的主机名或URL。
我还没有检查过它在Windows上是如何工作的,但很快就会这样做,并会让你知道它是怎么回事。
我使用Swarm插件https://plugins.jenkins.io/swarm将我的Windows客户端连接到Jenkins。在启动时,我让我的VM运行这个Powershell Skript:
function startJenkinsSlave()
{
[CmdletBinding(SupportsShouldProcess=$true)]
param (
[parameter(Position = 1, Mandatory = $true)]
[string]$jkMasterUrl,
[parameter(Position = 2, Mandatory = $true)]
[string]$jkSlaveName,
[parameter(Position = 3, Mandatory = $true)]
[string]$jkSlaveUser,
[parameter(Position = 4, Mandatory = $true)]
[string]$jkSlaveSecret
)
Write-Host "--- start jenkins swarm slave ---"
Write-Host "download new Version of swarm-client.jar"
$jkSwarmJarUrl="$jkMasterUrl/swarm/swarm-client.jar"
$jkJarFilePath="C:\Program Files\Jenkins\swarm-client-$($jkSlaveName).jar"
$javaExePath="C:\ProgramData\Oracle\Java\javapath\java.exe"
Try {
[io.file]::OpenWrite($jkJarFilePath).close()
Get-ItemProperty -Path $jkJarFilePath -ErrorAction SilentlyContinue
$client = new-object System.Net.WebClient
$client.DownloadFile($jkSwarmJarUrl, $jkJarFilePath)
Write-Host "neueste Version vom swarm-client.jar wurde heruntergeladen"
Get-ItemProperty -Path $jkJarFilePath
}
Catch {
Write-Warning "Unable to write to output file $jkJarFilePath"
}
Write-Host "Jenkins slave will start:"
& $javaExePath '-Dfile.encoding=UTF8' -jar $jkJarFilePath -deleteExistingClients -master $jkMasterUrl -username $jkSlaveUser -password $jkSlaveSecret -labels "W10-swarm $jkSlaveName"
}
$jkSlaveUser='JenkinsUserForSwarm'
# Use access-token and not password!
$jkSlaveSecret='1d1a700e0a0981ef74f23efa9a6c90d39d'
$jkMasterUrl='http://jenkins.onmyhost.local:8080'
$vmName=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters' -name 'VirtualMachineName').VirtualMachineName
Write-Host "Starting Jenkins Swarm"
while($true)
{
try
{
startJenkinsSlave -jkMasterUrl $jkMasterUrl -jkSlaveName $vmName -jkSlaveUser $jkSlaveUser -jkSlaveSecret $jkSlaveSecret
}
finally
{
# ctrl-c will the skript.
Write-Host "Jenkins Slave service ended. Restart in 120 seconds"
Start-Sleep -Seconds 120
}
}
当您需要UI迭代时,此脚本可以稳定运行并为Windows从属做有用的工作。您还可以将env变量用于不同的参数(jenkins master,user,token,...)。对于Unix奴隶,可能有更好的解决方案与k8s和ssh。
此致,埃里克。
这是我在Linux上使用的bash脚本,它可以很容易地适用于Windows。
#!/bin/bash
set -xe
MASTER_URL=$1
MASTER_USERNAME=$2
MASTER_PASSWORD=$3
NODE_NAME=$4
NUM_EXECUTORS=$5
# Download CLI jar from the master
curl ${MASTER_URL}/jnlpJars/jenkins-cli.jar -o ~/jenkins-cli.jar
# Create node according to parameters passed in
cat <<EOF | java -jar ~/jenkins-cli.jar -auth "${MASTER_USERNAME}:${MASTER_PASSWORD}" -s "${MASTER_URL}" create-node "${NODE_NAME}" |true
<slave>
<name>${NODE_NAME}</name>
<description></description>
<remoteFS>/home/jenkins/agent</remoteFS>
<numExecutors>${NUM_EXECUTORS}</numExecutors>
<mode>NORMAL</mode>
<retentionStrategy class="hudson.slaves.RetentionStrategy\$Always"/>
<launcher class="hudson.slaves.JNLPLauncher">
<workDirSettings>
<disabled>false</disabled>
<internalDir>remoting</internalDir>
<failIfWorkDirIsMissing>false</failIfWorkDirIsMissing>
</workDirSettings>
</launcher>
<label></label>
<nodeProperties/>
<userId>${USER}</userId>
</slave>
EOF
# Creating the node will fail if it already exists, so |true to suppress the
# error. This probably should check if the node exists first but it should be
# possible to see any startup errors if the node doesn't attach as expected.
# Run jnlp launcher
java -jar /usr/share/jenkins/slave.jar -jnlpUrl ${MASTER_URL}/computer/${NODE_NAME}/slave-agent.jnlp -jnlpCredentials "${MASTER_USERNAME}:${MASTER_PASSWORD}"
这有点类似于docker slave映像中包含的代理启动器,但在运行jnlp之前,它使用jenkins cli在jenkins上创建节点。一些参数显然需要适应窗口。
编辑:并获得该xml最简单的方法是在web中创建一个节点,然后使用jenkins-cli来检索它。