实习日志(第四周)

Jenkins 学习

1. 什么是Jenkins

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Jenkins 是一个可扩展的持续集成引擎。
主要用于:
1. 持续、自动地构建/测试软件项目。
1. 监控一些定时执行的任务。

特性:
1. 易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。
1. 易于配置-所有配置都是通过其提供的web界面实现。
1. 集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。
1. 生成JUnit/TestNG测试报告。
1. 分布式构建支持Jenkins能够让多台计算机一起构建/测试。
1. 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
1. 插件支持:支持扩展插件,你可以开发适合自己团队使用的工具。

2. 安装(java+Tomcat+Jenkins)


  1. 安装java环境(在cmd中输入java -version以及javac可以查看jre和jdk是否安装成功)
  2. 安装Tomcat(启动方法:1.在bin目录下双击startup.bat 2.在cmd中,进入bin目录,输入startup.bat(建议使用这种方法))
    使用的是8080端口,保证这个端口没有被占用。
  3. 安装Jenkins.war(将这个war包扔进Tomcat安装目录下的webapps文件夹中,cmd进入此路径输入java -jar Jenkins.war)

在windows下也可以直接安装java环境+集成好的Jenkins.msi文件,就不用安装Tomcat了,个人觉得(java+Tomcat+Jenkins)安装好用

3. 常用Jenkins操作命令


http://localhost:8080/exit (shutdown Jenkins)
http://localhost:8080/restart (restart Jenkins)
http://localhost:8080/reload (to reload the configuration)

4. Jenkins的启动

通过一个脚本来启动jenkins,确保jenkins每次都运行在相同的环境下
建立一个start_jenkins.bat

cd C:\Users\Administrator\Downloads\apache-tomcat-7.0.56-windows-x64\apache-tomcat-7.0.56\webapps
java -jar jenkins.war

5. 修改Jenkins的timezone

如果Jenkins所在的server的timezone不同于用户的timezone,这时候需要修改Jenkins的timezone,需要在Jenkins启动的时候增加下列参数-Dorg.apache.commons.jelly.tags.fmt.timeZone=TZ

6. 第一个构建

