• 对于注定会优秀的人来说,他所需要的,只是时间----博主
  • 手懒得,必受贫穷,手勤的,必得富足----《圣经》
  • 帮助别人,成就自己。愿君在本站能真正有所收获!
  • 如果你在本站中发现任何问题,欢迎留言指正!
  • 宝剑锋从磨砺出,梅花香自苦寒来!
  • 本站开启了防爆破关小黑屋机制,如果您是正常登录但被关进小黑屋,请联系站长解除!

<二十六>Jenkins实战应用–Jenkins+sonar构建代码扫描

Jenkins eryajf 1年前 (2018-11-06) 2530°C 已收录 38个评论
本文预计阅读时间 28 分钟

*系列汇总*

这是一个系列文章,大大小小到今天惊然发现竟然已经累计二十篇了,也就不得不做一个小汇总。回想当初写第一篇文章的时候,就已经决心事无巨细,一应认真的走下来,回头遮望,看着皇皇这么多文章,一股强烈的成就感就此油然而生,于是便有了这些汇总整理。在这个过程当中,好像也帮助过不少的人,这是让我尤其开心的事情,同时也结识了一些志同道合的朋友,再没有比这更让人觉得愉悦的事情啦!也希望以后写出更多类似的系列文章。

文章汇总地址如右:Jenkins入门教程。

如果相中哪个,点击进去便是。希望正在读这段话的你能够在这个小系列中获得自信以及喜悦!

1,认识sonar。

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量,通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测。

通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。
 
在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
  
此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。

2,部署前准备。

下载完成之后,将如上包传入服务器中。

因为上边下载的包在使用过程中还需要一些其他操作,因此这里直接将可用的包打包,存在百度云。

文件下载

  文件名称:sonar-all  文件大小:153M
  下载声明:本站文件大多来自于网络,仅供学习和研究使用,不得用于商业用途,如果有版权问题,请联系博主进行相关处理!
  下载地址:https://pan.baidu.com/s/1LvTj22Xzrmoh6T0GmyAuPA

注意:本段内容须成功“回复本文”后“刷新本页”方可查看!

3,正式部署。

1,依赖。

整个环境依赖jdk环境(官方建议使用OpenJDK 8),也要准备好maven工具在系统中,这两个的准备工作就不详细展示了。

对于主机配置的要求,官方建议是,实例需要至少2GB的RAM才能有效运行,并且1GB的可用RAM用于操作系统。磁盘方面,如果代码量足够大,那么应该给予足够大(150G)的磁盘,并且是出色读写性能的硬盘。

本次部署也是在Jenkins主机上直接进行的部署操作

2,创建数据库。

关于数据库,如果选择MySQL,那么官方建议的是5.6和5.7这两个版本,这里我使用5.6版本的。

通过 curl 192.168.10.10/a | sh进行安装,安装完成之后,创建如下数据库:

mysql> CREATE DATABASE sonar DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
mysql> FLUSH PRIVILEGES;

3,使用普通用户。

这里使用普通用户来管理sonar,因为后边如果使用root启动会报错,这个还真别不听,如果不信,可以自己测试一下,主要是到时候的elasticsearch组件会因为root启动而报错can not run elasticsearch as root,所以还是乖乖的使用普通用户来部署吧。

[root@localhost ~]$useradd sonar
[root@localhost ~]$passwd sonar

给刚刚创建的普通用户以sudo权限。

[root@localhost opt]$vim /etc/sudoers

在第93行添加如下内容:

sonar    ALL=(ALL)       ALL

顺便在这个当口,将程序的文件打开数放开一下:

[root@jenkins ~]$vim /etc/security/limits.conf

在最末尾添加:

sonarqube   -   nofile   65536
sonarqube   -   nproc    2048

4,SonarQube安装。

以下操作将在刚刚创建的普通用户sonar下进行。

