公司小什么都要节约一点,全部测试服务器都在公司局域网里,代码托管在Gitee当中,自从用了微服务(用SpringBoot拆解业务流程),开发与测试阶段部署jar太麻烦了,多早之前就据说过Jenkins,通过不停的踩坑终于完成了初步的Gitee+jenkins+花生壳(内网穿透)+nginx实现自动持续部署。里面还涉及到一些高级功能只能后面边使用边补充html
我在里面用到了nginx,对于不须要的朋友,直接忽略对应步骤便可,直接将tomcat的监听端口改成80java
注册/登陆花生壳linux
购买域名nginx
购买内网穿透git
设置花生壳web
开启花生壳shell
增长内网穿透映射tomcat
我映射的80端口是被NGINX监听的(由于Jenkins等其余web应用也须要经过该域名被外网访问)服务器
测试。输入花生壳的域名,看可否访问到本身的web服务器网页app
nginx配置:
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; access_log /home/app/proc/nginx/logs/access.log; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # location /jenkins{ proxy_pass http://192.168.2.23:8080; } } }
到此为止花生壳的配置结束了
在官网去下载war包
https://jenkins.io/download/,选择Long-term Support->Generic Java package
部署到tomcat中,tomcat会自动解压war并在webapps目录下生成jenkins文件夹
注意:linux操做系统限制了非root用户不能监听1024一下端口号,因此若是tomcat要启动在80端口,必须用root用户启动,不然要修改花生壳的映射(指向内网的非80端口)
登录root用户,执行
yum -y install git
安装完git后,复制出/usr/bin/git,后面设置会用到
由于我本身已经在nginx上配置了Jenkins的代理,因此直接用以下地址访问:
http://xxx.xxx.ecip.vip/jenkins
刚开始会出来一个提示页面,告诉你Jenkins还在准备中,过1分钟左右能够本身刷新页面,便会出来以下界面
圈出来的部分是下面要输入的密码保存位置
去LINUX主机上获取密码
cat /root/.jenkins/secrets/initialAdminPassword
输入密码,点击下一步
而后过几分钟会提示你安装插件,选择按照推荐的安装。
补充:可能会有朋友遇到这个页面出不来,提示链接失败,能够直接跳过,后面直接去“插件管理”里面选择对应插件进行安装。网上也有说去插件中心修改https为http,我试了一下不知道为何不行,就选择了前面的本办法。
在不断的安装进行中
只安装这点插件还不够,等会还要补充安装别的插件。
这一步完成以后,会提示建立用户,若是是生产环境,建议建立一个用户给予相应的权限。我本身继续使用的admin用户。最终进入主页
选择路径:“系统管理”-》“插件管理”
安装Deploy to container\Gitee\Publish Over SSH\Maven Integration插件
注:能够选择完全部插件后,在点击安装(install without restart)
选择路径:“系统管理”-》“系统设置”
设置参考https://gitee.com/oschina/Gitee-Jenkins-Plugin#%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85中的“插件配置-添加码云连接配置”章节
设置完后,必定要测试一下是否连接成功
设置界面
Passphrase:生成ssh公钥私钥时的密码,若是使用ssh-keygen没有输入,该值不用填。按照本操做文档弄,就是不用填值
Path to key:私钥路径,此配置若是设置了,就能够不用设置下面Key了。在下面的ssh-keygen执行完后,会输入私钥的路径,复制并粘贴进来
Key:私钥内容,此配置若是设置了,就能够不用设置上面的Path to key了
使用root用户登陆,配置hosts
使用app(本身的非root)用户,配置ssh免登录
ssh-keygen,交互的时候直接三次回车
ssh-copy-id,输入对应用的密码
添加SSH Server
Name:本身随便取,可读性强便可
Hostname:要接收构建后jar包的服务器ip或者域名
Username:远程主机用户名
Remote Directory:直接设置根目录,若是这样设置,要注意用户(app)的访问权限。若是这里设置了根目录,后面设置的发送目录时就能够直接输入全路径,避免形成误配。这一点很重要,我在测试时候,就踩了这个坑。
弄完以后,点击测试一下
配置文件
设置maven主目录
去掉“自动安装”复选框
设置JDK主目录
设置Git文件目录
前往 Jenkins -> New Item , name 输入 'Gitee Test',选择 Freestyle project
保存便可建立构建项目
任务全局配置中须要选择前一步中的码云连接。前往某个任务(如'Gitee Test')的 Configure -> General,Gitee connection 中选择前面所配置的码云联机,如图:
前往某个任务(如'Gitee Test')的 Configure -> Source Code Management 选项卡
点击 Git
输入你的仓库地址,例如 git@your.gitee.server:gitee_group/gitee_project.git
点击 Advanced 按钮, Name 字段中输入 origin
, Refspec 字段输入 +refs/heads/:refs/remotes/origin/ +refs/pull//MERGE:refs/pull//MERGE
Branch Specifier 选项,根据实际状况输入,我本身输入的*/master
其余是选择的默认值
添加证书
最终设置完如图:
此刻的构建只是从Gitee上拉取代码并进行打包,还不具有push代码触发构建的能力
进入到任务界面,点击“当即构建”
点击进度条,进入详情页面,点击“Console Output”,能够查看打包的日志输出
第一次构建,会下载不少包,过程比较漫长
打包完会输出以下日志
生成Gitee WebHook 密码
在Gitee中设置WebHook密码
其余所有默认值
测试触发是否成功
在Gitee中点击
观察Jenkins是否触发新的构建
能够看到确实触发了新的构建
其中包含Pre steps/Post steps,二者的做用相似于动态代理的invoke方法的先后执行的动做,或者Spring拦截器中的preHandle和afterHandle。
Pre steps:构建前执行的步骤,好比能够执行别的shell操做完成不少复杂的动做
Post steps:构建后执行的步骤
还有一个Post-build Actions
只是为了实现构建后进行文件传送和部署,设置Post steps/Post-build Actions均可以,我本身使用的Post-build Actions
restart.sh脚本内容,该脚本是选择发送过来的jar包列表中最近被修改的做为启动项
#!/bin/sh #设置环境变量 export JAVA_HOME=/home/app/proc/jdk1.8.0_181 export PATH=$JAVA_HOME/bin:$PATH #设置程序主目录 APP_HOME=/home/app/app/hello #进入程序主目录 cd $APP_HOME #找出最近被修改的jar包 JAR_NAME=`ls -lot *.jar|head -n 1|awk '{print $8}'` #启动项目 java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log
测试一下
在Gitee的WebHook中点击测试
观察Jenkins中的HelloWorld项目是否被触发构建
查看构建日志
查看进程是否启动起来了
验证应用是否正常
发现错别字了吧,笑一笑也不错
OK,所有经过。。。
补充:
为了能在Jenkins控制台观察到启动日志,能够修改restart,将
java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log
改成
java -jar $APP_HOME/$JAR_NAME
效果以下:
图片最下面的圈圈,表示还在等待接收新的输入流作显示
为了避免让Jenkins等待应用服务器的输出,则能够修改restart.sh,将
java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log
改成
nohup java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log &
到底使用哪一种方式,看本身喜爱吧。
找回admin密码
使用jenkins启动用户登陆主机,执行以下命令:
cd
cd .jenkins/secrets
cat initialAdminPassword
里面的内容即是admin的密码
取消密码登陆
使用jenkins启动用户登陆主机,执行以下命令:
cd
cd .jenkins
vi config.xml
修改<useSecurity>true</useSecurity>为<useSecurity>false</useSecurity>
使用<!-- -->注释掉下面的内容:
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy"> <denyAnonymousReadAccess>true</denyAnonymousReadAccess> </authorizationStrategy> <securityRealm class="hudson.security.HudsonPrivateSecurityRealm"> <disableSignup>true</disableSignup> <enableCaptcha>false</enableCaptcha> </securityRealm>