安装好Jenkins后,在浏览器输入localhost:8080进入jenkins web界面,其余的操作都是在web界面上进行
“`
d:
cd “D:\test”
python test.py

运行结果显示
![helloworld.png](http://ojfyzl4g8.bkt.clouddn.com/696f45ceb324c9f4ed6b154544475a96.png)
#### 7. 建立节点
  1. 系统管理>管理节点  
  新建节点,启动方法选择Launch slave agents via Java Web Start
  >(刚安装的jenkins可能没有这个选项,在系统管理>Configure Global Security中设置TCP port for JNLP agents为指定端口或者随机选取)

    然后有三种方法可以进行启动
    1. Launch agent from browser,单击Launch按钮,生成.jnlp文件,双击运行
    1. Run from agent command line:
    javaws http://192.168.1.21:8080/computer/test/slave-agent.jnlp
    1. Or if the agent is headless:
    java -jar agent.jar -jnlpUrl http://192.168.1.21:8080/computer/test/slave-agent.jnlp-workDir"D:\for2017\jenkins"
    
(此时可能会报一个错误:无法启动该应用程序,检查Jenkins URL是否是ip:port格式)
注意: 对slave系统环境变量的修改,jenkins slave不会立即生效,需要重启jenkins slave service。 例如我在slave上装了ant,设置到path中后仍然找不到,需要restart jenkins slave service。 #### 7. Pipeline的使用 1. Pipeline是一套插件,支持将连续输送管道实施并集成到Jenkins中。Pipeline提供了一组可扩展的工具,用于为“简单到复杂的传送管道”作为代码进行建模。 Jenkins管道的定义通常写入一个文本文件(称为Jenkins文件),该文本文件又被检入项目的源代码管理库 ``` node { git url: 'https://github.com/jglick/simple-maven-project-with-tests.git' def mvnHome = tool 'M3' sh "${mvnHome}\\bin\\mvn -B verify" } # 实现了从github checkout源代码,然后通过maven来构建, 代码中包含了测试用例,有可能会随机的失败, 如果有测试用例失败,则整个pipeline job将会标记为失败。 ``` 运行结果显示 ![Pipeline1.png](http://ojfyzl4g8.bkt.clouddn.com/bb86515488eb0af4f8d8c2d71541f051.png) 复杂的管道难以在管道配置页面的文本区域内进行写入和维护。 为了方便起见,Pipeline也可以在文本编辑器中编写,并将Jenkins可以通过管道脚本从SCM选项加载Jenkins文件进行源代码控制。 为此,在定义管道时,从SCM中选择管道脚本。 选择SCM选项中的Pipeline脚本后,不要在Jenkins UI中输入任何Groovy代码; 只需通过指定要从其中检索管道的源代码中的路径来指示。 #### 8. Jenkins Master/Slave架构 Master/Slave相当于Server和agent的概念。Master提供web接口让用户来管理job和slave,job可以运行在master本机或者被分配到slave上运行。一个master可以关联多个slave用来为不同的job或相同的job的不同配置来服务。 当job被分配到slave上运行的时候,此时master和slave其实是建立的双向字节流的连接. 1. 其中连接方法主要有如下几种: 1. master通过ssh来启动slave Jenkins内置有ssh客户端实现,可以用来与远程的sshd通信,从而启动slave agent。这是对*unix系统的slave最方便的方法,因为*unix系统一般默认安装有sshd。在创建ssh连接的slave的时候,你需要提供slave的host名字,用户名和ssh证书。创建public/private keys,然后将public key拷贝到slave的~/.ssh/authorized_keys中,将private key 保存到master上某ppk文件中。jenkins将会自动地完成其他的配置工作,例如copy slave agent的binary,启动和停止slave。但是你的job运行所依赖其他的项目需要你自己设置。 1. master通过WMI+DCOM来启动windows slave 对于Windows的Slave,Jenkins可以使用Windows2000及以后内置的远程管理功能(WMI+DCOM),你只需要提供对slave有管理员访问权限的用户名和密码,jenkins将远程地创建windows service然后远程地启动和停止他们。 对于windows的系统,这是最方便的方法,但是此方法不允许运行有显示交互的GUI程序。<br> (注意:不想其他类型的链接方式,此种方式slave(note)的名字非常重要,将被用来当做slave的地址访问slave。) 1. 实现自己的脚本来启动slave 如果上面成套的方法不够灵活,你可以实现自己的脚本来启动slave。你需要将启动脚本放到master,然后告诉jenkins master在需要的时候调用此脚本来启动slave。 典型地,你的脚本使用远程程序执行机制,例如SSH,RSH,或类似的方法(在windows,可以通过cygwin或psexec来完成), 在脚本的最后需要执行类似java -jar slave.jar来启动slave。slave.jar可以从http://yourjenkinsserver:port/jnlpjars/slave.jar 下载,也可以在脚本的开始先下载此slave.jar从而保证slave.jar正确的版本。 但是如果使用ssh slave plugin的话,此plugin将自动地更新slave.jar。 1. 通过Java web start来启动slave jave web start(jnlp)是另一种启动slave的方法。用这种方法你需要登录到slave,打开浏览器,打开slave的配置页面来连接。还可以安装为windows service来使得slave在后台运行。 如果你需要运行的程序需要UI的交互,使用下面的方法:在slave系统上创建jenkins用户,设置自动登录,在系统的startup items增加slave JNLP文件的快捷方式,使得slave在系统登录的时候自动启动。 1. Slave配置的好的建议 1. 每个slave都有用户jenkins,所有的机器使用相同的UID和GID,使得slave的管理更加简单; 1. 每个机器上jenkins用户的home目录都相同/home/jenkins, 拥有相同的目录结构使得维护简单; 1. 所有的slave运行sshd,windows运行cygwin sshd; 1. 所有的slave安装ntp client,用来与相同的ntp server同步; 1. 使用脚本sh来自动地配置slave的环境,例如创建jenkins用户,安装sshd,安装java,ant,maven等; 1. 使用脚本来启动slave,保证slave总是运行在相同的参数下: ``` #!/bin/bash JAVA_HOME=/opt/SUN/jdk1.6.0_04 PATH=$PATH:$JAVA_HOME/bin export PATH java -jar /var/jenkins/bin/slave.jar ``` #### 9. Jenkins最佳实践 * Jenkins的安全。对Jenkins的用户使用授权和访问控制。默认地Jenkins不执行任何的安全检查,这意味着任何人都可以访问Jenkins来配置Jenkins,修改job,和执行build。这对于在企业内部使用也许可以接受,但是存在很高的安全风险,例如其他人错误滴删除了job,错误地配置你的job在每分钟运行,启动太多的builds等。所以一般使用plugin来对Jenkins增加授权和访问控制。 * 有规律地对Jenkins的home目录的备份。 * 使用file fingerprinting来管理依赖关系。当在Jenkins上你的job依赖其他的job时,可以使用file fingerprinting来帮助定位依赖的版本信息。 * 最可靠的build是clean builds,clean builds意思是与build相关的所有的3rd party,build脚本,发布说明等都需要在Source code control。 * 与issue tracking系统紧密的集成,例如JIRA或bugzilla,从来减少对change log的修改。 * 与repository浏览工具紧密的集成,例如FishEye如果你使用Subversion作为source code管理工具。 * 总是配置job产生趋势报告和自动化测试,当你运行一个Java build。趋势报告帮助项目经理和开发人员快速地了解当前项目的进度和状态。 * 确保Jenkins的home目录拥有足够的空间。 * 在删除不使用的job前请先存档。 * 为不同的branch建立不同的job,build来尽早地发现错误。 * 为并行的项目builds分配不同的端口,来避免多个jobs同时启动时所遇到的冲突。 * 为不同的项目的开发人员建立email aliais,使得项目所有相关的人员都第一时间了解项目的状态。 * 增加额外的步骤来尽早地发现失败。例如log检查,微测试等。 * 对于经常的维护性的工作可以使用job来自动地完成,例如对磁盘的清除工作。 * 在build成功后对远代码Tag,label或baseline。 * 配置Jenkins bootstrapper来在build前更新工作目录。 #### 10. 记录测试结果和工件 Jenkins可以记录和聚合测试结果,只要您的测试运行器可以输出测试结果文件。 Jenkins通常与junit步骤捆绑在一起,但是如果您的测试运行器无法输出JUnit样式的XML报告,则会有其他插件可以处理几乎任何广泛使用的测试报告格式。 1. 要收集我们的测试结果和工件,我们将使用post。

