2019独角兽企业重金招聘Python工程师标准>>>
唠叨一段
公司小什么都要节约一点,所有测试服务器都在公司局域网里,代码托管在Gitee当中,自从用了微服务(用SpringBoot拆解业务流程),开发与测试阶段部署jar太麻烦了,多早以前就听说过Jenkins,经过不停的踩坑终于完成了初步的Gitee+jenkins+花生壳(内网穿透)+nginx实现自动持续部署。里面还涉及到一些高级功能只能后面边使用边补充
我在里面用到了nginx,对于不需要的朋友,直接忽略对应步骤即可,直接将tomcat的监听端口改为80
注册与配置花生壳
-
注册/登录花生壳
-
购买域名
-
购买内网穿透
-
设置花生壳
-
开启花生壳
-
增加内网穿透映射
我映射的80端口是被NGINX监听的(因为Jenkins等其他web应用也需要通过该域名被外网访问)
-
测试。输入花生壳的域名,看能否访问到自己的web服务器网页
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; } } }
到此为止花生壳的配置结束了
-
安装与配置Jenkins
安装Jenkins
-
在官网去下载war包
https://jenkins.io/download/,选择Long-term Support->Generic Java package
我下载的http://mirrors.jenkins.io/war-stable/latest/jenkins.war
-
部署到tomcat中,tomcat会自动解压war并在webapps目录下生成jenkins文件夹
注意:linux操作系统限制了非root用户不能监听1024一下端口号,所以如果tomcat要启动在80端口,必须用root用户启动,否则要修改花生壳的映射(指向内网的非80端口)
安装Git
登陆root用户,执行
yum -y install git
安装完git后,复制出/usr/bin/git,后面设置会用到
配置Jenkins
初始化Jenkins
因为我自己已经在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)
系统设置
选择路径:“系统管理”-》“系统设置”
设置Gitee
设置参考https://gitee.com/oschina/Gitee-Jenkins-Plugin#%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85中的“插件配置-添加码云链接配置”章节
设置完后,一定要测试一下是否链接成功
设置PUSH SSH OVER
设置界面
Passphrase:生成ssh公钥私钥时的密码,如果使用ssh-keygen没有输入,该值不用填。按照本操作文档弄,就是不用填值
Path to key:私钥路径,此配置如果设置了,就可以不用设置下面Key了。在下面的ssh-keygen执行完后,会输入私钥的路径,复制并粘贴进来
Key:私钥内容,此配置如果设置了,就可以不用设置上面的Path to key了
设置ssh免登陆
使用root用户登录,配置hosts
使用app(自己的非root)用户,配置ssh免登陆
ssh-keygen,交互的时候直接三次回车
ssh-copy-id,输入对应用的密码
添加SSH Server
Name:自己随便取,可读性强即可
Hostname:要接收构建后jar包的服务器ip或者域名
Username:远程主机用户名
Remote Directory:直接设置根目录,如果这样设置,要注意用户(app)的访问权限。如果这里设置了根目录,后面设置的发送目录时就可以直接输入全路径,避免造成误配。这一点很重要,我在测试时候,就踩了这个坑。
弄完之后,点击测试一下
全局工具设置
设置MAVEN
配置文件
设置maven主目录
去掉“自动安装”复选框
设置JDK
设置JDK主目录
设置GIT
设置Git文件目录
新建并构建任务
新建任务
前往 Jenkins -> New Item , name 输入 'Gitee Test',选择 Freestyle project
保存即可创建构建项目
任务全局配置
Gitee链接设置
任务全局配置中需要选择前一步中的码云链接。前往某个任务(如'Gitee Test')的 Configure -> General,Gitee connection 中选择前面所配置的码云联机,如图:
源码管理配置
前往某个任务(如'Gitee Test')的 Configure -> Source Code Management 选项卡
-
点击 Git
-
输入你的仓库地址,例如
[email protected]: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”,可以查看打包的日志输出
第一次构建,会下载很多包,过程比较漫长
打包完会输出如下日志
触发设置
构建动作设置
其中包含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
修改
true 为false 使用注释掉下面的内容:
true true false