Jenkins+Gitlab+Maven自动构建部署代码

一、部署说明

通过jenkins配合gitlab可以达到自动触发仓库构建,然后自动部署代码至目标服务器,这样可以减少人工重复性操作,具体的过程是:代码仓库更新,jenkins检测到更新并触发构建机制,推送构建后的代码至应用服务器,通过远程执行shell脚本达到自动部署的效果,下面依次介绍jenkins的部署、gitlab部署以及jenkins的基本配置

二、相关应用部署

2.1.jenkins的部署

jenkins的部署方式多种多样,这里使用docker来部署,我的github上已经有了jenkins的docker部署仓库,这里还是详细贴出来作个说明

2.1.1.编写jenkins的Dockerfile

cat Dockerfile

FROM  jenkins/jenkins:lts
MAINTAINER linuxwt <tengwanginit@gmail.com>

USER root

ENV prog /etc/profile
RUN chmod +x ${prog}


ADD ./apache-maven-3.5.4-bin.tar.gz /usr/local/maven

RUN echo "export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4" >> /etc/profile
RUN echo "export PATH=\${MAVEN_HOME}/bin:\$PATH" >> /etc/profile

这里我们设定USER为root,因为一般我们部署的时候都是使用root用户在部署,如果没有该行,拉取的镜像默认用户为jenkins,这会导致后面产生权限问题,再就是赋予/etc/profile执行权限,是因为我们要在容器内添加mvn环境变量,配合后面映射的.bashrc文件可以达到不用每次进容器执行source /etc/profile,同时这里需要下载一个maven的包ADD进去
cat .bashrc

# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "`dircolors`"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'
source /etc/profile

构建镜像 docker build -t jenkins:maven .

2.1.2.编写jenkins的docker-compose.yml文件

cat docker-compose.yml

jenkins:
   restart: always
   image: jenkins:maven
   container_name: jenkins
   volumes:
      - ./jenkins_home:/var/jenkins_home
      - ./.bashrc:/root/.bashrc
      - /etc/localtime:/etc/localtime
      - /etc/timezone:/etc/timezone
   ports:
      - "8080:8080"
      - "50000:50000"

启动容器
docker-compose up -d
访问jenkins: http://ip:8080,会看到下面的一个提示画面
03bu-huo
从图中看到我们需要从图中目录下的一个日志文件里找到初始密码,这很简单
docker exec -it jenkins bash
cat /var/jenkins_home/secrets/initialAdminPassword
填入初始密码后会提示安装,并选择你想要安装的扩展,安装完成后你就可以自己设置登陆账号和密码了

2.2.gitlab的部署

前面我们已经将jenkins部署好了,现在需要部署gitlab配合jenkins作自动部署,一样也是用docker-compose来部署

2.2.1.编写docker-compose.yml

cat docker-compose.yml

gitlab:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  container_name: gitlab
  hostname: '172.168.1.27'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://172.168.1.27:9090'
      gitlab_rails['gitlab_shell_ssh_port'] = 2224
  ports:
    - '9090:9090'
    - '2224:22'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'

简单说明一下上面的配置作用:
上面的172.168.1.27是可以使用域名的
/srv/gitlab/data存储gitlab的数据
/srv/gitlab/config是gitlab的相关配置文件
/srv/gitlab/logs放置gitlab的日志文件
docker-compose up -d
访问地址http://ip:9090,出现如下画面表示部署成功
03asd

2.2.2.邮件服务配置

这里需要注册一个账号,但是碰到一个问题,就是发送的账号确认邮件收不到,这是因为使用docker部署的gitlab没有安装smtp服务,开通邮件发送功能只需要往文件/srv/gitlab/config/gitlab.rb里添加如下配置即可

cat <<EOF>> /srv/gitlab/config/gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "439757183@qq.com"
gitlab_rails['smtp_password'] = "tarymqgwbjdgbjde"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = "439757183@qq.com"

docker restart gitlab

测试是否生效
04jenkins2

