唠叨一段

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

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

注册与配置花生壳

  1. 注册/登录花生壳

  2. 购买域名

  3. 购买内网穿透

  4. 设置花生壳

    • 开启花生壳

      514bdebcef1f11dbfb89a85942c7cc86436.jpg

    • 增加内网穿透映射

      865f9ff36b66e5dfad58fc8b3be703c5cb0.jpg

      我映射的80端口是被NGINX监听的(因为Jenkins等其他web应用也需要通过该域名被外网访问)

    • 测试。输入花生壳的域名,看能否访问到自己的web服务器网页

      0d394a3221218c1499a65b9a599cf30f601.jpg

      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分钟左右可以自己刷新页面,便会出来如下界面

0cc80d66cca4132d957cb4cf537dea0ab3c.jpg

圈出来的部分是下面要输入的密码保存位置

去LINUX主机上获取密码

cat /root/.jenkins/secrets/initialAdminPassword

2272cfb809984fd82ab8f56644da3129599.jpg

输入密码,点击下一步

cd27baa131c0b7ccfd5e074cd1b65802222.jpg

然后过几分钟会提示你安装插件,选择按照推荐的安装。

补充:可能会有朋友遇到这个页面出不来,提示连接失败,可以直接跳过,后面直接去“插件管理”里面选择对应插件进行安装。网上也有说去插件中心修改https为http,我试了一下不知道为什么不行,就选择了前面的本办法。

85bc021196aa68858a7a5ff0cb6878c928e.jpg

在不断的安装进行中

28d6c8ccf9d8e68ad084f49c577b1f4b9f0.jpg

只安装这点插件还不够,等会还要补充安装别的插件。

 

这一步完成之后,会提示创建用户,如果是生产环境,建议创建一个用户给予相应的权限。我自己继续使用的admin用户。最终进入主页

a892aed3914f227d23b4617cf20db9e3bcf.jpg

补充别的插件

选择路径:“系统管理”-》“插件管理”

5fc8582f833494f039232149ae71e51108b.jpg

安装Deploy to container\Gitee\Publish Over SSH\Maven Integration插件

注:可以选择完所有插件后,在点击安装(install without restart)

系统设置

选择路径:“系统管理”-》“系统设置”

设置Gitee

fe4167307ad094046e54effddba8ab82843.jpg

设置参考https://gitee.com/oschina/Gitee-Jenkins-Plugin#%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85中的“插件配置-添加码云链接配置”章节

02f0db2aa72f4765062c83182edc1c5b61b.jpg

设置完后,一定要测试一下是否链接成功

设置PUSH SSH OVER

设置界面

9499e55af51949334a7b6b11b1cdd2983b0.jpg

Passphrase:生成ssh公钥私钥时的密码,如果使用ssh-keygen没有输入,该值不用填。按照本操作文档弄,就是不用填值

Path to key:私钥路径,此配置如果设置了,就可以不用设置下面Key了。在下面的ssh-keygen执行完后,会输入私钥的路径,复制并粘贴进来

Key:私钥内容,此配置如果设置了,就可以不用设置上面的Path to key了

设置ssh免登陆

使用root用户登录,配置hosts

ac0f198fdefe6cbe91b5b9528f141b02ebe.jpg

使用app(自己的非root)用户,配置ssh免登陆

ssh-keygen,交互的时候直接三次回车

9850b846d0cc8cf1e8f84c00e9a77dca03f.jpg

ssh-copy-id,输入对应用的密码

6bfdd40bc9436db83eeb7ec38a3ea1a710e.jpg

添加SSH Server

f90920e009d09afbeab10ff6bdf65f24005.jpg

Name:自己随便取,可读性强即可

Hostname:要接收构建后jar包的服务器ip或者域名

Username:远程主机用户名

