我可以通过Jenkins Web GUI创建一个新节点,然后让一个容器中的节点通过名称和-secret值连接回Jenkins主机
恩.
docker run jenkinsci/jnlp-slave -url http://jenkins-server:port <secret> <slave name>
有没有办法以编程方式创建一个Jenkins节点并获取秘密和从属名称,所以我不必通过GUI来完成它?
您可以使用create-node CLI命令创建具有给定配置的新代理.
例如,在文件中给出这个最小的JNLP代理配置config.xml:
<slave>
<remoteFS>/opt/jenkins</remoteFS>
<numExecutors>2</numExecutors>
<launcher class="hudson.slaves.JNLPLauncher" />
</slave>
Run Code Online (Sandbox Code Playgroud)
您可以create-node通过CLI客户端或SSH界面运行该命令:
cat config.xml | java -jar jenkins-cli.jar -s https://jenkins/ create-node my-agent
Run Code Online (Sandbox Code Playgroud)
要查看现有代理的XML配置,您可以附加config.xml到代理URL,例如https://jenkins/computer/some-agent-name/config.xml,也可以使用get-nodeCLI命令.
要在不使用Jenkins Web UI的情况下获取秘密十六进制值,可以通过groovyCLI命令运行脚本:
echo 'println jenkins.model.Jenkins.instance.nodesObject.getNode("my-agent")?.computer?.jnlpMac' \
| java -jar ~/Downloads/jenkins-cli.jar -s https://jenkins/ groovy =
Run Code Online (Sandbox Code Playgroud)
这将直接返回秘密值.请注意,要groovy通过SSH界面使用该命令,您需要Jenkins 2.46或更高版本.在早期版本中,它仅适用于CLI客户端.
您还可以使用REST API创建代理。这在前面有一个 apache 代理时特别有用(请参阅问题JENKINS47279)并且没有直接访问 jenkins 否则(例如在公司网络中)CLI 将无法工作。
我建议为此目的创建一个 API 令牌。然后你可以做这样的事情
export JENKINS_URL=https://jenkins.intra
export JENKINS_USER=papanito
export JENKINS_API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxx
export NODE_NAME=testnode
export JSON_OBJECT="{ 'name':+'${NODE_NAME}',+'nodeDescription':+'Linux+slave',+'numExecutors':+'5',+'remoteFS':+'/home/jenkins/agent',+'labelString':+'SLAVE-DOCKER+linux',+'mode':+'EXCLUSIVE',+'':+['hudson.slaves.JNLPLauncher',+'hudson.slaves.RetentionStrategy\$Always'],+'launcher':+{'stapler-class':+'hudson.slaves.JNLPLauncher',+'\$class':+'hudson.slaves.JNLPLauncher',+'workDirSettings':+{'disabled':+true,+'workDirPath':+'',+'internalDir':+'remoting',+'failIfWorkDirIsMissing':+false},+'tunnel':+'',+'vmargs':+'-Xmx1024m'},+'retentionStrategy':+{'stapler-class':+'hudson.slaves.RetentionStrategy\$Always',+'\$class':+'hudson.slaves.RetentionStrategy\$Always'},+'nodeProperties':+{'stapler-class-bag':+'true',+'hudson-slaves-EnvironmentVariablesNodeProperty':+{'env':+[{'key':+'JAVA_HOME',+'value':+'/docker-java-home'},+{'key':+'JENKINS_HOME',+'value':+'/home/jenkins'}]},+'hudson-tools-ToolLocationNodeProperty':+{'locations':+[{'key':+'hudson.plugins.git.GitTool\$DescriptorImpl@Default',+'home':+'/usr/bin/git'},+{'key':+'hudson.model.JDK\$DescriptorImpl@JAVA-8',+'home':+'/usr/bin/java'},+{'key':+'hudson.tasks.Maven\$MavenInstallation\$DescriptorImpl@MAVEN-3.5.2',+'home':+'/usr/bin/mvn'}]}}}"
curl -L -s -o /dev/null -v -k -w "%{http_code}" -u "${JENKINS_USER}:${JENKINS_API_TOKEN}" -H "Content-Type:application/x-www-form-urlencoded" -X POST -d "json=${JSON_OBJECT}" "${JENKINS_URL}/computer/doCreateItem?name=${NODE_NAME}&type=hudson.slaves.DumbSlave"
Run Code Online (Sandbox Code Playgroud)
为了通过 REST API checkout this获取代理秘密,它看起来像这样:
curl -L -s -u ${JENKINS_USER}:${JENKINS_API_TOKEN} -X GET ${JENKINS_URL}/computer/${NODE_NAME}/slave-agent.jnlp | sed "s/.*<application-desc main-class=\"hudson.remoting.jnlp.Main\"><argument>\([a-z0-9]*\).*/\1/"
Run Code Online (Sandbox Code Playgroud)
这里是我使用 Powershell 的 Windows 解决方案:
$JENKINS_URL="https://jenkins.intra"
$JENKINS_USER="papanito"
$JENKINS_API_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxx"
$NODE_NAME="testnode-ps"
# /sf/ask/1956609301/
$bytes = [System.Text.Encoding]::ASCII.GetBytes("${JENKINS_USER}:${JENKINS_API_TOKEN}")
$base64 = [System.Convert]::ToBase64String($bytes)
$basicAuthValue = "Basic $base64"
$headers = @{ Authorization = $basicAuthValue; }
$hash=@{
name="${NODE_NAME}";
nodeDescription="Linux slave";
numExecutors="5";
remoteFS="/home/jenkins/agent";
labelString="SLAVE-DOCKER linux";
mode="EXCLUSIVE";
""=@(
"hudson.slaves.JNLPLauncher";
'hudson.slaves.RetentionStrategy$Always'
);
launcher=@{
"stapler-class"="hudson.slaves.JNLPLauncher";
"\$class"="hudson.slaves.JNLPLauncher";
"workDirSettings"=@{
"disabled"="true";
"workDirPath"="";
"internalDir"="remoting";
"failIfWorkDirIsMissing"="false"
};
"tunnel"="";
"vmargs"="-Xmx1024m"
};
"retentionStrategy"=@{
"stapler-class"= 'hudson.slaves.RetentionStrategy$Always';
'$class'= 'hudson.slaves.RetentionStrategy$Always'
};
"nodeProperties"=@{
"stapler-class-bag"= "true";
"hudson-slaves-EnvironmentVariablesNodeProperty"=@{
"env"=@(
@{
"key"="JAVA_HOME";
"value"="/docker-java-home"
};
@{
"key"="JENKINS_HOME";
"value"="/home/jenkins"
}
)
};
"hudson-tools-ToolLocationNodeProperty"=@{
"locations"=@(
@{
"key"= 'hudson.plugins.git.GitTool$DescriptorImpl@Default';
"home"= "/usr/bin/git"
};
@{
"key"= 'hudson.model.JDK\$DescriptorImpl@JAVA-8';
"home"= "/usr/bin/java"
};
@{
"key"= 'hudson.tasks.Maven$MavenInstallation$DescriptorImpl@MAVEN-3.5.2';
"home"= "/usr/bin/mvn"
}
)
}
}
}
#/sf/ask/1255064611/
$JSON_OBJECT = $hash | convertto-json -Depth 5
$JSON_OBJECT
Invoke-WebRequest -Headers $headers -ContentType "application/x-www-form-urlencoded" -Method POST -Body "json=${JSON_OBJECT}" -Uri "${JENKINS_URL}/computer/doCreateItem?name=${NODE_NAME}&type=hudson.slaves.DumbSlave"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5438 次 |
| 最近记录: |