以编程方式创建jenkins JLNP slave

时间:2017-03-08 22:42:19

标签: jenkins

我可以通过Jenkins Web GUI创建一个新节点,然后让一个容器中运行的节点通过名称和-secret值连接回Jenkins主机

离。 export LD_LIBRARY_PATH=/path/to/libXpm:$LD_LIBRARY_PATH

有没有办法以编程方式创建Jenkins节点并获取秘密和从属名称,因此我不必通过GUI进行此操作?

3 个答案:

答案 0 :(得分:8)

以编程方式创建代理

您可以使用create-node CLI命令创建具有给定配置的新代理。

例如,在文件config.xml中给出这个最小的JNLP代理配置:

<slave>
  <remoteFS>/opt/jenkins</remoteFS>
  <numExecutors>2</numExecutors>
  <launcher class="hudson.slaves.JNLPLauncher" />
</slave>

您可以通过CLI客户端或SSH界面运行create-node命令:

cat config.xml | java -jar jenkins-cli.jar -s https://jenkins/ create-node my-agent

查看代理配置

要查看现有代理的XML配置,您可以将config.xml附加到代理网址,例如https://jenkins/computer/some-agent-name/config.xml,或者您可以使用get-node CLI命令。

以编程方式获取每个代理商的密码

要在不使用Jenkins Web UI的情况下获取秘密十六进制值,您可以通过groovy CLI命令运行脚本:

echo 'println jenkins.model.Jenkins.instance.nodesObject.getNode("my-agent")?.computer?.jnlpMac' \
  | java -jar ~/Downloads/jenkins-cli.jar -s https://jenkins/ groovy =

这将直接返回秘密值。请注意,要通过SSH接口使用groovy命令,您需要Jenkins 2.46或更高版本。在早期版本中,它仅适用于CLI客户端。

答案 1 :(得分:1)

您还可以使用REST API创建代理。当前端有apache代理(请参阅问题JENKINS47279)并且不能直接访问jenkins时(例如在公司网络中),这在CLI不能正常工作时特别有用。

为此,我建议create an API token。然后你可以做这样的事情

Linux(Bash)

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"

为了通过REST API签出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/"

Windows(PS)

这是我使用Powershell的Windows解决方案:

$JENKINS_URL="https://jenkins.intra"
$JENKINS_USER="papanito"
$JENKINS_API_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxx"
$NODE_NAME="testnode-ps"

# https://stackoverflow.com/questions/27951561/use-invoke-webrequest-with-a-username-and-password-for-basic-authentication-on-t
$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"
                    }
                )
            }
        }
    }

#https://stackoverflow.com/questions/17929494/powershell-convertto-json-with-embedded-hashtable
$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"

答案 2 :(得分:0)

在这里参加聚会有点迟,但是我强烈建议您改用Jenkins Client插件。安装插件后,您只需从构建节点启动客户端JAR并为其提供主IP地址即可。

就主服务器而言,您无需进行任何配置。向主服务器注册的节点可自动用于开始执行作业。这比任何基于slave.jar的方法都容易得多。