<li>1,先将刚刚的文件传输到服务器。</li>
[sonar@jenkins ~]$ls
sonar-l10n-zh-sonar-l10n-zh-plugin-1.19.zip  sonarqube-6.7.5.zip  sonar-scanner-cli-3.0.3.778.zip
<li>2,解压部署sonarqube。</li>
[sonar@jenkins ~]$unzip sonarqube-6.7.5.zip
[sonar@jenkins ~]$mv sonarqube-6.7.5 sonarqube
[sonar@jenkins ~]$ll sonarqube
total 12
drwxr-xr-x 8 sonar sonar  136 Aug  6 10:29 bin
drwxr-xr-x 2 sonar sonar   50 Aug  6 10:20 conf
-rw-r--r-- 1 sonar sonar 7651 Aug  6 10:20 COPYING
drwxr-xr-x 2 sonar sonar   24 Aug  6 10:20 data
drwxr-xr-x 7 sonar sonar  150 Aug  6 10:29 elasticsearch
drwxr-xr-x 4 sonar sonar   40 Aug  6 10:20 extensions
drwxr-xr-x 9 sonar sonar  140 Aug  6 10:29 lib
drwxr-xr-x 2 sonar sonar    6 Aug  6 10:20 logs
drwxr-xr-x 2 sonar sonar   24 Aug  6 10:20 temp
drwxr-xr-x 9 sonar sonar 4096 Aug  6 10:29 web
<li>3,将mysql启动包导入。</li>
    包名称mysql-connector-java-5.1.40.jar,此包在maven.aliyun.com里边搜索一下即可找到,上边的完整包里边已经包含。

    下载之后传到服务器,放在对应目录下:

[sonar@jenkins ~]$mkdir sonarqube/extensions/jdbc-driver/mysql
[sonar@jenkins ~]$mv mysql-connector-java-5.1.40.jar  sonarqube/extensions/jdbc-driver/mysql/
    注意其中的路径,不要放错位置了。
<li>4,配置sonarqube。</li>
    sonar的配置文件在/home/sonar/sonarqube/conf/sonar.properties
[sonar@jenkins ~]$vim /home/sonar/sonarqube/conf/sonar.properties
配置如下三条:
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
    当然,如果数据库不在本机,那么localhost可以更改为对应主机ip。

    下面是可以配置的一些其他参数:

#sonar.jdbc.maxActive=60
#sonar.jdbc.maxIdle=5
#sonar.jdbc.minIdle=2
#sonar.jdbc.maxWait=5000
#sonar.jdbc.minEvictableIdleTimeMillis=600000
#sonar.jdbc.timeBetweenEvictionRunsMillis=30000
    保存出来。

5,sonar-scanner安装。

<li>1,解压之后配置。</li>
[sonar@jenkins ~]$unzip sonar-scanner-cli-3.0.3.778.zip
[sonar@jenkins ~]$mv sonar-scanner-cli-3.0.3.778 sonar-scanner
[sonar@jenkins ~]$ll sonar-scanner
total 52
-rw-rw-r-- 1 sonar sonar  2585 May 12  2017 appveyor.ps1
-rw-rw-r-- 1 sonar sonar   351 May 12  2017 appveyor.yml
drwxrwxr-x 4 sonar sonar    48 May 12  2017 it
-rw-rw-r-- 1 sonar sonar  7635 May 12  2017 LICENSE.txt
-rw-rw-r-- 1 sonar sonar   179 May 12  2017 NOTICE.txt
-rw-rw-r-- 1 sonar sonar 12308 May 12  2017 pom.xml
-rw-rw-r-- 1 sonar sonar   812 May 12  2017 README.md
-rw-rw-r-- 1 sonar sonar   264 May 12  2017 run_integration_tests.sh
drwxrwxr-x 4 sonar sonar    30 May 12  2017 src
-rw-rw-r-- 1 sonar sonar   166 May 12  2017 third-party-licenses.sh
-rwxr-xr-x 1 sonar sonar   475 May 12  2017 travis.sh
<li>2,编译打包。</li>
    注意,这个地方是要进行一些配置的,但是目前这种情况是无法配置的,也就是说,这个cli需要编译之后才能够使用,那么可以通过maven工具进行编译,也可以直接在安装包里下载可用的包。

    如果你的maven工具已经配置好了,那么可以直接运行如下命令构建:

