jenkins部署成功执行自动化测试代码失败问题解决

一.问题描述

我的jenkins运行在虚拟机上,mysql服务在主机上;
1.先执行jenkins的deploy任务,拉取远程开发代码并进行部署
2.deploy任务部署完成触发部署test任务,运行自动化代码进行测试

问题出在test任务构建显示success,但是测试代码并没有执行成功
在这里插入图片描述

二.问题解决-数据库权限

按照报错提示去target目录下看运行结果报告

org.apache.ibatis.exceptions.PersistenceException: 
)### Error querying database.  Cause: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES
### The error may exist in mapper/SQLMapper.xml
### The error may involve com.course.model.loginCase
### The error occurred while executing a query
### Cause: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
	at com.course.cases.LoginTest.loginTrue(LoginTest.java:51)

显示无法访问到mysql数据库,检查了一下我的用户名密码写的是对的,解决如下:
1.尝试在cmd命令行把root用户的访问权限由localhost->所有主机

mysql -u root -p
CREATE USER 'root'@'%' IDENTIFIED BY '密码'; 
grant all privileges on *.* to 'root'@'%' 
flush privileges;
exit

再次登录即可。
2.并且在配置文件里把连接mysql的url由127.0.0.1改成本机IP,
在这里插入图片描述
3.提交代码到github

git add .
git status
git commit -m "修改数据库连接地址"
git push

4.再次在jenkins上执行deploy任务,这次test任务还是没有执行成功
在这里插入图片描述
5.查看surefire报告报错
6.到jenkins运行工作目录
/root/.jenkins/workspace/deploy/Chapter13/target/logs

[root@fanyu logs]# ll
总用量 16
-rw-r--r--. 1 root root     0 6月  13 12:17 event.log
-rw-r--r--. 1 root root 13666 6月  13 12:18 userManger.log

查看一下本次deploy服务端程序启动信息

server logs:
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
	at org.apache.catalina.connector.Connector.startInternal(Connector.java:1021)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	... 21 common frames omitted
Caused by: java.net.BindException: 地址已在使用
	at sun.nio.ch.Net.bind0(Native Method)
	at sun.nio.ch.Net.bind(Net.java:433)
	at sun.nio.ch.Net.bind(Net.java:425)
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
	at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
	at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:210)
	at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1150)
	at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:591)
	at org.apache.catalina.connector.Connector.startInternal(Connector.java:1018)
	... 22 common frames omitted
2021-06-13 11:03:54.870 [main] INFO  org.apache.catalina.core.StandardService - Stopping service [Tomcat]
2021-06-13 11:03:54.884 [main] INFO  o.s.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener - 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-06-13 11:03:54.886 [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - 

***************************
APPLICATION FAILED TO START
***************************


三.问题解决-端口占用

1.检查了一下,我的jenkins服务在用的是8080端口,

[root@fanyu logs]# ps -ef | grep 8080
root       3201   3022  0 08:18 pts/1    00:01:31 java -jar jenkins.war -httpPort=8080
root      10086   3022  0 12:34 pts/1    00:00:00 grep --color=auto 8080

服务端程序在用的也是8080端口;
在这里插入图片描述

2.于是便修改端口为8081(并把8081端口加入到防火墙的开放端口中)
示例:

[root@fanyu ~]# firewall-cmd --list-ports    列出开放端口
8080/tcp 3306/tcp 80/tcp 6379/tcp 8081/tcp
[root@fanyu ~]# firewall-cmd --zone=public --add-port=8082/tcp --permanent      增加开放端口
success
[root@fanyu ~]# firewall-cmd --reload     重启防火墙
success
[root@fanyu ~]# firewall-cmd --list-ports
8080/tcp 3306/tcp 80/tcp 6379/tcp 8081/tcp 8082/tcp

3.再次启动deploy任务,test任务

4.test任务依旧报错,查看报告:

loginFalse
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. ### The error may exist in mapper/SQLMapper.xml ### The error may involve com.course.model.loginCase ### The error occurred while executing a query ### Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77) at com.course.cases.LoginTest.loginFalse(LoginTest.java:11

more Caused by: java.net.ConnectException: 连接超时 (Connection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:173) at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ... 60 more ... Removed 37 stack frames

大意是连接超时,没有得到服务器的响应包;

四.问题解决-连接超时

1.尝试在本机ping虚拟机
发现可以ping通
在这里插入图片描述
2.尝试在虚拟机ping主机
发现连接超时

3.在网上查了下资料是本机的防火墙原因,Windows10的防火墙没有打开ICMPv4-in规则
于是解决如下:
1)打开设置,搜索防火墙
在这里插入图片描述
2)点击高级设置
3)点此更改防火墙属性
在这里插入图片描述
4)确保更改过后是这样的效果
在这里插入图片描述
5)点击入站规则,启动这个规则
在这里插入图片描述
再次虚拟机ping主机,发现可以ping通了