Remote Directory:直接设置根目录,如果这样设置,要注意用户(app)的访问权限。如果这里设置了根目录,后面设置的发送目录时就可以直接输入全路径,避免造成误配。这一点很重要,我在测试时候,就踩了这个坑

弄完之后,点击测试一下

全局工具设置

设置MAVEN

配置文件

2c40f4f61497dcdffea39e461b0dfcce2a6.jpg

设置maven主目录

2c39324e3005d34b756b08414f786e5432d.jpg

去掉“自动安装”复选框

3959c287c2828f26c48148becd1683bc111.jpg

设置JDK

设置JDK主目录

564b9ec975365e0cc64032f010d68efdfbe.jpg

设置GIT

设置Git文件目录

fcd6f1bc6be3c29ef5ba8f5f5146416a1c5.jpg

新建并构建任务

新建任务

前往 Jenkins -> New Item , name 输入 'Gitee Test',选择 Freestyle project 保存即可创建构建项目

2fc579699d1c11ffda45a8771f5f0dbdf16.jpg

 

79e638985d076361a0bf0bb85d52fca4704.jpg

 

任务全局配置

Gitee链接设置

任务全局配置中需要选择前一步中的码云链接。前往某个任务(如'Gitee Test')的 Configure -> General,Gitee connection 中选择前面所配置的码云联机,如图:

4ef0961761da44f5b9120b99e3a664b25cf.jpg

源码管理配置

前往某个任务(如'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. 其他是选择的默认值

f267f1be43256f74a038f25c98bc7c99936.jpg

添加证书

a2410c30e3f04114a714a30e5af964bd06b.jpg

最终设置完如图:

e99411661637c046a96e0a8efd14fad9062.jpg

设置构建目标

7d622cf3b08e5f14d8d96f2a45428ffa36f.jpg

测试构建

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

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

baad9b5988238d363577ce3279d8a491341.jpg

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

cd2664064bed18af78408d6639d58901fd7.jpg

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

1b03a736dbf82ee97f470b48ff69a9009bb.jpg

打包完会输出如下日志

d1d85c9a516a9a0047c14b11ab791e2fef3.jpg

触发设置

  1. 生成Gitee WebHook 密码

    c53e5c4662e41cbbbc0a76cd635f212e52d.jpg

  2. 在Gitee中设置WebHook密码

    0b3dd25aec8d63223b4c7643d2b11f969ba.jpg

  3. 其他全部默认值

  4. 测试触发是否成功

    在Gitee中点击

    ed8336366d682b8e66b4c26701c234efbfa.jpg

    观察Jenkins是否触发新的构建

    a9ff9ff46236f1cd7fc93c6a9e736661e49.jpg

    可以看到确实触发了新的构建

构建动作设置

其中包含Pre steps/Post steps,两者的作用类似于动态代理的invoke方法的前后执行的动作,或者Spring拦截器中的preHandle和afterHandle。

Pre steps:构建前执行的步骤,比如可以执行别的shell操作完成很多复杂的动作

Post steps:构建后执行的步骤

还有一个Post-build Actions

只是为了实现构建后进行文件传送和部署,设置Post steps/Post-build Actions都可以,我自己使用的Post-build Actions

c4bc7af7293716dbadb5bf7f532884c9660.jpg

fbbb560ad6a3651fe8867b517af23e42a54.jpg

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项目是否被触发构建

查看构建日志

debe49d56f720f82859427323637b7b6e6c.jpg

查看进程是否启动起来了

6d11af0400e64ca7cc9163c53bb27c7e9e0.jpg

验证应用是否正常

914e7e2269a9858ae4dbc7e698a3b0560f9.jpg

发现错别字了吧,笑一笑也不错

OK,全部通过。。。

补充:

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

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

    改为

    java -jar $APP_HOME/$JAR_NAME

    效果如下:

    3a20682701742eaf38c1f8598b27a7c629d.jpg

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

  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>

转载于:https://my.oschina.net/u/3049601/blog/3016361

更多推荐