设为首页 收藏本站
查看: 1078|回复: 0

[经验分享] jenkins-基础操作

[复制链接]

尚未签到

发表于 2018-9-4 09:17:35 | 显示全部楼层 |阅读模式
一、安装  
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

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-562276-1-1.html 上篇帖子: Jenkins 持续集成平台构建之使用nexus搭建maven私有仓库 下篇帖子: docker深入2-使用jenkins镜像
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表