jenkins支持集成进阶
Jenkins的启动方法有两种:
第一种是使用tomcat直接打开,就是把jenkins.war放入tomcat下的 webapps目录下,当启动jenkins时,就会自动在webapps下建立jenkins目录。然后再浏览器的地址栏输入http://localhost:8080/jenkins 另一种方法要确保系统中安装了jdk,并且配置了环境变量,检测方法就是在命令行输入java回车后有多行的命令符提示。直接在命令行输入java -jar jenkins.war即可启动jenkins,默认会运行在8080端口,切换到浏览器的地址栏输入http;//localhots:8080,localhost可以改成ip地址。
需要注意的是:1.Job名称千万不要用中文名称2.创建Job名称时最好有个规划,因为我们最后会通过正则匹配自动将Job归类,例如, “项目前缀_一些说明-Job类型”这种方式。
分级符号概述了一个Job新近一次构建会产生的四种可能的状态: Successful:完成构建,且被认为是稳定的。Unstable:完成构建,但被认为不稳定。Failed:构建失败。Disabled:构建已禁用。注释 : jenkins启动方式:
首先,进入 .jenkins 目录(比如/home/jenkins/.jenkins)。先备份 config.xml 为 config.xml.bak,而后打开 config.xml 配置文件,修改“<useSecurity>true</useSecurity>”为“<useSecurity>false</useSecurity>”;同时把“<authorizationStrategy ...>...</authorizationStrategy>”配置删除。重启之后我们会发现 Jenkins 已经无需登录了。然后,直接找到“系统管理”的“管理用户”菜单,把管理员的密码改回来!然后,用之前备份的 config.xml.bak 文件覆盖 config.xml 配置文件。再次重启 Jenkins,终于发现管理员又可以正常登录了。 方法一 java -jar /app/jenkins/jenkins.war --daemon --httpPort=7000 --logfile=/app/jenkins/jenkins.log 关闭CTRL +C 方法二: linux定时任务启动后,关闭定时任务 方法三: 启动和关闭均 写成脚本 方法四:放入tomcat服务器中运行Jenkins
高级使用
- Jenkis增加参数构建
- 获取Jenkins project build结果
______________________________________________________________________________________
1. Jenkins不同job之间依赖关系的两种配置方式
![](/assets/blank.gif)
![](/assets/blank.gif)
2. Jenkins不同job之间传递参数
Parameterized Trigger Plugin
插件
![](/assets/blank.gif)
![](/assets/blank.gif)
3. Job中如何传递自定义变量
4. 多个job之间的串并联
5. shell脚本实现部署
6. testng接入jenkins自动运行
7. 根据git仓库的变化来构建编译部署代码(配置触发器)
验证jenkins如何自动构建:
修改下本地git仓库的代码,commit 并push 到远程仓库, 等2分钟的样子,jenkins便会自动构建
Build periodically:周期进行项目构建(它不care源码是否发生变化),例如H 9-16/2 * * 1-5(周一到周五每两个小时构建一次)
Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。例如H/15 * * * * (每15分钟检查一次源码变化)您可以指定一个定时作业表达式来定义Jenkins每隔多久检查一下您源代码仓库的变化。如果发现变化,就执行一次构建。例如,表达式中填写0,15,30,45 * * * *将使Jenkins每隔15分钟就检查一次您源码仓库的变化。
在"构建触发器"中选择"Build when a change is pushed to GitHub "和"Poll SCM ",这两项的作用分别是当GitHub有版本库更新时触发Jenkins进行构建和定期检查版本库是否有更新,如果有更新则触发Jenkins进行构建。这里要注意Schedule语法,例如"*/2 * * * *"表示每隔2分钟检查一次。
注释:
jenkins定时任务参考:
H 3 * * 1-5(每周一到周五,3点钟) H/15 * * * * (每15分钟) H/3 * * * 1-5(每周一到周五,每3分钟执行执行一次) 20 3 * * *(每天早晨三点二十分执行) 10,40 * * * *(每小时的10分,40分执行) 00 15 * * 1,3,5(每周一,三,五的下午3:00) 5,15,25,35,45,55 16,17,18 * * *(每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行) H */2 * * *(每两个小时) 0 7-23/2,8 * * *(晚上11点到早上8点之间每两个小时和早上八点 ) 0 11 4 * 1-3(每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点) 0 4 1 1 *(1月1日早上4点) H * * */2 *(没两周执行)
linux定时任务参考:
http://www.net130.com/CMS/Pub/special/special_IT_operation/2013_04_28_12184.htm
http://blog.csdn.net/hi_kevin/article/details/8983746
8. 构建与部署配置
构建工具 | 使用 | 备注 |
ant |
Invoke Ant,Ant Version选择你Ant配置的那个名字, 注意不要选择default,那个选择了没有用。 Ps:如果你的构建脚本build.xml不在workspace根目录、或者说你的构建脚本不叫build.xml。那么需要在高级里设置Build File选项的路径,指明你的脚本。注意:是相对路径 |
例如 |
maven |
新建一个Maven工程后,需要设置以下条目:
具体: http://www.uml.org.cn/jchgj/201510221.asp |
|
部署war包到tomcat |
1)Deploy to container Plugin” 2) 在tomcat的conf目录配置tomcat-users.xml文件,在<tomcat-users>节点里添加如下内容: <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <user username="username" password="password" roles="manager-gui,manager-script,manager-jmx,manager-status"/> 引号里的username和password可以随便替换,待会要用的。 3) 选择Add post-build action,然后选择Deploy war/ear to a container WAR/EAR files:war文件的存放位置,如:target/test.war 注意:相对路径,target前是没有/的。 Context path:访问时需要输入的内容,如ofCard访问时如下:http://192.168.x.x:8080/ofCard/如果为空,默认是war包的名字。 Container:选择你的web容器,如tomca 6.x Manager user name:填入tomcat-users.xml配置的username内容 Manager password:填入tomcat-users.xml配置的password内容 Tomcat URL:填入http://192.168.x.x:8080/ Deploy on failure:构建失败依然部署,一般不选择 注意:虽然这种部署方法可能会导致tomcat加载时出现卡死的现象。但是也是最简单的部署方式。如果卡死了重启下就好了,将tomcat的java内存参数调高可以解决这个问题。 |
|
节点配置 |
Jenkins有个很强大的功能:分布式构建(在Jenkins的配置中叫做节点),分布式构建能够让同一套代码在不同的环境(如:Windows和Linux系统)中编译、测试等。而且Jenkins构建的代码和产物最后自动拷贝到主节点。
建议:所有Unix或者Windows机器的环境路径统一(如:JDK、Ant、Maven) 进入节点配置界面: 系统管理→管理节点→新建节点(左上角) 具体: http://blog.csdn.net/wangmuming/article/details/22925961 |
|
jetty |
http://www.cnblogs.com/daoxingsi/p/5362971.html http://blog.csdn.net/jeremy_yangt/article/details/47105539 http://my.oschina.net/ozy/blog/532745 |
|
jenkins磁盘管理插件disk-usage plugin | http://blog.csdn.net/testdeveloper/article/details/51734860 | |
9. 插件
插件用途 | 配置 |
配置emalil |
![]() 搜索email, 选择 Email Extension Plugin (或者Email Ext Recipients Column Plugin) 安装 |
cargo |
cargo实现jenkins自动部署远程tomcat |
代码质量 |
|
Sonar |
Sonar是一个代码质量管理系统,它的帮助文档开篇明义,提出了代码质量的七宗罪,总结的比较到位,不妨一看: 1. Bug和隐藏Bug(Bugs and Potential Bugs) 2. 违反编码规范(Coding Standards Breach) 3. 复制粘贴(Duplications) 4. 缺乏单元测试(Lack of Unit Tests) 5. 恶劣的复杂度分布(Bad Distribution of Complexity) 6. 意大利面式设计(Spaghetti Design) 7. 注释不足或过多(Not Enough or Too Many Comments) |
10.代码覆盖率
代码覆盖率分析是 CPU,MEMORY 集中的处理 最好另建一个job
11.性能测试-jmeter
12.静态代码检查
插件
checkstyle:重复代码检查
PMD:pmd cpd”使用pmd的cpd功能检查重复代码.cpd是pmd的一个组件,用来检查重复代码
findbugs
jdepend
sonar
![](/assets/blank.gif)
- maven的checkstyle插件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>2.9.1</version><configuration><configLocation>/Users/.jenkins/workspace/custom_checkstyle.xml</configLocation><encoding>UTF-8</encoding> </configuration><executions><execution><id>checkstyle</id><phase>validate</phase><goals><goal>check</goal></goals><configuration><failOnViolation>true</failOnViolation></configuration></execution></executions> </plugin>
mvn jxr:jxr(maven-jxr-plugin:在生成站点时配置该插件,会以Web页面的形式将Java源代码展现出来 )
checkstyle自定义的规则文件custom_checkstyle.xml(注意自定义文件格式必须正确)
<span style="font-size: 16.4268px;"><strong><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<!-- This configuration file was written by the eclipse-cs plugin configuration editor
-->
<!-- Checkstyle-Configuration: check Description: none
-->
<module name="Checker"> <property name="severity" value="error"/> <property name="charset" value="UTF-8"/> <message key="general.exception" value="有一个异常 - {0} "/> <message key="general.fileNotFound" value="文件没找到!"/> <!--章节3.1.1 --> <!-- 检查每个java package中是否有java注释文件,默认是允许一个package-info.java, 也可以通过allowLegacy属性配置允许package.html。此规则必须在<TreeWalker>标签外 --> <module name="JavadocPackage" /> <module name="TreeWalker"> <property name="severity" value="error"/> <property name="tabWidth" value="4"/> <message key="general.exception" value="有一个异常 - {0}"/> <!--章节2.3 --> <!-- 页宽--> <!--
<module name="LineLength"> <property name="max" value="80"/> <message key="maxLineLen" value="行字符数超过80个.违反编码规范2.3章节"/> </module> --><!--章节2.4 --> <!--操作符换行策略检查--> <!-- <module name="OperatorWrap"> <property name="severity" value="error"/> <property name="option" value="nl"/> <property name="tokens" value="ASSIGN,BAND,BOR,DIV,EQUAL,GE,GT,LAND,LE,LOR,LT,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS,PLUS_ASSIGN,QUESTION,STAR,STAR_ASSIGN"/> <message key="line.after" value="''{0}'没有放在新行之首,违反编码规范2.4章节"/> </module> --><!--章节2.6 --> <!-- <module name="ParenPad"> <property name="severity" value="error"/> <property name="tokens" value="LPAREN,RPAREN,CTOR_CALL,METHOD_CALL,SUPER_CTOR_CALL"/> <message key="ws.followed" value="''{0}'' 后面有空格,违反编码规范2.6章节"/> <message key="ws.preceded" value="''{0}''前面有空格,违反编码规范2.6章节"/> </module> --><!--
<module name="TypecastParenPad"> <property name="severity" value="error"/> <property name="tokens" value="RPAREN,TYPECAST"/> <message key="ws.followed" value="''{0}''后面多一个空格,违反编码规范2.6章节"/> <message key="ws.preceded" value="''{0}''前面多一个空格,违反编码规范2.6章节"/> </module> --><!-- <module name="WhitespaceAfter"> <property name="severity" value="error"/> <property name="tokens" value="COMMA,SEMI"/> <message key="ws.notFollowed" value="''{0}''后面多一个空格,违反编码规范2.6章节"/> </module> <module name="WhitespaceAround"> <property name="severity" value="error"/> <property name="tokens" value="RCURLY,LITERAL_ASSERT,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE"/> <property name="allowEmptyConstructors" value="true"/> <property name="allowEmptyMethods" value="true"/> <message key="ws.notPreceded" value="''{0}'' 关键字前少一个空格,违反编码规范2.6章节"/> <message key="ws.notFollowed" value="''{0}'' 关键字后少一个空格,违反编码规范2.6章节"/> </module> --><!--章节2.7 --> <!-- 每行语句数量--> <module name="OneStatementPerLine"> <!--模块的元数据类型设置,经过测试发现该标签没用--> <metadata name="net.sf.eclipsecs.core.comment" value="Coding Problems-> Only one statement per line allowed" /> <message key="multiple.statements.line" value="禁止一行有多句代码,违反编码规范2.7章节" /> </module> <!--章节2.8 --> <!-- 每行变量声明数量--> <!-- <module name="MultipleVariableDeclarations"> <property name="severity" value="error"/> <message key="multiple.variable.declarations.comma" value="每一个变量的定义必须在它的声明处,且在同一行,违反编码规范2.8章节"/> <message key="multiple.variable.declarations" value="每一行只能定义一个变量,违反编码规范2.8章节"/> </module> --><!--章节2.9.1 --> <!-- Checks the placement of right curly braces ('}') for else, try, and catch tokens. The policy to verify is specified using property option. option: 右大括号是否单独一行显示 tokens: 定义检查的类型 --> <!-- <module name="RightCurly"> <property name="option" value="alone"/> <property name="severity" value="error"/> </module> --><!--章节2.9.1 --> <!-- 检查左侧大括号 左侧大括号必须放在前一行代码的行尾 --> <!--
<module name="LeftCurly"> <property name="severity" value="error"/> <message key="line.previous" value="左侧大括号没有放在前一行代码的行尾,违反编码规范2.9.1章节"/> </module> --><!--章节2.9.2 --> <!-- 检查代码块是否缺失大括号--> <module name="NeedBraces"> <message key="needBraces" value="''{0}'' 结构没有用大括号 '''{}'''s,违反编码规范2.9.2章节"/> </module> <!-- 章节3.2 --> <!-- 对文件头的注释进行检查 --> <!--章节3.3 --> <!--对类和接口的javadoc注释进行检查--> <!-- <module name="JavadocType"> <property name="severity" value="error"/> <message key="type.missingTag" value="Javadoc 类型的注释丢失 {0} 标签.违反编码规范3.3章节"/> <message key="javadoc.missing" value="缺少 Javadoc 注释.违反编码规范3.3章节"/> <message key="javadoc.unusedTagGeneral" value="未使用过的 Javadoc 标签.违反编码规范3.23章节"/> <message key="javadoc.unusedTag" value="未使用过的 {0} 标签for ''{1}''.违反编码规范3.3章节"/> <message key="type.tagFormat" value="Javadoc 类型标签 {0}必须匹配模式 ''{1}''.违反编码规范3.3章节"/> </module> --><!--章节3.4,3.7 --> <!--public protect private变量的注释进行检查--> <!-- <module name="JavadocVariable"> <property name="severity" value="error"/> <property name="scope" value="public"/> <message key="javadoc.missing" value="变量注释:缺少Javadoc注释,违反编码规范3.4章节"/> </module> <module name="JavadocVariable"> <property name="severity" value="error"/> <property name="scope" value="protected"/> <message key="javadoc.missing" value="变量注释:缺少Javadoc注释,违反编码规范3.4章节"/> </module> <module name="JavadocVariable"> <property name="severity" value="error"/> <message key="javadoc.missing" value="变量注释:缺少Javadoc注释,违反编码规范3.4章节"/> </module> --><!--章节3.5 --> <!-- 检查所有方法的javadoc,可以不声明RuntimeException --> <!-- <module name="JavadocMethod"> <property name="allowUndeclaredRTE" value="true"/> <!~~允许get set 方法没有注释~~> <property name="allowMissingPropertyJavadoc" value="true"/> <message key="javadoc.missing" value="方法注释:缺少Javadoc注释,违反编码规范3.5章节"/> </module> --><!-- 命名规范 --> <!--章节4.2 --> <!-- 包名命名规范 --> <!-- <module name="PackageName"> <!~~ <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/> ~~> <property name="format" value="^org\.neris\.[a-z]+(\.[a-z]+)+$"/> <message key="name.invalidPattern" value="包名 ''{0}'' 不符合org.neris.项目名.模块名,违反编码规范4.2章节"/> </module> --><!--章节4.3,4.4 --> <!-- 类的命名,匹配规则默认:(^[A-Z][a-zA-Z0-9]*$),必须以大写字母开始 --> <module name="TypeName"> <property name="tokens" value="CLASS_DEF"/> <message key="name.invalidPattern" value="类名 ''{0}''没有通过大驼峰命名法命名,具体名称应使用意义完整的英文描述,违反编码规范4.3章节"/> </module> <!-- 接口命名,匹配规则默认:(^[A-Z][a-zA-Z0-9]*$),必须以大写字母开始 --> <module name="TypeName"> <property name="tokens" value="INTERFACE_DEF"/> <message key="name.invalidPattern" value="接口名 ''{0}''没有通过大驼峰命名法命名,具体名称应使用意义完整的英文描述,违反编码规范4.3章节"/> </module> <!--章节4.6 --> <!-- 方法名命名 --> <module name="MethodName"> <property name="severity" value="error"/> <property name="format" value="(^[a-z][a-zA-Z0-9]*$)"/> <message key="name.invalidPattern" value="方法名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反编码规范4.6章节"/> </module> <!--章节4.7 --> <!-- 局部变量命名 --> <module name="LocalVariableName"> <property name="format" value="(^[a-z][a-zA-Z0-9]*$)"/> <message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反编码规范4.7章节"/> </module> <!-- 局部的final变量,包括catch中的参数的检查 --> <module name="LocalFinalVariableName" > <property name="severity" value="error"/> <message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反编码规范4.7章节"/> </module> <!-- 变量命名 --> <module name="MemberName"> <message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反编码规范4.7章节"/> </module> <!-- 静态变量命名 --> <module name="StaticVariableName"> <message key="name.invalidPattern" value="变量名 ''{0}''没有通过小驼峰命名法命名,具体名称应使用意义完整的英文描述.违反编码规范4.7章节"/> </module> <!-- 数组变量命名 --> <module name="ArrayTypeStyle"> <property name="severity" value="error"/> <message key="array.type.style" value="数组定义没有采取int[] index这种方式,违反编码规范4.7.2章节"/> </module> <!--章节4.8 --> <!-- 常量命名--> <module name="ConstantName"> <property name="severity" value="error"/> <message key="name.invalidPattern" value="常量 ''{0}'' 常量名违反编码规范4.8章节."/> </module> <!--章节5.1 --> <!-- import语句不使用通配符 --> <module name="AvoidStarImport"> <property name="severity" value="error"/> <message key="import.avoidStar" value="引用包时不能使用*号.违反编码规范5.1章节"/> </module> <!--章节5.2 --> <!-- 魔法数检测--> <module name="MagicNumber"> <property name="severity" value="error"/> <message key="magic.number" value="''{0}'' 是一个魔法数(即常数).违反编码规范5.2章节"/> </module> <!--章节5.4 --> <!-- 多余的关键字,包含不适用this作为关键字 --> <!--章节5.5 --> <!-- 重载父类方法 --> <module name="MissingOverride"> <message key="annotation.missing.override" value="重载方法缺少@Override,违反编码规范5.5章节" /> <message key="tag.not.valid.on" value="注释-> Javadoc {0}标签在这个位置是无效的." /> </module> <!--章节5.6 --> <!--判断语句使用 --> <module name="SimplifyBooleanExpression"> <property name="severity" value="error"/> <message key="simplify.expression" value="存在布尔冗余,违法编码规范5.6章节."/> </module> <!--章节5.7 --> <!-- 检查switch语句是否忘记了default标签 --> <module name="MissingSwitchDefault" > <property name="severity" value="error"/> <message key="missing.switch.default" value="switch 语句后边没有 default 语句.违法编码规范5.7章节"/> </module> <!-- 检查switch语句中default标签的顺序 --> <module name="DefaultComesLast"> <property name="severity" value="error"/> <message key="default.comes.last" value="建议Default 放在 switch 语句的最后."/> </module> <!--章节5.9 --> <!-- 禁止使用System.out.println --> <module name="Regexp"> <property name="format" value="System\.out\.println"/> <property name="message" value="不要使用 System.out 与 System.out 进行控制台打印,应该使用日志工具类(如:log4j)进行统一记录或者打印,违法编码规范5.9章节"/> <property name="illegalPattern" value="true"/> </module> <!-- 禁止使用System.err.println --> <module name="Regexp"> <property name="format" value="System\.err\.println"/> <property name="message" value="不要使用 System.out 与 System.err 进行控制台打印,应该使用日志工具类(如:log4j)进行统一记录或者打印,违法编码规范5.9章节"/> <property name="illegalPattern" value="true"/> </module> <!--章节5.10 --> <!-- 不允许用main方法测试--> <module name="UncommentedMain"> </module> <!--章节5.11 --> <!-- NeedBraces 检查是否应该使用括号的地方没有加括号 tokens: 定义检查的类型 --> <module name="NeedBraces"/> </module> </strong></span><strong style="font-size: 16.4268px; font-family: Arial, Helvetica, sans-serif;"></module> </strong>
- pmd
mvn pmd:pmd
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId>
<configuration><!-- <rulesets><ruleset>/rulesets/braces.xml</ruleset><ruleset>/rulesets/naming.xml</ruleset></rulesets> -->
</configuration>
</plugin>
13.jenkins 和sonar
![](/assets/blank.gif)
- Jenkins 执行失败自动重试
- 定时配置
jenkins支持集成进阶相关推荐
- Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果...
为了规范代码,我们一般会集成静态代码检测工具,比如PMD.FindBugs.Checkstyle,那么Jenkins如何集成这些检查工具,并把检查结果放到构建邮件里呢? 今天做了调研和实现,过程如下 ...
- Jenkins持续集成学习-Windows环境进行.Net开发4
目录 Jenkins持续集成学习-Windows环境进行.Net开发4 目录 前言 目标 Github持续集成 提交代码到Github 从Github更新代码 git上显示构建状态 自动触发构建 Gi ...
- maven 设置打包路径为模块_4、Jenkins持续集成之maven编译
简介 Jenkins是一个开源的持续集成工具,应用Jenkins搭建持续集成环境,可以进行自动构建.自动编译和部署,非常方便.在服务器比较少的情况下,Jenkins的优势并不明显,但是随着项目发展,服 ...
- 一步步部署基于Windows系统的Jenkins持续集成环境
如题:本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境.之所以写本文,是因为在最近工作当中,学习使用Jenkins时,确实遇到了一些问题,而大多数教程文档都是基于Mac或是Lin ...
- 搭建GitLab+Jenkins持续集成环境图文教程
GitLab是一个代码仓库,用来管理代码.Jenkins是一个自动化服务器,可以运行各种自动化构建.测试或部署任务.所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率 ...
- Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目 前文使用Docker搭建Jenkins+Docker持续集成环境我们已经搭建了基于docker+ ...
- Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)
Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...
- 超详细的jenkins持续集成工作原理、功能、部署方式等介绍
文章由LinuxBoy分享于2019-08-30 11:08:39 超详细的jenkins持续集成工作原理.功能.部署方式等介绍 1. 概念 jenkins是一个开源项目,提供了一种易于使用的持续集成 ...
- Jenkins 持续集成CICD
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. Jenkins 支持各种运行方式,可通过系统包.Docker 或者通过一个独立的 Java 程序 J ...
最新文章
- 输入一个字符串,用子函数完成在字符串中找出ACSII码值最大的字符,将其放在第一个位置,并将该字符前的所有字符向后顺序移动
- 使用JDBC来实现一个简单的增删改查
- wordpress利用rsync同步备份
- 使用PADDING-TOP:(PERCENTAGE)实现响应式背景图片
- 基于体素的全局光照技术
- python — pip 下载速度慢解决方法(含Anaconda、spyder 下载包的方法)
- 电子书格式转换 azw3 to epub (软件calibre的简单使用)
- 微信翻译生日快乐的代码_微信表情翻译表白代码彩蛋大全 微信表情加符号翻译意思全解...
- ios真机调试出现“不受信任的开发者”解决方法
- 编写一个520表白网站并发布Web教程
- php获取百度搜索的关键词,【2020年】百度搜索词获取,获取百度搜索的关键词【真实有效】...
- access是用来干什么的_access是干什么用的
- vncviewer退出全屏
- C语言结构体中的冒号用法
- Java从零到企业级电商项目实战: linux环境配置
- OMAP3530-mini调试笔记(2)
- 【转】24个GE SFP/10 GE SFP+端口是什么意思
- PC网站微信扫码支付,Native支付,“当前商户号暂不支持关联该类型的appid“,“签名错误,请检查后再试““springBoot 微信支付“
- ORA-00933:SQL 命令未正确结束(1)
- Quartus ii 与 Verilog入门教程(1)——Verilog实现8位计数器
热门文章
- 黄金多头全面上攻 趁胜追击冲击千九关口
- 10000字详解,炫酷的3D特效Shader是如何炼成的
- python-爬虫-孙兴华
- 为何选择iText?java PDF开源库选择与iText发展历史
- MySQL数字的取整、四舍五入、保留n位小数
- 那些情况会出现上下文切换
- APKTool-apk反编译工具(绿色版)下载及使用说明
- 手机上line-height不起作用
- 利用语音Modem实现电话点播和留言功能
- Error 1267 Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)