Jenkins+花生壳+nginx实现内网穿透的Springboot项目持续部署

唠叨一段

公司小什么都要节约一点,全部测试服务器都在公司局域网里,代码托管在Gitee当中,自从用了微服务(用SpringBoot拆解业务流程),开发与测试阶段部署jar太麻烦了,多早之前就据说过Jenkins,通过不停的踩坑终于完成了初步的Gitee+jenkins+花生壳(内网穿透)+nginx实现自动持续部署。里面还涉及到一些高级功能只能后面边使用边补充html

我在里面用到了nginx,对于不须要的朋友,直接忽略对应步骤便可,直接将tomcat的监听端口改成80java

注册与配置花生壳

  1. 注册/登陆花生壳linux

  2. 购买域名nginx

  3. 购买内网穿透git

  4. 设置花生壳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; 
          }
      }
      }

    到此为止花生壳的配置结束了

安装与配置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 选项卡

  1. 点击 Git

  2. 输入你的仓库地址,例如 git@your.gitee.server:gitee_group/gitee_project.git

    • 点击 Advanced 按钮, Name 字段中输入 originRefspec 字段输入 +refs/heads/:refs/remotes/origin/ +refs/pull//MERGE:refs/pull//MERGE

  3. Branch Specifier 选项,根据实际状况输入,我本身输入的*/master

  4. 其余是选择的默认值

添加证书

最终设置完如图:

设置构建目标

测试构建

此刻的构建只是从Gitee上拉取代码并进行打包,还不具有push代码触发构建的能力

进入到任务界面,点击“当即构建”

点击进度条,进入详情页面,点击“Console Output”,能够查看打包的日志输出

第一次构建,会下载不少包,过程比较漫长

打包完会输出以下日志

触发设置

  1. 生成Gitee WebHook 密码

  2. 在Gitee中设置WebHook密码

  3. 其余所有默认值

  4. 测试触发是否成功

    在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,所有经过。。。

补充:

  1. 为了能在Jenkins控制台观察到启动日志,能够修改restart,将

    java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log

    改成

    java -jar $APP_HOME/$JAR_NAME

    效果以下:

    图片最下面的圈圈,表示还在等待接收新的输入流作显示

  2. 为了避免让Jenkins等待应用服务器的输出,则能够修改restart.sh,将

    java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log

    改成

    nohup java -jar $APP_HOME/$JAR_NAME> $APP_HOME/app.log &

到底使用哪一种方式,看本身喜爱吧。

其余

忘记密码

  1. 找回admin密码

    使用jenkins启动用户登陆主机,执行以下命令:

    cd

    cd .jenkins/secrets

    cat initialAdminPassword

    里面的内容即是admin的密码

  2. 取消密码登陆

    使用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>
相关文章
相关标签/搜索