公司的生产环境部署应用的时候,报了一个错误
Deploying [/root/.jenkins/workspace/bqj-open/anne-web-api/target/anne-web-api.war]
ERROR: Build step failed with exception
org.codehaus.cargo.container.ContainerException: Failed to deploy [/root/.jenkins/workspace/bqj-open/anne-web-api/target/anne-web-api.war]
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:107)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:185)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:73)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:116)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:103)
at hudson.FilePath.act(FilePath.java:997)
at hudson.FilePath.act(FilePath.java:975)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:103)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:61)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:45)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:735)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:676)
at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.post2(MavenModuleSetBuild.java:1072)
at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:621)
at hudson.model.Run.execute(Run.java:1760)
at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:542)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:405)
Caused by: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: FAIL - Deployed application at context path / but context failed to start
公司jenkins部署的版本是2.60.1,用的部署插件是
Deploy to container Plugin,版本是1.10版本,
百度了一下原因,大部分都说要把ContextPath的/ROOT换成/,可惜不是我的原因,我看了下插件的源码,大致思路是通过tomcat的manager-script角色进行部署,可是我通过tomcat的界面部署时可以的,而通过war包部署时的时候报错了,可是远程调试jenkins太麻烦,而且还是线上环境,索性直接根据插件源码,写了个小工具类,测试部署是否成功
public class TestJenkinsCargoDeploy {
public static final String CHAR_SET="utf8";
public static void main(String[] args) throws IOException {
String path="/";
String version=null;
String config=null;
String war=null;
boolean update=false;
String tag=null;
InputStream data = new FileInputStream(new File("C://jenkins.war"));
StringBuilder buffer = new StringBuilder("/deploy");
try{
buffer.append("?path=").append(URLEncoder.encode(path,CHAR_SET));
if (version != null) {
buffer.append("&version=").append(URLEncoder.encode(version, CHAR_SET));
}
if (config != null) {
buffer.append("&config=").append(URLEncoder.encode(config.toString(), CHAR_SET));
}
if (war != null) {
buffer.append("&war=").append(URLEncoder.encode(war.toString(), CHAR_SET));
}
if (update) {
buffer.append("&update=true");
}
if (tag != null) {
buffer.append("&tag=").append(URLEncoder.encode(tag, CHAR_SET));
}
}catch(Exception ex){
}
invoke(buffer.toString(),data);
}
public static void invoke(String path,InputStream data) throws IOException {
String url="http://localhost:8080/manager/text";
String userAgent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";
String username="tomcat";
String password="s3cret";
URL invokeURL = new URL(url + path);
HttpURLConnection connection = (HttpURLConnection)invokeURL.openConnection();
connection.setAllowUserInteraction(false);
connection.setDoInput(true);
connection.setUseCaches(false);
if (data == null)
{
connection.setDoOutput(false);
connection.setRequestMethod("GET");
}
else
{
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
connection.setRequestProperty("Content-Type", "application/octet-stream");
connection.setChunkedStreamingMode(0);
}
if (userAgent != null) {
connection.setRequestProperty("User-Agent", userAgent);
}
if (username != null)
{
String authorization = toAuthorization(username, password);
connection.setRequestProperty("Authorization", authorization);
}
connection.connect();
if (data != null) {
pipe(data, connection.getOutputStream());
}
String response=null;
try
{
response = toString(connection.getInputStream(), "UTF-8");
}
catch (IOException e)
{
e.printStackTrace();
}
if (!response.startsWith("OK -")) {
System.out.println(response);
}
}
private static String toAuthorization(String username, String password)
{
StringBuilder buffer = new StringBuilder();
buffer.append(username).append(':');
if (password != null) {
buffer.append(password);
}
return "Basic " + new String(Base64.encodeBase64(buffer.toString().getBytes()));
}
private static void pipe(InputStream in, OutputStream out)
throws IOException
{
BufferedOutputStream bufferedOut = new BufferedOutputStream(out);
byte[] bytes = new byte['?'];
int n;
while ((n = in.read(bytes)) != -1) {
bufferedOut.write(bytes, 0, n);
}
bufferedOut.flush();
bufferedOut.close();
in.close();
}
private static String toString(InputStream in, String charset)
throws IOException
{
InputStreamReader reader = new InputStreamReader(in, charset);
StringBuilder buffer = new StringBuilder();
char[] chars = new char['?'];
int n;
while ((n = reader.read(chars, 0, chars.length)) != -1) {
buffer.append(chars, 0, n);
}
return buffer.toString();
}
}
分享到:
相关推荐
ant +build.xml 文件Jenkins部署javaEE项目,助力成功自动化部署。ant +build.xml 文件Jenkins部署javaEE项目,助力成功自动化部署。ant +build.xml 文件Jenkins部署javaEE项目,助力成功自动化部署。ant +build.xml...
docker安装jenkins部署并且自动化打包部署java服务
jenkins自动打包vue前后端分离项目,部署到远程服务器
Jenkins部署
jenkins部署vue前端
Jenkins 自动化部署Deploy插件
Jenkins作为一个自动化版本管理、编译、打包、部署工作,具有高效、方便、快捷等优点。可以节约大量时间成本。压缩包中包含Jenkins.war,tomcat容器、及详细部署配置文档,以及几个问题的处理说明
jenkins离线部署套装(你需要的它都有)
介绍了Jenkins的部署过程,Jenkins的基本使用方法,同提到了部署和使用过程中的注意事项
Win10搭建Jenkins部署Java项目(本机和远程Win10部署).doc
里面包含了Jenkins的war包,以及已经包含了maven的、ssh、svn的插件集成,只需高级安装选择插件文件就行了,另外里面也有写了一套的远程部署脚本
Jenkins增量打包配置,可以实现增量部署,只更新变动的文件!
Jenkins离线包 yarn/node/jdk/maven,包括32个常用离线插件
jenkins详细部署全部文档,包含配置。
很多团队表示,我们一定要把系统全部coding完成,才向(类)生产环境部署系统,这样有一个好处,就是大家更加专注于coding。不被打扰。但是也有一个坏处,就是无法及时反馈出系统中的问题,你的boss也无法知道系统究竟...
Jenkins持续集成系统部署文档
jenkins-1.623-1.1.noarch.rpm 使用root用户登录linux,切换到usr目录(也可以自定义目录),将准备好的文件上传到服务器上。(本文件之后的内容中,如无特殊说明,都是在root用户下执行操作。)
主要介绍了Jenkins Pipeline 部署 SpringBoot 应用的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Jenkins安装项目部署
介绍Jenkins部署Web项目到远程tomcat的文档,简单实用。