一、安装
1、准备工作
请先安装jdk
推荐使用 oracle jdk 而不是 centos 的yum源自带的 openjdk
默认由于版权问题,centos 默认的yum源未加入 oracle jdk 的包,默认将安装开源版本的oepnjdk
两者的名称差异是这样的:
oracle jdk: jdk-8u102-linux-x64
openjdk: java-1.8.0-openjdk
请根据需要去 oracle java 网站自行下载 jdk 的 rpm 包来安装(下述链接可能会失效)
实例:
~]# wget -O jdk-10_linux-x64_bin.rpm http://download.oracle.com/otn-pub/java/jdk/10+46/76eac37278c24557a3c4199677f19b62/jdk-10_linux-x64_bin.rpm?AuthParam=1521624974_b41b4d1af2efcf405abd3aa0a2829fa2
~]# yum localinstall jdk-10_linux-x64_bin.rpm
安装后,配置一下环境变量:
~]# cat /etc/profile.conf
export JAVA_HOME=/usr/java/default
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
_EOF
2、安装方式
1)yum源安装(推荐)
~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
~]# yum install jenkins
启动服务
~]# systemctl enable jenkins
~]# systemctl start jenkins
(防火墙略过)
2)直接下载rpm包来安装
~]# wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.4-1.1.noarch.rpm
~]# yum localinstall jenkins-2.7.4-1.1.noarch.rpm
3)直接下载指定的war包来使用
~]# mkdir -p /opt/jenkins/logs
~]# wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war -O /opt/jenkins/jenkins.war
~]# nohup java -jar /opt/jenkins/jenkins.war >/opt/jenkins/logs/$(date +%F).log 2>&1 &
3、在 docker 环境中使用
~]$ docker pull jenkins
~]$ mkdir -p /data/docker/jenkins-test
~]$ docker run -d --restart=always -p 8080:8080 -p 50000:50000 -v /data/docker/jenkins-test:/var/jenkins_home --name jenkins_36 jenkins
二、配置
1、基础
访问:http://ip_of_jenkins:8080/
初始化-安装插件-设置admin帐号
系统管理-系统设置-设置邮件等信息
创建项目
访问后,根据引导,将安装插件,但jenkins默认会去探测google能否访问,这个,,在国内会困住一批人,解决办法:
请自行搜索关键词:“jenkins connectionCheckUrl”,了解解决办法。
请根据需要安装插件,插件安装报错时,多半是有依赖关系,缺少哪个插件安装即可。
2、注意事项
1)权限
例如,使用docker服务时,jenkins 用户要加入 docker 组
usermod -a -G docker jenkins
systemctl restart jenkins
2)获取jenkins相关的几个key用于远程调用(注,新版本的jenkins的默认安全设置,导致请求时需要提供以下数据)
目的:用于 svn hook 脚本远程调用触发 jenkins 的任务。
【jenkins_api_token】
右上角用户名-菜单-设置
API Token
单击: [Show API Token...]
User ID: admin
API Token: xxxxxx
则:
jenkins_api_token='admin:xxxxxx'
【jenkins_crumb】(在每个客户端上执行的结果是不一样的)
执行:
curl -s 'http://admin:password@${jenkins_server}/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
得到:
Jenkins-Crumb:35b5802e2f723e6ff7c3c0f1eb4097cb
则:
jenkins_crumb='Jenkins-Crumb:35b5802e2f723e6ff7c3c0f1eb4097cb'
【jenkins_token】
项目-配置-构建触发器
触发远程构建 (例如,使用脚本)Help for feature: 触发远程构建 (例如,使用脚本)
身份验证令牌:test_build_token
Use the following URL to trigger build remotely: JENKINS_URL/job/projectname/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME
Optionally append &cause=Cause+Text to provide text that will be included in the recorded build cause.
则:
jenkins_token='test_build_token'
最终使用curl来调用:
curl -s \
-H "${jenkins_crumb}" \
--data-urlencode json="
{
\"parameter\": [
{
\"name\": \"string_key_1\",
\"value\": \"${string_key_1}\"
},
{
\"name\": \"string_key_2\",
\"value\": \"${string_key_2}\"
}
]
}
" "http://${jenkins_api_token}@${jenkins_server}/job/projectname/build?token=${jenkins_token}"
三、使用
1、新增一个 salve 节点
提示:先手动 ssh 测试一下连通性。
选择菜单:“Jenkins-系统管理-管理节点-新建节点”
调整部分配置:
------------------------------------------------------------------------------
Name: n32
远程工作目录: /home/jenkins
用法: 只允许运行绑定到这台机器的Job
启动方法: launch slave agents on unix machines via ssh
Host: 172.17.0.1
Credentials: (可选 ssh password 或 key 认证)
保存
------------------------------------------------------------------------------
2、创建一个任务
选择菜单:“Jenkins-新建”
------------------------------------------------------------------------------
Item名称: job1
(勾选)构建一个自由风格的软件项目
确定
项目名称: job1
(勾选)Restrict where this project can be run
Label Expression: n32
构建:
(选择)Execute shell
Command:
echo "[`date`] execute shell from jenkins." >>test.log
保存
------------------------------------------------------------------------------
3、执行任务
选择菜单:“立即构建”
页面变成:
------------------------------------------------------------------------------
Project job1
添加说明
禁用项目
工作区
最新修改记录
相关连接
Last build(#1),16 秒之前
Last stable build(#1),16 秒之前
Last successful build(#1),16 秒之前
Last completed build(#1),16 秒之前
------------------------------------------------------------------------------
4、验证任务
查看工作区:
------------------------------------------------------------------------------
Workspace of job1 on n32
test.log59 B查看
(打包下载全部文件)
------------------------------------------------------------------------------
继续查看 test.log
------------------------------------------------------------------------------
[Thu Jun 30 11:18:43 CST 2016] execute shell from jenkins.
------------------------------------------------------------------------------
重复构建2次后,再次查看内容:
------------------------------------------------------------------------------
[Thu Jun 30 11:18:43 CST 2016] execute shell from jenkins.
[Thu Jun 30 11:20:05 CST 2016] execute shell from jenkins.
[Thu Jun 30 11:20:11 CST 2016] execute shell from jenkins.
------------------------------------------------------------------------------
在左下方可以看到构建历史,内容类似这样:
------------------------------------------------------------------------------
Build History 构建历史
Success > 控制台输出 #3 2016-6-30 上午3:20
Success > 控制台输出 #2 2016-6-30 上午3:20
Success > 控制台输出 #1 2016-6-30 上午3:18
------------------------------------------------------------------------------
5、小结
本次示例,尚未使用 svn,git,仅简单示范在指定的节点上执行 shell 任务,体现出 jenkins 大致上是如何工作的。
四、插件
1、git/gitlab插件的使用示例
通常是这样的思路:
dev -> push -> gitlab(with web hook) -> jenkins-gitlab-hook -> build
1)插件
credentials:管理帐号密码
git:
gitlab-hook:配合gitlab项目下触发自动构建
选择菜单:“Jenkins-系统管理-插件管理”
-“可选菜单”:搜索需要的插件(当然,启动jenkins时引导程序已经安装了常用的插件)
-“高级”:可以手动下载.jpi后缀的插件,上传到jenkins上来安装。
插件示例:
[root@tvm01 plugins]# ls *.jpi
ace-editor.jpi durable-task.jpi git-server.jpi matrix-project.jpi plain-credentials.jpi token-macro.jpi workflow-scm-step.jpi
antisamy-markup-formatter.jpi email-ext.jpi gradle.jpi momentjs.jpi resource-disposer.jpi windows-slaves.jpi workflow-step-api.jpi
ant.jpi external-monitor-job.jpi handlebars.jpi pam-auth.jpi ruby-runtime.jpi workflow-aggregator.jpi workflow-support.jpi
bouncycastle-api.jpi git-client.jpi icon-shim.jpi pipeline-build-step.jpi scm-api.jpi workflow-api.jpi ws-cleanup.jpi
branch-api.jpi github-api.jpi jquery-detached.jpi pipeline-graph-analysis.jpi script-security.jpi workflow-basic-steps.jpi
build-timeout.jpi github-branch-source.jpi junit.jpi pipeline-input-step.jpi ssh-credentials.jpi workflow-cps-global-lib.jpi
cloudbees-folder.jpi github.jpi ldap.jpi pipeline-milestone-step.jpi ssh-slaves.jpi workflow-cps.jpi
credentials-binding.jpi github-organization-folder.jpi mailer.jpi pipeline-rest-api.jpi structs.jpi workflow-durable-task-step.jpi
credentials.jpi git.jpi mapdb-api.jpi pipeline-stage-step.jpi subversion.jpi workflow-job.jpi
display-url-api.jpi gitlab-hook.jpi matrix-auth.jpi pipeline-stage-view.jpi timestamper.jpi workflow-multibranch.jpi
2)创建一个任务
选择菜单:“Jenkins-新建”
------------------------------------------------------------------------------
Item名称: asset
(勾选)构建一个自由风格的软件项目
确定
项目名称: asset
(勾选)Restrict where this project can be run
Label Expression: n32
(注:本例中这个 slave 节点 n32 是使用 linux 帐号 jenkins 通过 ssh 连接到该 salve 节点,因而运行 job 时,也是使用的 jenkins 这个帐号,请合理的使用权限,例如配置sudo来执行命令)
源码管理:
Git:
Repositories
Repository URL: http://your_gitlab_server/user01/asset.git
Credentials: gitlab-user01(ADD新增一个相关的帐号密码)
Branches to build
Branch Specifier (blank for 'any'): */master
源码库浏览器: 自动
构建:
(选择)Execute shell
Command:
# setup
d_root='/opt/asset'
d_target="${d_root}/src_$(date +%Y%m%d_%H%M%S)"
d_link="${d_root}/latest"
sudo mkdir -p ${d_target}
# deploy
sudo rsync -av ../asset/ --exclude=".git/" ${d_target}/
sudo rm -fv ${d_link}
sudo ln -sv ${d_target} ${d_link}
sudo /bin/bash ${d_link}/ctl.sh c
sudo /bin/bash ${d_link}/ctl.sh t
sudo /bin/bash ${d_link}/ctl.sh r
# cleanup
echo "[-] List dir:"
sudo ls -l ${d_root}
echo "[-] File was last accessed n*24 hours ago:"
sudo find ${d_root} -maxdepth 1 -atime +7 -print |sort
sudo find ${d_root} -maxdepth 1 -atime +7 -exec rm -fr {} \;
echo "[-] List dir again:"
sudo ls -l ${d_root}
保存
------------------------------------------------------------------------------
3)执行任务
选择菜单:“立即构建”
结果:成功,符合预期
4)在gitlab上配置web hook
先测试一下 jenkins 插件 gitlab-hook 是否有效:
页面请求:http://ip_of_jenkins:8080/gitlab/build_now
返回结果:
------------------------------------------------------------------------------
repo url could not be found in Gitlab payload or the HTTP parameters:
- body: {}
- parameters: {
}
------------------------------------------------------------------------------
继续,在 gitlab 的项目 asset 页面上,找到“Settings-Web Hooks”
------------------------------------------------------------------------------
URL: http://ip_of_jenkins:8080/gitlab/build_now
Trigger:(勾选)Push events
------------------------------------------------------------------------------
点击“Add Web Hook”添加后,页面下方将出现这样的界面:
------------------------------------------------------------------------------
Web hooks (1)
http://ip_of_jenkins:8080/gitlab/build_now Test Hook Remove
Push Events
------------------------------------------------------------------------------
单击:“Test Hook”按钮后,回到jenkins页面,查看是否触发了新的build。
结果:符合预期。
2、svn的使用示例
1)项目配置
【General】
项目名称: job02
参数化构建过程
String parameter
名字: key01
默认值: default_not_exist
【源码管理】
在源码管理模块选择Subversion。
Repository URL中填入svn repo地址。【特别注意:注1】
Credentials中添加svn服务器的用户名和密码。
~~~~~注1
########################################################################
重点:为了避免Jenkins master时区和SVN服务器时区不一致,请在repo地址末尾添加 @HEAD,例如:http://svn_server/repo_name@HEAD
否则 jenkins 构建时 update svn 仓库是根据 jenkins 服务器当前的时间来拉取的,极可能拉取到的是一个旧的 svn 版本,从而引发错误。
jenkins 上的相关说明:
Specify the subversion repository URL to check out, such as "http://svn.apache.org/repos/asf/ant/". You can also add "@NNN" at the end of the URL to check out a specific revision number, if that's desirable. This works for Subversion Revision Keywords and Dates like e.g. "HEAD", too.
When you enter URL, Jenkins automatically checks if Jenkins can connect to it. If access requires authentication, it will ask you the necessary credential. If you already have a working credential but would like to change it for other reasons, click this link and specify different credential.
During the build, revision number of the module that was checked out is available through the environment variable SVN_REVISION, provided that you are only checking out one module. If you have multiple modules checked out, use the svnversion command. If you have multiple modules checked out, you can use the svnversion command to get the revision information, or you can use the SVN_REVISION_ environment variables, where is a 1-based index matching the locations configured. The URLs are available through similar SVN_URL_ environment variables.
svn的文档参考:
http://svnbook.red-bean.com/en/1.5/svn.tour.revs.specifiers.html
~~~~~案例
jenkins构建过程中,遇到一个问题:获取 svn postcommit 触发传递的参数和作者信息,出现混乱,初步判断和 jenkins 服务器停机维护有关系。
注意到以下提示:
Updating http://svn_server/repo_name at revision '2017-09-20T15:52:45.978 +0800'
U xxxx
At revision 312
WARNING: clock of the subversion server appears to be out of sync. This can result in inconsistent check out behavior.
提交版本313到svn -> svn hook postcommit 请求 jenkins 远程API -> 触发任务:http://jenkins_server/job/test01/401/changes -> 此处却获取到svn版本312的内容
核对时间发现:
15:53由版本313触发的构建
在 jenkins 服务器上的日志显示 update 的 svn 仓库版本却是 312,这是因为构建时指定了版本的时间为15:52
Updating http://svn_server/repo_name at revision '2017-09-20T15:52:45.978 +0800'
小结:初步判断是jenkins服务器今天关机维护后,时间没及时同步导致的异常。
解决方法:在svn仓库的url后指定 @HEAD
########################################################################
【构建触发器】(注:在svn中使用hook脚本过滤出最新版本中有变动的image目录名称作为参数传递到这里来build)
触发远程构建 (例如,使用脚本)
身份验证令牌:test_build_token
【构建】
选择:Execute shell
Command: (脚本略)
【构建后操作】
选择:Editable Email Notification
单击: [Advanced Settings...]
Triggers: Always
Send To
Developers
注1:目前jenkins未接入ldap,当svn用户提交后,jenkins会自动记录该用户,但svn提交的信息中只有用户名,没有邮箱信息(这点和git不一样),且该用户并未激活,需要激活(在jenkins中给该用户设置密码)后才能给该用户发送邮件,默认使用系统全局设置中的邮件后缀。
2)svn 仓库增加一个 hook 用来传递参数,并调用远程api
首先,通过 svnlook changed -r ${svn_repository_revision} ${svn_repository} 来获取提交的内容,解析参数传递出去
其次,通过调用远程api来触发build
ZYXW、参考
1、doc
http://pkg.jenkins-ci.org/redhat-stable/
https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions
2、gitlab hook
https://wiki.jenkins-ci.org/display/JENKINS/Gitlab+Hook+Plugin
https://github.com/elvanja/jenkins-gitlab-hook-plugin#build-now-hook
3、Running jenkins jobs via command line
http://www.inanzzz.com/index.php/post/jnrg/running-jenkins-build-via-command-line
4、使用阿里云容器服务Jenkins实现持续集成和Docker镜像构建(updated on 2017.3.3)
https://yq.aliyun.com/articles/53971
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com