jenkins支持集成进阶
来源:互联网 发布:html5性能优化 编辑:程序博客网 时间:2024/06/08 06:22
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
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启动方式:1. Jenkins不同job之间依赖关系的两种配置方式
2. Jenkins不同job之间传递参数
Parameterized Trigger Plugin
插件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. 构建与部署配置
注意不要选择default,那个选择了没有用。
Ps:如果你的构建脚本build.xml不在workspace根目录、或者说你的构建脚本不叫build.xml。那么需要在高级里设置Build File选项的路径,指明你的脚本。注意:是相对路径例如maven
新建一个Maven工程后,需要设置以下条目:
- 设置svn代码的下载路径
- 设置自动构造的日期
- 设置pom文件的路径
- 设置mvn命令的参数
- 设置post-build的动作
http://www.uml.org.cn/jchgj/201510221.asp 部署war包到tomcat1)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 containerWAR/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
并发测试;
http://blog.csdn.net/Danny_Yao/article/details/45826005 jettyhttp://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 pluginhttp://blog.csdn.net/testdeveloper/article/details/51734860
9. 插件
配置emalil
搜索email, 选择 Email Extension Plugin (或者Email Ext Recipients Column Plugin) 安装
1)插件支持jenkins 1.5以上的版本
2)具体配置
http://blog.csdn.net/jingjing029/article/details/50371104
cargo
cargo实现jenkins自动部署远程tomcat
代码质量SonarCheckstyle Plugin
Findbugs Plugin
PMD Plugin
Warnings Plugin
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
- maven的checkstyle插件
原理:http://www.tuicool.com/articles/bUbYBr
<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源代码展现出来 )
<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>
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
- Jenkins 执行失败自动重试
- 定时配置
- jenkins支持集成进阶
- iOS进阶5--使用Jenkins搭建持续集成打包平台
- Google App Engine通过Jenkins增加了持续集成支持
- Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)
- Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)
- Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)
- Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)
- Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)
- 【Jenkins】Pipeline使用进阶
- 【Jenkins】Pipeline使用进阶
- 持续集成管理工具Jenkins
- CTF与Jenkins集成
- jenkins持续集成(全)
- Jenkins 持续集成
- Jenkins的集成知识
- jenkins CI 持续集成
- Jenkins集成--构建job
- Jenkins持续集成
- WebBench-1.5源码剖析
- 浅谈数据库连接池
- windows文件(权限)修改不了,该这么办
- 基础
- mariadb ERROR 1045 (28000)
- jenkins支持集成进阶
- CSS Sprites技术的优缺点
- Windows核心编程 第五章 作业(上)
- 【BLE-CC2640】CC2640之RTC
- 单链表中删除元素
- Python3 Post登录并且保存cookie登录其他页面
- Filebeat的高级配置-Filebeat部分
- ubuntu16.04中文显示
- 虚拟机下centos6.5系统输入ifconfig命令不能显示ip地址