我很难从我的专用从属计算机(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
答案 0 :(得分:2)
在理想的世界中,创建从属节点及其VM的插件将登录到创建的VM并执行类似于我的问题中的脚本 - 添加了注入的Jenkins服务器URL,VM名称和生成的秘密。由于当前Azure Slave Plugin版本不是这种情况,因此我坚持使用我的解决方法脚本 - 使用我现有的Jenkins服务用户。
我使用此功能让插件创建更大/更快的VM ,仅用于每日测试运行,并自动关闭其余部分时间(因此在未使用时不会产生费用)。 如果有人感兴趣,那就是我最终的设置:
广义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
安装并配置了Azure Slave插件的Jenkins master 使用此VM映像,五分钟后关闭空闲。
Jenkins Maven项目(作业)配置为仅在a上运行 Azure从属节点,从Git检出我的测试项目,然后执行 从那里开始进行jUnit Selenium测试。
答案 1 :(得分:1)
我使用Jenkins Openstack插件遇到了同样的问题。
似乎他们会直接在机器的元数据中注入秘密。
https://github.com/jenkinsci/openstack-cloud-plugin/issues/104
同时,我将使用SSH奴隶,更安全,因为只需要在从属服务器中部署pub键。