解放双手 | Jenkins + gitlab + maven 自动打包部署项目

时间:2021-10-23 23:54:35

前言

记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程!

需求背景

不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运行,这种方式对于单应用部署还算可以,不会耗费太大时间,但假如分布式项目,拆分为多个微服务部署,那么每个服务都打包部署一遍,发布上线可能会耗时非常久,Jenkins + gitlab + maven 可以实现自动打包,部署到远程服务器~

什么是gitlab

程序员肯定都懂的,跟gayhub一样的东西,可以在内网自己搭建一套来管理项目代码。

什么是Jenkins

可以简单地理解为可以代替你实现自动从gitlab拉取代码,打包,部署到远程服务器的工具。

环境准备

使用`docker`安装`gitlab`

gitlab的安装这里不做过多记录,可以参考以下内容:

  • https://www.cnblogs.com/zuxing/articles/9329152.html

  • https://hub.docker.com/r/beginor/gitlab-ce/

使用`docker`安装`Jenkins`

1docker run --name jenkins --privileged=true -d -v /home/docker/data/jenkins_home:/var/jenkins_home -p 8090:8080 -p 50000:50000 jenkins/jenkins:lts

参数解析:

  • --name jenkins:指定 Jenkins 容器名称
  • --privileged=true:防止docker容器没有权限
  • -d:容器在后台启动
  • -v /home/docker/data/jenkins_home:/var/jenkins_home:将容器的/var/jenkins_home 映射到本机的/home/docker/data/jenkins_home目录,为了便于管理Jenkins容器的数据,需要注意的是,挂载出来的目录允许我们往容器里面添加文件或者目录,也就是在`/home/docker/data/jenkins_home:/var/jenkins_home`中添加的文件或者目录都会被映射到容器目录`/var/jenkins_home`,那么我们最终在`Jenkins`中配置软件环境时应当使用容器目录路径,因为`Jenkins`实际上是在容器中跑的,比如JDK家目录,你放在/home/docker/data/jenkins_home/jdk_home,那么最终配置应当写成/var/jenkins_home/jdk_home
  • -p 8090:8080 -p 50000:50000:将容器的8080端口映射到本机的8090端口,5000端口映射为5000端口
  • jenkins/jenkins:lts:指定镜像名称跟 tag

可能会踩的坑:

1chmod 777 /home/docker/data/jenkins_home
2chown -R 1000  /home/docker/data/jenkins_home

至此,Jenkins已经部署好了,然而….折腾才刚刚开始…

`Jenkins`基础配置

  1. 访问http://192.168.2.219:8090打开Jenkins首页如下图:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

按照界面提示,为了管理员安全地设置Jenkins,已将密码写入日志文件:/var/jenkins_home/secrets/initialAdminPassword,提示写的是Jenkins容器中的文件,映射到本机文件则是/home/docker/data/jenkins_home/secrets/initialAdminPassword,复制文件中的文本,输入,点击继续…滴滴滴~掉坑里了。

  1. 如果不出意外的话,这里有个,上一步之后会一直卡在如下图所示的加载界面:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

这是怎么肥事? 原来Jenkins在启动的时候,请求Google,检查当前机器是否可以联网,在请求/home/docker/data/jenkins_home/updates/default.json 中存在如下数据:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

而由于天朝的网络原因,请求Google失败,则一直卡住,解决办法是修改为www.baidu.com即可解决。

  1. 选择下载推荐的插件,还是自选插件,这里我选择下载推荐的插件,然后进入下载loading

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 创建管理员账号

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 配置Jenkins 资源 url,使用默认即可

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

至此,Jenkins 基础配置完成,开始使用。随后登录Jenkins后发现页面空白,没找到具体原因,重启下Jenkins 容器后再登录就好了。

`Jenkins`插件安装

Jenkins插件安装的步骤为:系统管理-->插件管理.. 相信聪明的你一定知道怎么安装了。我们需要安装的插件如下:

  • Maven项目插件:Maven Integration plugin,这个插件可以让我们创建一个maven构建任务
  • ssh传输工具插件:Publish Over SSH 项目打包完成后,使用这个插件,通过ssh的方式传输到远程服务器
  • Gitlab插件:允许Jenkins访问gitlab服务器,拉取代码

全局工具配置

系统管理-->全局工具配置,安装一些打包必须的配置环境,如 jdkmavengitmaven

安装git客户端:

  1. 下载

    1#下载 git
    2yum update
    3yum install git
    4
    5# 配置用于拉取gitlab代码的用户名和邮箱
    6git config --global user.name "yourname"
    7git config --global user.email "youremail"
  2. 配置公钥