[sonar@jenkins sonar-scanner]$mvn clean install
    打包之后,会多出一个target目录,查看里边的文件
[sonar@jenkins sonar-scanner]$ls target/
archive-tmp  generated-sources       maven-archiver  original-sonar-scanner-cli-3.0.3-SNAPSHOT.jar  sonar-scanner-cli-3.0.3-SNAPSHOT.jar          surefire-reports
classes      generated-test-sources  maven-status    sonar-scanner-3.0.3-SNAPSHOT.zip               sonar-scanner-cli-3.0.3-SNAPSHOT-sources.jar  test-classes
    而那个sonar-scanner-3.0.3-SNAPSHOT.zip就是我们需要的文件了。

    拿出来,重新操作一波。

[sonar@jenkins sonar-scanner]$mv target/sonar-scanner-3.0.3-SNAPSHOT.zip ~/
[sonar@jenkins sonar-scanner]$cd
[sonar@jenkins ~]$unzip sonar-scanner-3.0.3-SNAPSHOT.zip
[sonar@jenkins ~]$ls
sonar-l10n-zh-sonar-l10n-zh-plugin-1.19.zip  sonarqube-6.7.5.zip  sonar-scanner-3.0.3-SNAPSHOT      sonar-scanner-cli-3.0.3.778.zip
sonarqube                                    sonar-scanner        sonar-scanner-3.0.3-SNAPSHOT.zip
[sonar@jenkins ~]$rm -rf sonar-scanner
[sonar@jenkins ~]$mv sonar-scanner-3.0.3-SNAPSHOT sonar-scanner
<li>3,配置。</li>
    接下来才可正式进入cli的配置。
[sonar@jenkins ~]$vim /home/sonar/sonar-scanner/conf/sonar-scanner.properties
    将如下三句添加在文件末尾:
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

6,配置环境变量。

这里切回到root用户进行添加。

[root@jenkins ~]$vim /etc/profile

在末尾添加:

#set sonar-quebe and sonar_runner_home
export SONAR_HOME=/home/sonar/sonarqube
export SONAR_RUNNER_HOME=/home/sonar/sonar-scanner
export PATH=$PATH:$SONAR_HOME/bin/linux-x86-64:$SONAR_RUNNER_HOME/bin

加载配置,注意,在加载之前,请确保主机目录与我上边的是一致的,否则可能出现环境被搞乱的风险。

[sonar@jenkins ~]$source /etc/profile

7,运行sonarqube。

[sonar@jenkins ~]$cd sonarqube/bin/linux-x86-64/
[sonar@jenkins linux-x86-64]$ls
lib  sonar.sh  wrapper
[sonar@jenkins linux-x86-64]$./sonar.sh
Usage: ./sonar.sh { console | start | stop | restart | status | dump }
[sonar@jenkins linux-x86-64]$./sonar.sh start

关于启动脚本的各项参数,已经在上边展示出来了,可以尝试一下。

等待一会儿,就可以访问了。

通过192.168.10.3:9000进行访问。

点击login,用户名密码默认为admin/admin进行登入。

开始有一个教程,不过先跳过:

8,配置开机自启动。

我的主机用的是CentOS-7。

先将启动命令加入环境中。

[root@jenkins ~]$ln -s /home/sonar/sonarqube/bin/linux-x86-64/sonar.sh /usr/bin/sonar

验证一下:
[root@jenkins ~]$sonar status
SonarQube is running (36982).

然后创建service管理方式。

[root@jenkins ~]$vim /etc/init.d/sonar

添加如下内容:

#!/bin/bash
#
# rc file for SonarQube
#
# chkconfig: 345 96 10
# description: SonarQube system (www.sonarsource.org)
#
### BEGIN INIT INFO
# Provides: sonar
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: SonarQube system (www.sonarsource.org)
# Description: SonarQube system (www.sonarsource.org)
### END INIT INFO