pipeline {
agent any
stages {
stage(‘Build’) {
steps {
sh ‘./gradlew build’
}
}
stage(‘Test’) {
steps {
sh ‘./gradlew check’
}
}
}

post {
    always {
        archive 'build/libs/**/*.jar'
        junit 'build/reports/**/*.xml'
    }
}

}

运行结果显示
![Pipeline2.png](http://ojfyzl4g8.bkt.clouddn.com/ed20725ee4629220e42da5ea15cc7a74.png)

#### 11. 清理和通知
当post在pipeline运行时,可以添加一些通知或其他步骤来执行定稿,通知或其他流水线结束任务。

pipeline {
agent any
stages {
stage(‘No-op’) {
steps {
sh ‘ls’
}
}
}
post {
always {
echo ‘One way or another, I have finished’
deleteDir() /* clean up our workspace */
}
success {
echo ‘I succeeeded!’
}
unstable {
echo ‘I am unstable :/’
}
failure {
echo ‘I failed :(’
}
changed {
echo ‘Things were different before…’
}
}
}

#### 12. 部署
最基本的持续交付流程至少将有三个阶段应在Jenkins文件中进行定义:构建,测试和部署。
稳定的构建和测试阶段是任何部署活动的重要前提。

pipeline {
agent any
stages {
stage(‘Build’) {
steps {
echo ‘Building’
}
}
stage(‘Test’) {
steps {
echo ‘Testing’
}
}
stage(‘Deploy’) {
steps {
echo ‘Deploying’
}
}
}
}

运行结果显示
![Deployment1.png](http://ojfyzl4g8.bkt.clouddn.com/12cc1716eddd00600648220e59c5f96d.png)
#### 13. 配置全局安全
1. 安全域
  1. Jenkins专有用户数据库(允许用户注册)
  1. LDAP(将所有身份验证委托给配置的LDAP服务器,包括用户和组)(此功能由插件提供,LDAP插件可能未安装)
  1. Servlet容器代理
1. 授权策略
  1. 任何用户可以做任何事(没有任何限制)
  1. 安全矩阵(如果用户具有“admin”的角色,那么它们就是授予对系统的完全控制,否则(包括匿名用户)将只有
  读访问。)
  1. 登录用户可以做任何事(此模式对强制用户很有用在采取行动前登录,以便有用户行为的审计跟踪。)
  1. 遗留模式(允许对哪些用户和组能够进行细粒度的控制)
  1. 项目矩阵授权策略(这允许授予特定用户或组访问指定的项目,而不是Jenkins环境中的所有项目。)
1. Markup Formatter(标记格式器)
  1. Plain Text(将所有输入视为纯文本。 诸如<和&的HTML不安全字符被转义到它们各自的字符实体。)
  1. Safe HTML(标记格式化程序允许用户和管理员注入是有用的以及将信息HTML代码片段导入项目描述和其他地方。)
1. 代理(JNLP代理的TCP端口)
  1. 指定端口
  1. 随机选取(避免Jenkins主站发生冲突,缺点是在Jenkins主机启动期间选择它们,使得允许基于JNLP代理的防火墙规则难以管理)
  1. 禁止(使得更容易管理允许基于JNLP代理的防火墙规则连接到主机。)
1. CSRF保护(防止允许未经授权的第三方执行请求的漏洞)
  1. 防止跨站点请求伪造<br>
     Crumb算法(启用该选项后,在任何请求可能改变数据的Jenkins环境中,Jenkins将检查CSRF令牌或“crumb”, 这些请求包括任何表单提交和调用远程API,包括使用“基本”认证的API。强烈建议将此选项置于启用状态)
注意:启用CSRF可能会影响Jenkins的高级用途的使用。(有关CSRF漏洞的更多信息,请访问OWASP网站。) 1. 插件管理器<br> 插件是增强Jenkins环境功能的主要手段去满足用户的特定需求。 有超过一千种不同的插件可以安装在Jenkins主机上,并集成各种构建工具,云提供程序,分析工具,以及更多。可以从更新中心自动下载插件及其依赖关系。该更新中心是由Jenkins项目经营的一项服务,提供开放式库存源插件,由Jenkins的各种成员开发和维护社区。 1. 安装插件方法 1. 在Web UI中使用“插件管理器”。(可直接安装已有的插件,或者使用高级安装,下载.hpi文件保存到C:\Users\Administrator\.jenkins\plugins目录下,手动安装) 1. 使用Jenkins CLI install-plugin命令。 1. 更新插件<br> 在Web UI中查看可更新的插件,默认下Jenkins Master24小时检查一次更新中心的更新,得手动触发更新。 1. 卸载插件<br> 在Web UI中查看已安装的插件,可以进行插件的卸载,也可以查看插件的具体信息。<br> (注意:卸载插件不会删除插件可能创建的配置,可通过系统管理>管理旧数据 来查看和删除配置) 1. 禁用插件 禁用插件是一个更软的方式来退出一个插件。 Jenkins将继续认识到插件已安装,但它不会启动插件,并且没有扩展从这个插件贡献将可见。<br> 系统管理员还可以通过在Jenkins主机上创建文件来禁用插件,例如:<br> JENKINS_HOME/插件/ PLUGIN_NAME.hpi.disabled。由禁用的插件创建的配置就像插件卸载一样它们导致启动时发出警告,但是会被忽略。 1. 固定插件 固定插件功能已在Jenkins 2.0中删除。版本晚于Jenkins2.0不要捆绑插件,而是提供一个向导来安装最有用的插件。固定插件的概念适用于与Jenkins 1.x捆绑在一起的插件,例如插件:matrix-auth [矩阵授权插件]。默认情况下,每当Jenkins升级时,其捆绑的插件将覆盖插件的版本,目前安装在JENKINS_HOME中。但是,当捆绑的插件已经被手动更新时,Jenkins会将该插件标记为固定到特定版本。在文件系统上,Jenkins创建一个空文件JENKINS_HOME / plugins / PLUGIN_NAME.hpi.pinned指示固定。 Jenkins启动期间,固定插件永远不会被捆绑的插件覆盖。 (较新Jenkins的版本会警告您,如果固定的插件比当前捆绑的旧版本旧。)将捆绑插件更新到Update Center提供的版本是安全的。捆绑版本偶尔更新,但不一致。插件管理器允许明确地取消固定插件。该JENKINS_HOME / plugins / PLUGIN_NAME.hpi.pinned文件也可以手动创建/删除来控制固定行为。如果固定文件存在,Jenkins将使用用户的已指定的插件版本。如果文件不存在,Jenkins将在启动时将插件恢复为默认版本。 #### 14. Jenkins CLI Jenkins具有内置的命令行界面,允许用户和管理员访问Jenkins从脚本或shell环境。 这可以方便地对日常任务进行脚本编写,批量更新,故障排除等。 1. 通过SSH使用CLI<br> 在Jenkins安装中,默认情况下禁用SSH服务。 管理员可以选择 设置特定端口,或者请求Jenkins在“配置全局安全性”页面中选择一个随机端口。

% curl -Lv https://JENKINS_URL/login 2>&1 | grep ‘X-SSH-Endpoint’
< X-SSH-Endpoint: localhost:53801
%

Jenkins有许多内置的CLI命令,可以在Jenkins环境中找到,例如构建或列表作业。 插件还可以提供CLI命令; 以确定完整在给定的Jenkins环境中可用的命令列表,执行CLI help命令进行查看.

% ssh -l kohsuke -p 53801 localhost help who-am-i
java -jar jenkins-cli.jar who-am-i
Reports your credential and permissions.
% ssh -l kohsuke -p 53801 localhost who-am-i
Authenticated as: kohsuke
Authorities:
authenticated
%

who-am-i命令有助于列出当前用户的凭据和权限可供用户使用。 当调试缺少CLI命令时,这可能是由于缺乏一定的权限。
1. 使用CLI客户端
虽然基于SSH的CLI快速且涵盖了大多数需求,但是使用CLI客户端意味着在防火墙中不需要打开额外的端口供其使用,因为CLI客户端的默认传输是HTTP。

java -jar jenkins-cli.jar [-s JENKINS_URL] [global options…] command [command options…] [arguments…]

CLI客户端的命令格式

“`
CLI客户端的三种基本模式
1. HTTP连接模式
1. SSH连接模式
1. 远程连接模式(不建议使用)
(注意:可能会出现操作超时的问题,检查是否在服务器上使用防火墙时打开HTTP或TCP端口。在Jenkins配置中配置其值。 默认设置为使用随机端口。)

15. In-process Script Approval

允许Jenkins管理员查看在Jenkins进程内运行的建议脚本(例如,在Groovy中编写),因此可能会绕过安全限制。
进程内脚本的安全性由两种不同的机制提供
1. Groovy Sandbox: 为了减少管理员的手动干预,大多数脚本默认运行在Groovy Sandbox中,包括所有Jenkins Pipeline,当脚本尝试使用sandbox未授权的功能或方法时,脚本会立即停止

当Groovy Sandbox被禁用或调用了内置列表以外的方法时,Script Security插件会检查经过管理员管理的已批准脚本和方法列表。 对于希望在Groovy Sandbox外部执行的脚本,管理员必须在“In-process Script Approval”页面中批准整个脚本
1. Script Approval: 允许管理员批准或拒绝未分组脚本,或允许sandboxed脚本执行其他方法。
在大多数情况下,Groovy Sandbox和Script Security的内置列表的组合批准的方法签名就足够了。 强烈建议管理员只有在绝对必要时才偏离这些默认值。
批准假设权限检查
1. 批准
1. 拒绝
1. 批准假设权限检查

你可能感兴趣的:(实习周记)