[root@fanyu logs]# ping 192.168.159.1
PING 192.168.159.1 (192.168.159.1) 56(84) bytes of data.
64 bytes from 192.168.159.1: icmp_seq=1 ttl=128 time=0.257 ms
64 bytes from 192.168.159.1: icmp_seq=2 ttl=128 time=0.284 ms
64 bytes from 192.168.159.1: icmp_seq=3 ttl=128 time=0.271 ms
64 bytes from 192.168.159.1: icmp_seq=4 ttl=128 time=0.282 ms
64 bytes from 192.168.159.1: icmp_seq=5 ttl=128 time=0.311 ms
64 bytes from 192.168.159.1: icmp_seq=6 ttl=128 time=0.255 ms
64 bytes from 192.168.159.1: icmp_seq=7 ttl=128 time=0.293 ms
64 bytes from 192.168.159.1: icmp_seq=8 ttl=128 time=0.210 ms
64 bytes from 192.168.159.1: icmp_seq=9 ttl=128 time=0.243 ms
64 bytes from 192.168.159.1: icmp_seq=10 ttl=128 time=0.236 ms
64 bytes from 192.168.159.1: icmp_seq=11 ttl=128 time=0.254 ms
64 bytes from 192.168.159.1: icmp_seq=12 ttl=128 time=0.178 ms
64 bytes from 192.168.159.1: icmp_seq=13 ttl=128 time=0.320 ms
64 bytes from 192.168.159.1: icmp_seq=14 ttl=128 time=0.249 ms
64 bytes from 192.168.159.1: icmp_seq=15 ttl=128 time=0.246 ms
64 bytes from 192.168.159.1: icmp_seq=16 ttl=128 time=0.273 ms
64 bytes from 192.168.159.1: icmp_seq=17 ttl=128 time=0.247 ms
64 bytes from 192.168.159.1: icmp_seq=18 ttl=128 time=0.337 ms
64 bytes from 192.168.159.1: icmp_seq=19 ttl=128 time=0.239 ms
64 bytes from 192.168.159.1: icmp_seq=20 ttl=128 time=0.259 ms
64 bytes from 192.168.159.1: icmp_seq=21 ttl=128 time=0.254 ms
64 bytes from 192.168.159.1: icmp_seq=22 ttl=128 time=0.202 ms
^C
--- 192.168.159.1 ping statistics ---
22 packets transmitted, 22 received, 0% packet loss, time 21032ms
rtt min/avg/max/mdev = 0.178/0.259/0.337/0.036 ms

再次在jenkins启动任务,发现还是报错

loginFalse
java.lang.NullPointerException at com.course.cases.LoginTest.getResult(LoginTest.java:96) at com.course.cases.LoginTest.loginFalse(LoginTest.java:119) at com.sun.proxy.$Proxy0.invoke(Unknown Source) ... Removed 33 stack frames

检查这行代码,发现
在这里插入图片描述
是因为response为空,所以产生了空指针异常,也就是没有得到响应

五.问题解决-请求无响应

1.不通过jenkins在本机终端尝试运行测试代码
也是报错的,报错如下:

12:53:08.671 [main] DEBUG com.course.model.loginCase - ==>  Preparing: select * from login_case where id=?
12:53:08.671 [main] DEBUG com.course.model.loginCase - ==> Parameters: 1(Integer)
12:53:08.671 [main] DEBUG com.course.model.loginCase - <==      Total: 1
LoginCase(id=1, userName=tt, password=123, expected=true)
http://192.168.159.1:8081/v1/login
12:53:08.671 [main] INFO com.course.cases.LoginTest - ********开始验证loginTrue api*********
12:53:08.675 [main] DEBUG org.apache.http.client.protocol.RequestAddCookies - CookieSpec selected: default
12:53:08.675 [main] DEBUG org.apache.http.client.protocol.RequestAuthCache - Auth cache not set in the context
12:53:08.675 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection request: [r
oute: {}->http://192.168.159.1:8081][total kept alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]
Caused by: java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)

可以看出测试代码访问数据库都是正常的,但是请求服务端连接被拒绝了。

2.jenkins运行deploy任务和test任务
test任务 console output每一个测试方法也都是提示连接超时
在这里插入图片描述
3.确保服务端程序确实是起着的之后,检查了下请求的IP
在这里插入图片描述

这个是本机的IP,
因为
服务端程序和测试程序都是运行在虚拟机,这时候请求的地址应该是虚拟机的IP地址;

于是更改访问地址
在这里插入图片描述

不要忘了提交代码到git上

git代码更新后
再次执行jenkins的deploy和test任务,
服务器日志能正常响应:
在这里插入图片描述

test任务output:
在这里插入图片描述
查看extentreport报告
(cd /root/.jenkins/workspace/test/Chapter12/test-output)

[root@fanyu Chapter12]# cd test-output/
[root@fanyu test-output]# ll
总用量 20
-rw-r--r--. 1 root root 20477 6月  13 13:21 index.html

在这里插入图片描述

这表明test任务执行成功了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Jenkins是一个持续集成工具,用于自动化构建、测试和部署软件。Docker是一个开源的容器化平台,可以帮助开发人员打包应用程序和其依赖项成为一个容器。Harbor是一个企业级的Docker镜像注册表,可以帮助组织管理和存储Docker镜像。 在自动化部署流程中,Jenkins可以与Docker和Harbor结合使用,实现自动化构建、打包和部署应用程序的流程。具体步骤如下: 首先,开发人员在代码仓库中提交新的代码Jenkins会定期检测代码仓库的变化,一旦检测到新的代码提交,Jenkins就会触发自动化构建流程。 在构建过程中,Jenkins会使用Docker来创建应用程序的镜像,将应用程序和其依赖项打包成一个可移植的容器。然后,Jenkins会将构建的镜像推送到Harbor中进行存储与管理。 接下来,Jenkins会触发自动化部署流程。在部署过程中,Jenkins会从Harbor中拉取最新的镜像,并将其部署到目标环境中。这可以是测试环境、预发布环境或生产环境,具体取决于组织的部署策略。 在部署完成后,Jenkins可以执行自动化测试流程,验证应用程序在目标环境中的运行情况。如果测试通过,部署流程就会顺利完成。如果测试失败Jenkins会通知相关人员,并触发回滚流程。 通过整合Jenkins、Docker和Harbor,可以实现一个端到端的自动化部署流程,帮助组织提高软件交付的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值