/usr/bin/sonar $*

简单配置:

[root@jenkins ~]$chmod 755 /etc/init.d/sonar
[root@jenkins ~]$chkconfig --add sonar
[root@jenkins ~]$chkconfig sonar on

测试一下:
[root@jenkins ~]$service sonar status
SonarQube is running (36982).

9,插件安装。

这里主要先安装一个中文语言包的插件。

插件下载地址:https://github.com/SonarQubeCommunity/sonar-l10n-zh

唯一要注意的问题就是,版本要与刚刚安装的相对应。

下载之后传入到服务器当中。

[sonar@jenkins ~]$unzip sonar-l10n-zh-sonar-l10n-zh-plugin-1.19.zip
[sonar@jenkins ~]$ll sonar-l10n-zh-sonar-l10n-zh-plugin-1.19
total 8
drwxrwxr-x 4 sonar sonar   79 Nov 14  2017 compare
-rw-rw-r-- 1 sonar sonar 3436 Nov 14  2017 pom.xml
-rw-rw-r-- 1 sonar sonar  983 Nov 14  2017 README.md
drwxrwxr-x 4 sonar sonar   30 Nov 14  2017 src

同样这里需要编译之后才能使用,当然也可以在刚才的链接当中直接下载所需的jar包。

[sonar@jenkins sonar-l10n-zh-sonar-l10n-zh-plugin-1.19]$mvn clean install

同样的,编译完成之后会多一个target的目录。

[sonar@jenkins sonar-l10n-zh-sonar-l10n-zh-plugin-1.19]$ll target/
total 40
drwxrwxr-x 3 sonar sonar    17 Nov  6 13:48 classes
drwxrwxr-x 3 sonar sonar    25 Nov  6 13:48 generated-sources
drwxrwxr-x 3 sonar sonar    30 Nov  6 13:48 generated-test-sources
drwxrwxr-x 2 sonar sonar    28 Nov  6 13:48 maven-archiver
drwxrwxr-x 3 sonar sonar    35 Nov  6 13:48 maven-status
-rw-rw-r-- 1 sonar sonar 38340 Nov  6 13:48 sonar-l10n-zh-plugin-1.19-RC2-SNAPSHOT.jar
drwxrwxr-x 2 sonar sonar   123 Nov  6 13:48 surefire-reports
drwxrwxr-x 3 sonar sonar    17 Nov  6 13:48 test-classes

我们所需要的就是编译出来的jar包,把jar包移动到/home/sonar/sonarqube/extensions/plugins目录下即可。

[sonar@jenkins sonar-l10n-zh-sonar-l10n-zh-plugin-1.19]$mv target/sonar-l10n-zh-plugin-1.19-RC2-SNAPSHOT.jar /home/sonar/sonarqube/extensions/plugins/

移动之后重启一下服务即可。

[sonar@jenkins ~]$/home/sonar/sonarqube/bin/linux-x86-64/sonar.sh restart

重启完成之后,再去浏览器刷新一下,发现系统已经变成中文的了。

4,Jenkins构建。

1,添加插件。

首先在Jenkins当中下载对应的插件。

插件安装完成之后,在jenkins的”系统管理”–》“系统设置”, 就能看到SonarQube servers的配置点,截图如下:

2,添加用户。

配置之前,需要先在sonar当中添加一个连接用户。

这里创建一个用户,用户名为test,秘钥复制下来。回到刚刚Jenkins处进行配置:

注意这里的URL,应当填写部署sonar的主机ip,即便你是同样部署的Jenkins本机的,也不要写成localhost,因为在后边会用到这个配置信息。

3,添加工具。

在Jenkins的系统管理中的全局工具当中,添加sonar工具。

与此同时,不用多说的,也应将jdk的工具,maven的工具配置完善。

jdk:

maven:

4,创建一个测试项目。

创建一个maven风格的名称为test-sonar的项目。

过程不详细说了,直接看截图。

其中的sonar片段,除了定义一个名称,选中刚刚添加的jdk工具,重要的就是当中的那段配置了。