生成ssh秘钥, 首先查看是否已经有ssh秘钥:

1cd ~/.ssh`

如果没有则提示没有此文件夹, 此时手动生成秘钥:

1ssh-keygen -t rsa -C “youremail”

连续按三次回车,生成id_rsaid_rsa.pub文件夹,查看公钥文件内容:cat id_rsa.pub,复制公钥到gitlab配置ssh key.

  1. 测试
1ssh -T git@192.168.2.219

如下结果表示配置成功:

1The authenticity of host '192.168.2.210 (192.168.2.210)' can't be established.
2RSA key fingerprint is SHA256:7oKBkxcwp5naXUzohvjPwEJsow6Y/pF1fSpWFZPVscA.
3RSA key fingerprint is MD5:9c:a1:39:7c:2c:6c:d0:a2:4b:e8:8d:3a:73:6e:c9:c1.
4Are you sure you want to continue connecting (yes/no)? yes
5Warning: Permanently added '192.168.2.210' (RSA) to the list of known hosts.
6Welcome to GitLab, jenkins_easywits!
7

最终配置如下图:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

安装 jdk:

如图:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

安装maven:

如图:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

添加凭据

凭据是为了访问Gitlab拉取代码使用的,分别创建三个凭据:账号密码类型,api token访问类型,git私钥访问类型,总体配置如下图:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

解析:

  • 账号密码类型凭据,只需要上gitlab创建一个账户,同时这个账户拥有访问项目仓库的权限即可。
  • api token类型则是使用上述步骤创建的账户登录GitLab,去生成一个访问令牌,如下图:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  • git私钥访问类型,拷贝git客户端私钥配置即可,如下图:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

全局系统配置

系统管理-->系统配置。。主要是配置访问GitLab服务器拉取代码,还有配置`ssh`远程服务器地址,目的是为了打包后上传文件到远程服务器。

GitLab配置如下图,使用git api token依据访问:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

ssh远程服务器配置如下图,主要配置远程主机名,主机ip,用户名/密码,还有远程根目录从/开始:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

至此,所有配置完成,可以创建构建任务了。

实战场景,自动部署web项目

  1. 创建一个 maven 构建任务

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 项目信息描述,指定远程连接gitlab

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 配置构建的缓存数量

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 拉取远程代码配置

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 构建触发器配置

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 打包配置

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. 打包后操作,配置ssh传输到远程服务器,执行远程shell脚本

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

最后保存,点击构建按钮,即可自动打包,并且部署到远程tomcat服务器。远程shell脚本如下:

 1#!/bin/bash
2# 配置java环境变量
3export JAVA_HOME=/usr/java/jdk/jdk1.8.0_161 # jdk 根目录
4export JRE_HOME=/usr/java/jdk/jdk1.8.0_161/jre # jre 目录
5export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
6export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
7
8# 配置tomcat环境变量
9export CATALINA_BASE=/home/wwwroot/easywits-operation/tomcat-easywits-operation
10export CATALINA_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation
11export TOMCAT_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation
12
13echo "stopping tomcat_easywits_operation......"
14#关闭tomcat
15port=xxxx
16#根据端口号查询对应的pid
17pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
18#杀掉对应的进程,如果pid不存在,则不执行
19if [  -n  "$pid"  ];  then
20    kill  -9  $pid;
21fi
22#删除tomcat旧war包
23rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits
24rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war
25#复制war包到tomcat/webapps目录,并重命名
26cp /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war
27# 文件名 + 当前日期时间错,备份发布文件包
28#DEPLOY_DATE=`date +%Y%m%d%H%M%S`
29#DEPLOY_FILE_NAME=easywits-op-server_$DEPLOY_DATE.war
30#mv /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/deploy_history/$DEPLOY_FILE_NAME
31rm -rf /home/wwwroot/easywits-operation/deploy_history/*
32echo "restarting tomcat_easywits_operation......"
33sleep 5
34/home/wwwroot/easywits-operation/tomcat-easywits-operation/bin/startup.sh
35

整个shell脚本很常规,就是将文件复制到tomcatwebapp目录下,并重启。

  1. 部署结果,看看日志信息如下,表示成功:

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

提交代码,自动打包部署

gitlab代码仓库发生事件:提交代码等操作时,触发打包部署动作

  1. Jenkins配置

解放双手 | Jenkins + gitlab + maven 自动打包部署项目解放双手 | Jenkins + gitlab + maven 自动打包部署项目

  1. GitLab代码仓库配置

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

这样,当推送代码到指定代码仓库时候就会触发自动打包部署啦!

总结

  • Jenkins 自动打包部署操作,理论上跟本地打包部署是一个道理,该安装的环境一个不能少,只不过可以自动化罢了
  • Jenkins可以做的事情还有很多,配置太多啦,一篇文章也只能做个引导作用,更多配置还是需要多看

最后

记录一个自动部署的操作,后续会不定期更新原创文章,欢迎关注公众号 「张少林同学」!

解放双手 | Jenkins + gitlab + maven 自动打包部署项目

解放双手 | Jenkins + gitlab + maven 自动打包部署项目的更多相关文章

  1. jenkins+git+maven搭建自动化部署项目环境

    简介    折腾了两个晚上,趁着今晚比较有空,把jenkins+git+maven搭建自动化部署项目环境搭建的过程记录一下,这里我把github作为git的远程仓库(https://github.co ...

  2. jenkins自动打包部署项目

    首先去jenkins的官网下载安装包 https://jenkins.io/   个人下载是长期稳定的那个版本,下载后,得到一个.msi的安装包: 点击进行安装,然后一直点击下一步. jenkins会 ...

  3. Maven 插件打包部署项目

    clean install -Dmaven.test.skip=true:打包工具 clean package  

  4. jenkins+Gitlab+maven+tomcat实现自动集成、打包、部署

    一.前言 首先出于提高自己技术水平和琢磨能做点什么能提高工作效率,上线工作实在无聊.重复(手动编译.打包,传包,重启),于是就想到了jenkins,jenkins持续集成已经不是什么新鲜的话题,网上文 ...

  5. Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器

    原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...

  6. DevOps系列——Jenkins/Gitlab自动打包部署

    前面只说了DevOps的两个基础组件Jenkins和GitLab,客官也不要着急,我们玩就玩的深入一点,Gitlab和Jenkins的各种配置和 插件很多,也够啃一阵子的,不要照着操作一通就感觉万事大 ...

  7. SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战

    1.前言与初衷 本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用. 本文章会涉及结合工作过程中部署不同环境服务器的项目案例场景为初心进行实际细讲. 本文章主要讲述Docker.Jen ...

  8. 【iOS】Jenkins Gitlab持续集成打包平台搭建

    Jenkins Gitlab持续集成打包平台搭建 SkySeraph July. 18th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点: ...

  9. 使用Jenkins进行Android自动打包,自定义版本号等信息【转】

    之前App在提交测试和最终部署的过程中App打包一直是由开发人员来完成的,由于项目比较大, 再加上Android打包本身就比较慢,所以每次打包还是很耗时的.并且按照严格的研发流程来讲,开发人员应该只负 ...

随机推荐

  1. 数据结构:基于list实现二元表达式(python版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- def make_sum(a, b): return ['+', a, b] def make_prod(a, ...

  2. python 之 Django 小案例

    一, F  Q # F 使用查询条件的值 # # from django.db.models import F # models.Tb1.objects.update(num=F('num')+1) ...

  3. Ajax PHP项目实战

    这两天在实验楼学习ajax,后台是用php写的,下面我将三个实战项目分享出来,也方便我以后随时查看. 第一个项目我写的注释比较详细,第二个和第三个注释就写的比较少了,因为用的方法都差不多:这三个项目都 ...

  4. ABAP 内表的行列转换-发货通知单2

    *&---------------------------------------------------------------------* *& Report  Z_TEST_C ...

  5. JavaScript声明全局变量的三种方式

    JavaScript声明全局变量的三种方式   JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为 ...

  6. 你应该知道的2016年有关App开发的技术创新

    上一篇简述了2016年有关App产品的年中总结,这篇开始历数有关App开发的技术创新!无论你是创业者,还是程序员,无论你是否懂编程.写代码,利用APICloud平台数据撰写的年中总结,集合了移动应用创 ...

  7. 【转】Android Studio简单设置

    原文网址:http://ask.android-studio.org/?/article/14 Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以 ...

  8. [Javascript] The Array map method

    One very common operation in programming is to iterate through an Array's contents, apply a function ...

  9. 转载---SQL Server XML基础学习之<5>--XQuery(query)

    本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法 T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集. XQuery 基于现有的 XPa ...

  10. 移动应用产品开发-android开发 新闻模块开发 百度Frontia组件应用之分享

    这两天主要做了新闻模块的开发,做了新闻列表,新闻详情,数据结构解析,以及百度 Frontia 组件的研究. 新闻模块用的是开源中国的android开源代码里的代码,主要是模仿它的源码架构,首先打开是资 ...