2.3.jenkins的配置

2.3.1.工具配置

部署好了jenkins后,如果要使用它去部署java代码还需要做一些配置
选择系统管理->全局工具配置,这里我们需要配置三个工具的路径,jdk、maven、git
0311111
032222
0333333
以上图片中的路径只做参考,因为前面部署拉取的是官方镜像,容器里面的基础系统是Debian,对应的路径如上面三个图所示,如果是自定义Dockerfile然后构建的镜像,具体的路径按照自己安装jdk、git以及maven的路径来即可
配置好工具的路径后点保存

2.3.2.系统设置

选择系统管理->系统设置
以下图中所示为必须配置项
03asdadsd
上图配置了邮件发送的服务邮箱
034444
上图配置了扩展邮件发送服务以及默认接受邮件的邮箱
有时候我们需要知道构建的相关具体信息,可以编辑下面这两项
Default Subject

【构建通知】: $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!

Default Content

<b style="font-size:12px">(<span style="color:red">本邮件是程序自动下发的,请勿回复</span>)<br></b><hr>

<b style="font-size: 12px;">项目名称:$PROJECT_NAME<br></b><hr>

<b style="font-size: 12px;">构建编号:$BUILD_NUMBER<br></b><hr>

<b style="font-size: 12px;">GIT版本号:${GIT_REVISION}<br></b><hr>

<b style="font-size: 12px;" >构建状态:<span style="color:red">$BUILD_STATUS</span><br></b><hr>

<b style="font-size: 12px;">触发原因:${CAUSE}<br></b><hr>

<b style="font-size: 12px;">构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br></b><hr>

<b style="font-size: 12px;">构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br></b><hr>

<b style="font-size: 12px;">变更集:${JELLY_SCRIPT,template="html"}<br></b><hr>

035555
上图配置邮件发送服务
最后也是最关键的一个配置是配置SSH服务到目标主机
036666

2.3.3.配置任务

这里我们通过maven来构建一个java项目,首先选择Jenkins->New 任务,然后选择构建一个maven项目,输入名字example,点击OK,然后我们会进入任务配置界面,如下图所示
03general
首先我们配置General里的选项参数,这些参数会在后面的配置里面生效
03spe
03re
03mvn
这里我们配置了三个参数,分别是代码目录、分支及打包命令,具体情况要根据你后面的需要来配置,这里只是参考
然后进入源代码配置,这个没啥说的,填入相应的信息即可
03git
下面的Build Triggers、Build Environment、Pre Steps这里默认即可
然后到了Build
03bui
然后到了Post Steps
03ssh
这一步是把仓库里的代码打包后发送到目标服务器
然后构建设置默认
然后是Post-build Actions
0322222
这一步是远程到目标服务器,通过shell来进行相关操作
在部署java项目的时候有时候我们跑的可能是一个jar包,在脚本里执行nohup java *.jar &的时候最好后面跟上1>/dev/null 2>&1 | exit 0
最后是配置邮件
03333
03444

2.3.4.自动触发持续部署

jenkins的一个核心功能是可以自动去探测到远程仓库的提交触发任务的自动构建达到自动部署代码的目的,那么该如何配置呢?需要分别在jenkins和gitlab上进行配置
先获取gitlab的token
03token
选择settings->Access Token
03kkkk
03gggg
然后我们将获取的token在jenkins上进行设置
选择jenkins->系统管理->系统设置
03mmmm
测试一下是否成功,成功后继续进行下面的设置
jenkins->凭据->系统->全局凭据->添加凭据
03lll
注意上面的API token填写前面获取的token,保存
选择具体的任务进行自动触发配置
03ppp
上面的gitlab是我们前面在系统设置里设置token的时候取的名字,保持一致即可
03jjj
注意上图中红线部分的URL,后面要用到
03aa
03jenkins1

最后一步回到gitlab
选择具体的代码仓库,然后点击设置
03ffg
URL处填写前面记下来的URL
点击下图中相关位置测试
03test
正常的话会返回200