内容如下:

#项目key (随意输入,必填项)
sonar.projectKey=test-sonar

#项目名称和版本(必填项)
sonar.language=java
sonar.projectVersion=1.0
sonar.sourceEncoding =UTF-8
sonar.projectName=test-sonar

#源码位置(必填项,相对于jenkins的workspace路径,例如,我此时的绝对路径为~/.jenkins/workspace/Test/test-webapp/src/main/java)
sonar.sources=src/main/java

#编译后的class位置(必填项,旧版本此项可不填,建议还是填入,相对路径同上)
sonar.java.binaries=target/classes

然后保存项目,构建一次。

在构建界面中,可以看到一些不一样的东东。

左侧的SonarQube点击之后可以直接跳转到这个项目对应的sonar中的结果。

5,查看结果。

来到sonar界面当中,刷新一下,首先映入眼帘的,就是我们刚刚定义的一个test-sonar的项目展示。

到这里,基本上关于这个代码检测的开源工具流程就结束了,剩下的,就是深入使用,慢慢详细了解其中的各个功能,以帮助于日常工作。


weinxin
扫码订阅本站,第一时间获得更新
微信扫描二维码,订阅我们网站的动态,另外不定时发送WordPress小技巧,你可以随时退订,欢迎订阅哦~

二丫讲梵 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明<二十六>Jenkins实战应用–Jenkins+sonar构建代码扫描
喜欢 (5)
[如果想支持本站,可支付宝赞助]
分享 (0)
eryajf
关于作者:
学无止境,我愿意无止境学。书山有路,我愿意举身投火,淬炼成金!

您必须 登录 才能发表评论!

