在这篇文章中,使用当前的LTS版本的Jenkins创建验证环境,并使用/createItem进行Job的创建与拷贝。
这里使用Easypack的Jenkins 2.164.3来创建验证用的Jenkins环境。使用如下步骤即可完成。
事前准备docker和docker-compose,版本要求如下所示:
liumiaocn:~ liumiao$ docker version
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:13:02 2018
OS/Arch: darwin/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:22:38 2018
OS/Arch: linux/amd64
Experimental: true
liumiaocn:~ liumiao$
liumiaocn:~ liumiao$ docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3
liumiaocn:~ liumiao$
使用Easypack中准备好的LTS的Jenkins镜像,启动Jenkins。
命令:git clone https://github.com/liumiaocn/easypack.git
命令:
cd easypack/containers/alpine/jenkins
docker-compose up -d
liumiaocn:jenkins liumiao$ docker-compose up -d
Creating network "jenkins_default" with the default driver
Creating jenkins_jenkins_1 ... done
liumiaocn:jenkins liumiao$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------------------
jenkins_jenkins_1 /bin/tini -- /usr/local/bi ... Up 0.0.0.0:50000->50000/tcp, 0.0.0.0:32002->8080/tcp
liumiaocn:jenkins liumiao$
此处示例通过API,创建一个Free Style的Job,Job信息如下所示
设定项目 | 设定内容 |
---|---|
Job名称 | free_style_job |
Job描述 | Free Style Job |
执行内容 | 通过Shell的方式执行命令:echo hello liumiaocn |
操作 | HTTP动作 | URI | 使用示例 |
---|---|---|---|
创建Job | POST | /createItem | /createItem?name=free_style_job |
注意此处的config.xml文件是关键,Job的描述以及FreeStyle格式中执行的具体脚本内容都需要在此文件中进行体现,此demo文件也在上传至easypack了,详细内容如下所示
liumiaocn:jenkins liumiao$ cat demo/freestyle/config.xml
<?xml version='1.1' encoding='UTF-8'?>
<project>
<description>Free Style Job</description>
<keepDependencies>false</keepDependencies>
<properties>
<com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty plugin="[email protected]">
<gitLabConnection></gitLabConnection>
</com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty>
</properties>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers/>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>echo hello liumiaocn</command>
</hudson.tasks.Shell>
</builders>
<publishers/>
<buildWrappers/>
</project>
liumiaocn:jenkins liumiao$
举一反三:
如果有其他的需要,上述的config.xml应该设定成什么样子,建议一般的开发者对此问题不要太过于纠结。可以手动从Jenkins上生成一个期待设定的文件,Jenkins会替将此config.xml文件进行生成,上述的config.xml文件也是使用这种方式生成的。但是一般需要注意的是,这个文件中自动生成的内容会包含硬编码的内容,尤其是包含插件版本信息的内容([email protected]),在实际的使用是注意不会因为版本的升级对既有技能造成太多影响的方式进行修改即可。
具体命令如下所示:
curl -X POST -u root:liumiaocn -H "Content-Type:application/xml" -d "@demo/freestyle/config.xml" http://localhost:32002/createItem?name=free_style_job
Jenkins中由于对于跨域伪造请求攻击是进行了缺省的防护的,此防护导致上述命令直接执行会失败,所以关闭或者在Header中设定Crumb信息即可保证正常执行。详细说明请参看:
使用如下命令获取crumb信息
liumiaocn:jenkins liumiao$ curl -u root:liumiaocn 'http://localhost:32002/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
Jenkins-Crumb:5955de6dcdcdb990b7341ead1045eb64liumiaocn:jenkins liumiao$
可以看到获取了格式为Jenkins-Crumb:5955de6dcdcdb990b7341ead1045eb64的crumb信息。接下来只需要将其加入到创建Job的Header中即可
liumiaocn:jenkins liumiao$ curl -X POST -u root:liumiaocn -H "Content-Type:application/xml" -H "Jenkins-Crumb:5955de6dcdcdb990b7341ead1045eb64" -d "@demo/freestyle/config.xml" http://localhost:32002/createItem?name=free_style_job
liumiaocn:jenkins liumiao$
并无异常信息显示,同时从Jenkins上也可以看到名为free_style_job的Job已经被成功创建。
然后确认此Free Style的详细信息,也可以看到预定的命令被成功设定到此Job之中了。
拷贝Job操作也基本类似,按照如下设定即可进行Job的拷贝, 当然同样需要设定Crumb或者关闭CSRF
操作 | HTTP动作 | URI | 使用示例 |
---|---|---|---|
拷贝Job | POST | /createItem | /createItem?name=free_style_job_copy&mode=copy&from=free_style_job |
curl -X POST -u root:liumiaocn -H "Content-Type:application/xml" -H "Jenkins-Crumb:5955de6dcdcdb990b7341ead1045eb64" http://localhost:32002/createItem?name=free_style_job\&mode=copy\&from=free_style_job