詹金斯奴隶自我注册

时间:2018-02-22 16:34:11

标签: jenkins jenkins-plugins jenkins-cli

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

3 个答案:

答案 0 :(得分:0)

我一直在AWS上测试它。

https://plugins.jenkins.io/swarm

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

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

答案 1 :(得分: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变量用于不同的参数(詹金斯主数据库,用户,令牌等)。 对于Unix从属服务器,使用k8s ans ssh可能会有更好的解决方案。

问候,埃里克。

答案 2 :(得分:0)

这是我在Linux上使用的bash脚本,可以很容易地将其修改为Windows。

vulnerable?

这有点类似于docker slave映像中包含的代理启动器,但是在运行jnlp之前,它使用jenkins cli在jenkins上创建节点。一些参数显然需要适应Windows。

编辑:要获得该xml,最简单的方法是在Web ui中按所需方式创建一个节点,然后使用jenkins-cli进行检索。

相关问题