(38)个小伙伴在吐槽
  1. 谢谢楼主
    zero2018-12-05 22:03 Windows 10 | Chrome 70.0.3538.102
    • eryajf
      不必客气,觉得不错,还可以看看Jenkins系列的其他文章,都是非常用心写的,保证能够有所收获
      eryajf2018-12-05 23:12 Windows 7 | Chrome 70.0.3538.9
  2. 写的很详细,非常感谢!
    万里独行2018-12-06 16:50 Windows 10 | Chrome 70.0.3538.110
  3. ╰⋛⋋や☆盛行☆や⋌⋚╯
    学习一下这个,很细很好很强。
    ╰⋛⋋や☆盛行☆や⋌⋚╯2019-01-16 19:41 Windows 7 | Chrome 63.0.3239.132
  4. 会一直关注楼主的
    耐克不带勾2019-03-06 11:23 Windows 7 | Chrome 69.0.3497.81
  5. 又看了一遍你写的Jenkins系列,这次把本地机房搭建的Jenkins迁移到了云上,收获颇多,非常感谢你的分享!!
    万里独行2019-03-12 14:24 Windows 10 | Chrome 72.0.3626.121
    • eryajf
      感谢支持,也祝贺你在这个技能点上取得了突破,不过要提醒的是,Jenkins上云要注意访问权限问题,因为本身Jenkins如果开放给外网访问是非常危险的,所以一定要做好权限相关的控制
      eryajf2019-03-12 15:48 Windows 7 | Chrome 70.0.3538.9
      • 谢谢!!我们阿里云上的机器没有开通外网ip,用VPN连接的,但是发布到某些项目时,目标主机用的公网ip,没办法用内网连接,还是有些担心,怕被攻击,或者出问题。请教一下,类似这种情况,除了在云上做好密码复杂的,访问策略外,还有没有其他方法,非常感谢!
        万里独行2019-03-12 15:56 Windows 10 | Chrome 72.0.3626.121
        • eryajf
          话说你们的主机是什么类型的,为何会没有内网IP,我感觉如果是公司内部使用,经典网络的,肯定所有主机首先都会在一个内网之内吧,怎么会有没有内网IP的情况呢。如果是这种情况,自然是用秘钥授权,然后再限制使用密码登陆,基本上也就是这些安全策略了!
          eryajf2019-03-12 19:35 Windows 7 | Chrome 70.0.3538.9
  6. 谢谢楼主,非常好
    wushu2019-03-21 19:00 Windows 10 | Chrome 70.0.3538.110
  7. chengkanghua
    3,添加工具。在Jenkins的系统管理中的全局工具当中,添加sonar工具。 这一步我的sonar 和jenkins不是同一个系统上,我是用容器起来的,这部怎么填啊? 自动安装吗?
    chengkanghua2019-04-07 21:24 Windows 10 | Firefox浏览器 66.0
    • eryajf
      其实跟jdk有点类似,只是一个工具,办法也比较简单,你把这个sonar放在宿主机某个位置,然后启动这个Jenkins容器的时候,挂载上去,然后再在配置里边添加即可!
      eryajf2019-04-07 21:32 Windows 7 | Chrome 73.0.3683.103
  8. chengkanghua
    博主,为啥我电脑访问 403啊
    chengkanghua2019-04-08 17:28 Linux | Chrome 61.0.3163.128
  9. chengkanghua
    26 和 27 为什么是一样的啊? 关于sonar代码质量规则怎么配置?
    chengkanghua2019-04-08 19:48 Windows 10 | Firefox浏览器 66.0
    • eryajf
      是的,这个问题下午看到了,刚刚已经更改了。关于规则方面,需要结合开发一起来制定。
      eryajf2019-04-08 20:06 Windows 7 | Chrome 73.0.3683.103
      • chengkanghua
        能给个模板我看看,我都不知道怎么弄得?
        chengkanghua2019-04-09 08:50 Windows 10 | Firefox浏览器 66.0
  10. Jenkins系列的感觉非常棒
    cs66365632019-05-15 16:34 Windows 10 | Chrome 74.0.3729.131
  11. 膜拜一下大神
    xyw22782019-09-04 13:17 Windows 10 | Chrome 75.0.3770.142
  12. 在系统配置里面配置sonar的url的验证方式时,验证的方式不是图中的直接黏贴sonar的token,类似于jenkins连接gitlab那样的,添加凭证没有sonar token的选项,用户名和密码验证也不行,验证方式没有可选的!这个大概是啥问题啊!
    zheng-fred2019-09-04 17:57 Windows 10 | Chrome 76.0.3809.100
    • eryajf
      有可能跟Jenkins的版本,以及你安装的sonar插件的版本有关系,所以我也没办法给出比较有价值的答案,需要你自己多多探寻一下
      eryajf2019-09-04 19:52 Mac OS X | Chrome 76.0.3809.100
  13. lucktoalex2019-09-28 11:31 Mac OS X | Chrome 77.0.3865.90
  14. sonar的配置文件 jdbc不能有空格,否则报错,文章可能要略微修整
    lucktoalex2019-09-29 13:16 Mac OS X | Chrome 77.0.3865.90
    • eryajf
      感谢提醒,应该是中间更改过,然后不同的编辑器导致格式错乱了,已经更正!
      eryajf2019-09-29 13:43 Mac OS X | Chrome 77.0.3865.90
  15. 不错,感想分享
    lggl2019-10-15 22:18 Windows 10 | Chrome 75.0.3770.100
  16. pengge
    优秀的龍哥 棒棒哒 膜拜 要获取提取码
    pengge2019-10-31 17:01 Windows 10 | Chrome 79.0.3941.4
  17. 优秀的龍哥 来领取一个提取码
    zxxong2019-11-05 15:52 Windows 7 | Chrome 73.0.3683.86
  18. niubi
    d2001450012019-11-08 16:33 (5天前) Windows 10 | Chrome 75.0.3770.90
  19. 大神,你的Jenkins写的超级好,非常用心,超级实用。
    stephen2019-11-08 20:01 (4天前) Windows 10 | Chrome 78.0.3887.7
    • eryajf
      大神这称号可担当不起,不过文章深入浅出,大家能在此有所收获,也算是不负用心。感谢支持鼓励哈
      eryajf2019-11-08 20:24 (4天前) Mac OS X | Chrome 78.0.3904.87