Jenkins:在不知道节点秘密的情况下动态地将slave连接到master

时间:2015-08-05 06:11:29

标签: powershell jenkins jenkins-cli

我很难从我的专用从属计算机(Windows 2012 R2服务器)(动态)启动Jenkins从属代理。 Jenkins大师(版本1.617 - 我可以在必要时进行升级,但不会降级[在1.498之前无需凭据])在 Windows 2012 R2服务器上。 通过 Active Directory 插件和基于项目的矩阵授权策略启用并配置安全性。

由于涉及Active Directory,我不能简单地添加系统用户进行身份验证(通过-jnlpCredentials username:password-jnlpCredentials username:apitoken)。作为一种解决方法,我正在使用我的Jenkins服务用户,但我不喜欢它的API-Token在脚本中硬编码。
我正在尝试使用替代-secret secretKey,但是当主节点上注册了从节点时,随机创建了secretKey。

由于我使用Azure Slave Plugin,因此为我创建了从属节点和关联的虚拟机。 虚拟机是根据预定义的图像创建的,我可以以任何必要的方式进行更改 在这个预定义的图像中,我有一个在启动时执行的PowerShell脚本。它来自给定here的样本。它不一定是PowerShell,任何其他方式都可以。

Set-ExecutionPolicy Unrestricted

# base url to Jenkins master
$jenkinsserverurl = "https://jenkins.mycompany.com/"
# the azure-slave-plugin is creating VMs with names like 'Azure0807150842'
$vmname = (Get-Culture).TextInfo.ToTitleCase($env:computername.tolower())
# authenticate with Jenkins service user + API-token - since we don't know the '-secret'
$apiToken="jenkins_user:1234abcdefab56c7d890de1f2a345b67"

Write-Output "Downloading jenkins slave jar "
# in order to avoid updating it manually for Jenkins master updates
$slaveJarSource = $jenkinsserverurl + "jnlpJars/slave.jar"
$slaveJarLocal = "C:\jenkins_home\slave.jar"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($slaveJarSource, $slaveJarLocal)

Write-Output "Executing slave process "
$jnlpSource = $jenkinsserverurl+"computer/" + $vmname + "/slave-agent.jnlp"
# expect java.exe in the PATH, and use -noCertificateCheck to skip SSL validation
& java -jar $slaveJarLocal -jnlpCredentials $apiToken -jnlpUrl $jnlpSource -noCertificateCheck

下载JNLP文件并读取包含的密码是没有选择的,因为我也需要在Jenkins主机上进行正确的HTTP身份验证。

Write-Output "Downloading jenkins slave jnlp "
$jnlpSource = $jenkinsserverurl+"computer/" + $vmname + "/slave-agent.jnlp"
$jnlpLocal = "C:\jenkins_home\slave-agent.jnlp"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($jnlpSource, $jnlpLocal)

Write-Output "Extracting secret from jenkins slave jnlp "
[xml]$jnlpFile = Get-Content $jnlpLocal
# the first argument in the generated JNLP contains the secret
$secret = Select-Xml "//jnlp/application-desc/argument[1]/text()" $jnlpFile
  1. 如何获取生成的秘密(不禁用安全性)或
  2. 我可以使用哪种凭据(不使用实际用户 - 例如我自己或Jenkins服务用户)?

2 个答案:

答案 0 :(得分:2)

在理想的世界中,创建从属节点及其VM的插件将登录到创建的VM并执行类似于我的问题中的脚本 - 添加了注入的Jenkins服务器URL,VM名称和生成的秘密。由于当前Azure Slave Plugin版本不是这种情况,因此我坚持使用我的解决方法脚本 - 使用我现有的Jenkins服务用户。

我使用此功能让插件创建更大/更快的VM ,仅用于每日测试运行,并自动关闭其余部分时间(因此在未使用时不会产生费用)。 如果有人感兴趣,那就是我最终的设置:

  1. 广义Azure VM映像(Windows 2012 R2,带有JDK,Maven,Git 安装)。通过NSSM,我安装了PowerShell脚本(其中 启动slave代理)作为Windows服务,执行 在机器启动时自动(与问题中相同):

    Set-ExecutionPolicy Unrestricted
    
    # base url to Jenkins master
    $jenkinsserverurl = "https://jenkins.mycompany.com/"
    # the azure-slave-plugin is creating VMs with names like 'Azure0807150842'
    $vmname = (Get-Culture).TextInfo.ToTitleCase($env:computername.tolower())
    # authenticate with Jenkins service user + API-token - since we don't know the '-secret'
    $apiToken="jenkins_user:1234abcdefab56c7d890de1f2a345b67"
    
    Write-Output "Downloading jenkins slave jar "
    # in order to avoid updating it manually for Jenkins master updates
    $slaveJarSource = $jenkinsserverurl + "jnlpJars/slave.jar"
    $slaveJarLocal = "C:\jenkins_home\slave.jar"
    $wc = New-Object System.Net.WebClient
    $wc.DownloadFile($slaveJarSource, $slaveJarLocal)
    
    Write-Output "Executing slave process "
    $jnlpSource = $jenkinsserverurl+"computer/" + $vmname + "/slave-agent.jnlp"
    # expect java.exe in the PATH, and use -noCertificateCheck to skip SSL validation
    & java -jar $slaveJarLocal -jnlpCredentials $apiToken -jnlpUrl $jnlpSource -noCertificateCheck
    
  2. 安装并配置了Azure Slave插件的Jenkins master 使用此VM映像,五分钟后关闭空闲。

  3. Jenkins Maven项目(作业)配置为仅在a上运行 Azure从属节点,从Git检出我的测试项目,然后执行 从那里开始进行jUnit Selenium测试。

答案 1 :(得分:1)

我使用Jenkins Openstack插件遇到了同样的问题。

似乎他们会直接在机器的元数据中注入秘密。

https://github.com/jenkinsci/openstack-cloud-plugin/issues/104

同时,我将使用SSH奴隶,更安全,因为只需要在从属服务器中部署pub键。