詹金斯奴隶自我注册

问题描述 投票:0回答:3

我正在创建一个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节点上构建。

jenkins jenkins-plugins jenkins-cli
3个回答
0
投票

我一直在AWS上测试它。

https://plugins.jenkins.io/swarm

虽然您无法在AWS上使用广播,但您可以添加到java命令并指定jenkins master的LB的主机名或URL。

我还没有检查过它在Windows上是如何工作的,但很快就会这样做,并会让你知道它是怎么回事。


0
投票

我使用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。

此致,埃里克。


0
投票

这是我在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来检索它。

© www.soinside.com 2019 - 2024. All rights reserved.