部署Jenkins参照另一篇博客:
一、jenkins相关插件的安装
1、安装Publish Over SSH插件用于SSH连接远程的服务器。
登录 jenkins 管理系统首页,打开“系统管理”--“管理插件” 搜索 Publish Over SSH 然后勾选安装
2、安装 NodeJs插件 用于vue项目打包构建。
打开“系统管理”--“管理插件” 搜索 nodejs 然后勾选安装
打开“系统管理”--“Global Tool Configuration” 拉到底部 配置 node 版本,如图:
二、配置远程服务器的连接
1、打开“系统管理”--“系统设置” 找到 “Publish over SSH” 项 ,如果是帐号密码登录的Passphrase填写密码Username填写用户名,path to key 为空就可以了。也可以通过远程服务器用的是ssh登录,通过ppk密钥进行连接。点击 Test Configuration 按钮测试连接是否成功
三、配置自动部署任务
1、新建任务:点击“新建”--填写任务名称,选择“构建一个自由风格的软件项目”然后保存,如图:
2、配置git,进入任务配置,选择源码管理 ,我这里是git下载项目,所以选择 git ,因为是开源的,所以没有填写账号密码,如图
3、设置构建环境,选择 Provide Node & npm bin/ folder to PATH 然后选择之前安装插件时候配置的node版本,如图
4、配置项目自动化打包,选择 增加构建步骤 ---Excute shell 这个是运行相关的sh命令
cd cnbi-client/ #npm install -g cnpm --registry=https://registry.npm.taobao.org rm -rf dist rm -f dist.tar.gz cnpm install cnpm run build tar -zcf dist.tar.gz dist
如下图
5、把打包好的项目文件发布到远程服务器
选择“构建后操作步骤”---“Send build artifacts over SSH” 。
Name:创建的远程服务器名称(需要推送远程的服务器名称)
Source files:本地需要传输过去的文件(默认执行路径为Jenkins的工作路径,直接跟要传输的文件名称和相对路径)
Remove prefix:过滤掉的目录名(指过滤掉的source files路径)
Remote directory:远程服务器的保存路径(配置的根目录的路径下生成的路径)
Exec command:传输完成后在远程服务器执行的sh命令(默认执行路径为root家目录)
实例:
如有不全可参考以前做的老图:
6、保存后点击“立即构建”查看任务是否构建完成,Console Output 菜单可以查看构建日志。
四、遇到的问题
1、拉取代码超时报错
[test] $ /bin/sh -xe /tmp/jenkins5540140486901721898.sh + cd /var/lib/jenkins/workspace/test + rm -rf dist + npm install > yorkie@2.0.0 install /var/lib/jenkins/workspace/test/node_modules/yorkie > node bin/install.js CI detected, skipping Git hooks installation > node-sass@4.9.3 install /var/lib/jenkins/workspace/test/node_modules/node-sass > node scripts/install.js Downloading binary from https://github.com/sass/node-sass/releases/download/v4.9.3/linux-x64-72_binding.node Cannot download "https://github.com/sass/node-sass/releases/download/v4.9.3/linux-x64-72_binding.node": HTTP error 404 Not Found Hint: If github.com is not accessible in your location try setting a proxy via HTTP_PROXY, e.g. export HTTP_PROXY=http://example.com:1234 or configure npm proxy via npm config set proxy http://example.com:8080 > electron@4.0.0 postinstall /var/lib/jenkins/workspace/test/node_modules/electron > node install.js
需要用到淘宝镜像做代理,否则连接不上,参考:http://npm.taobao.org/
2、推送远程服务器内存溢出
报错信息如下:
SSH: Connecting from host [localhost.localdomain] SSH: Connecting with configuration [226] ... SSH: Disconnecting configuration [226] ... FATAL: GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceeded at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1249) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1282) Finished: FAILURE
报错信息二:
java.lang.OutOfMemoryError: Java heap space at com.jcraft.jzlib.Deflate.deflateInit(Deflate.java:1384) at com.jcraft.jzlib.Deflate.deflateInit(Deflate.java:1326) at com.jcraft.jzlib.Deflater.init(Deflater.java:133) at com.jcraft.jzlib.Deflater.<init>(Deflater.java:80) at com.jcraft.jzlib.Deflater.<init>(Deflater.java:75) at com.jcraft.jzlib.GZIPOutputStream.<init>(GZIPOutputStream.java:46) at com.jcraft.jzlib.GZIPOutputStream.<init>(GZIPOutputStream.java:40) at com.jcraft.jzlib.GZIPOutputStream.<init>(GZIPOutputStream.java:36) at hudson.console.AnnotatedLargeText.writeHtmlTo(AnnotatedLargeText.java:179) at hudson.console.AnnotatedLargeText.writeLogTo(AnnotatedLargeText.java:147) at org.kohsuke.stapler.framework.io.LargeText.doProgressText(LargeText.java:264) at hudson.console.AnnotatedLargeText.doProgressiveHtml(AnnotatedLargeText.java:95) at java.lang.invoke.LambdaForm$DMH/1024337131.invokeVirtual_L3_V(LambdaForm$DMH) at java.lang.invoke.LambdaForm$BMH/702564452.reinvoke(LambdaForm$BMH) at java.lang.invoke.LambdaForm$MH/1895324968.invoker(LambdaForm$MH) at java.lang.invoke.LambdaForm$MH/378519084.invokeExact_MT(LambdaForm$MH) at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627) at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:396) at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:408) at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:212) at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:145) at org.kohsuke.stapler.MetaClass$11.doDispatch(MetaClass.java:535) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:747) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:878) at org.kohsuke.stapler.MetaClass$2.doDispatch(MetaClass.java:219) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:747) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:878) at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:456) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:747) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:878) Caused: javax.servlet.ServletException at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:797) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:878) at org.kohsuke.stapler.MetaClass$2.doDispatch(MetaClass.java:219) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:747) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:878) at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:456) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:747) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:878) at org.kohsuke.stapler.MetaClass$4.doDispatch(MetaClass.java:280) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:747) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:878) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:676) at org.kohsuke.stapler.Stapler.service(Stapler.java:238) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623) at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154) at jenkins.telemetry.impl.UserLanguages$AcceptLanguageFilter.doFilter(UserLanguages.java:128) at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151) at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:99) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84) at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249) at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90) at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1700) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.Server.handle(Server.java:505) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:698) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804) at java.lang.Thread.run(Thread.java:748)
换了另一种方法推送到远程服务器,写一个脚本文件,采用远程复制的方法(scp)
工程配置信息如下:
注意:从本地仓库gitlab拉取代码需要配置git凭证,参考我的另一篇文章:
tomcat部署Jenkins并配置jdk、maven、git
远程复制需要配置免密登陆
Jenkins公钥和私钥文件路径如下:
/var/lib/jenkins/.ssh/
参考博客:
https://blog.csdn.net/ansu2009/article/details/83584796