• Gitlab+Jenkins自动化部署,解放双手


    项目打包

    ​ 在部署项目前需要对源码进行打包,一个简单的SpringBoot项目默认是打包为jar包,也就是在pom.xml中的jar方式,当然也会有一些打包成war包方式,使用外置的Tomcat应用服务器部署war包,那么就是war

    在父子类聚合项目中,父工程的pom.xml文件中的打包方式就需要改为pom,如下:

    <packaging>pompackaging>
    
    • 1

    那么所有的子工程pom.xml中,就需要改为jar方式,或者war

    jar包是默认的打包方式,子工程如果是打包成jar包那么不需要改任何配置,war包时如下配置

    <packaging>warpackaging>
    
    • 1

    并且所有的子工程中需要,导入maven插件配置

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <configuration>
                    <executable>trueexecutable>
                    <layout>JARlayout>
                configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                        <configuration>
                            <attach>falseattach>
                        configuration>
                    execution>
                executions>
            plugin>
        plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    执行打包

    在具有maven环境的情况下,到父工程pom.xml文件所在目录下执行

    mvn clean package
    
    • 1

    即可将此父工程下所有子工程进行打包,假如这里得到了三个jar包为consumer.jarprovider1.jarprovider2.jar

    那么就可以手动执行部署了。

    命令行部署

    使用命令行方式去部署3个jar包,可以说非常简单,但还要考虑项目中需要的一些环境:

    • 服务器需要由java的jdk环境,能使用java命令
    • 假如项目中用到了nacos,那么还需要做好nacos环境的配置及服务的启动
    nohup java -jar consumer.jar > consumer.logs.log 2 >&1 &
    nohup java -jar provider1.jar > provider1.logs.log 2 >&1 &
    nohup java -jar provider2.jar > provider2.logs.log 2 >&1 &
    
    • 1
    • 2
    • 3

    nohup:不挂断运行

    > xxx.logs.log 2 > &1 &:将程序日志输出到某个位置并且后台运行。

    那么这些都是手动运行,目前而言大多都采用了自动化部署。

    Jenkins

    手动运行需要每次都去上传jar包,然后更新jar重启服务。若服务数量较少还比较好,一旦遇到微服务多jar包情况下,手动就会显得很繁琐而无助。或者说可以采用shell脚本的方式去部署,但这都不是最优秀的解决方案。可以使用Jenkins部署运行服务。

    介绍

    Jenkins的前身是Hudson。Jenkins是一款较为流行的开源持续集成工具,地位几乎可以说是CI&CD软件领导者,已经超过了Hudson,它拥有超过1000个插件来支持项目的构建和部署。几乎可以适用于所有的项目,没有项目编程语言的限制。

    CI&CD:

    • 持续集成(Continuous Integration,CI):指的是团队成员每天一次或多次把代码集成到主干。每次集成会自动构建,尽快尽早发现错误。持续集成是为了让产品快速迭代,同时保证高质量。
    • 持续交付(Continuous Delivery):指的是持续将新的功能部署到类生产环境(可理解为测试环境qa、uat),交给质量团队或用户,交给它们评审
    • 持续部署(Continuous Deployment):指的是通过评审后,自动部署到生产环境中

    Jenkins的特性:

    • 系统平台无关性:Jenkins本身是由Java语言编写,理论上只要由java的运行环境,就能使用Jenkins
    • 编程语言无关性:支持多种编程语言的项目持续集成、持续部署,而非只有java一种
    • 安装和配置简单:可以通过yum安装或war包、Docker方式等,由简洁易用的web界面完成配置
    • 插件丰富:拥有超过1000个插件,几乎可以满足任何项目的需要
    • 容易扩展:Jenkins可以通过其插件架构进行扩展,为用户提供无限可能
    • 分布式构建:Jenkins能使多台服务器一起构建
    • 消息通知:构建完成后发送email通知结果

    下载和安装

    Jenkins的官网地址是https://www.jenkins.io/,下载软件包的地址https://www.jenkins.io/download/。推荐下载LTS(长期支持)版本。笔者这里选择Generic Java package(.war),只需要java环境即可。

    当然要注意你选择版本要和你本地的jdk环境的兼容关系:

    在这里插入图片描述

    笔者是java8的环境,选择一款适用的jenkins版本即可。笔者选择2.346.3版本。

    提供下下载地址:https://get.jenkins.io/war-stable/2.346.3/jenkins.war

    运行

    • war包下载完毕后,不需要额外的步骤(前提是有java环境),是可以直接运行的
    java -jar jenkins.war --httpPort=8085
    
    • 1
    • –httpPort是设置程序端口号,若要使程序不挂断后台运行,可以这样执行
    nohup java -jar jenkins.war --httpPort=8085 > jenkins-logs.log 2 >&1 &
    
    • 1

    服务运行后,成功访问UI页面,记得需要打开防火墙的端口哦

    firewall-cmd --permanent --zone=public --add-port=8085/tcp
    firewall-cmd --reload
    
    • 1
    • 2
    • 打开jenkins的UI地址(笔者这里是http://192.168.1.41:8085)

    在这里插入图片描述

    我们需要去上面的相应文件中去找到密码,然后填写,确定即可。

    注意:第一次启动Jenkins会初始化去下载一些元(metadata)数据,打开界面时提示等待大概4分钟,等待期间,使用F12调试时,看到报错503是正常现象。等待日志打印Jenkins is fully up adn running 即可

    • 下一步会让用户安装插件,若是新手可以选择Jenkins推荐的插件,可以减少很多的步骤。笔者这里也选择推荐的插件了,唯一的缺点是下载的东西多,稍微会慢点。

    • 完成后创建一个管理员用户

    在这里插入图片描述

    Jenkins配置

    Jenkins初始化完成后,还需要配置一些全局工具,如jdk,maven,git。在Jenkins后台页面点击Manage Jenkins,再点击Global Tool Configuration配置全局工具JDK、maven、git

    配置maven

    在这里插入图片描述

    找好你的settings.xml文件的路径,配置到这里即可。然后再去配置maven的路径

    在这里插入图片描述

    注意:如果你的maven的bin目录没有可执行的权限,要记得增加可执行权限,否则执行命令时会报错:Permission denied,可以在maven的根目录下使用命令赋权:chmod +x -R bin

    配置jdk

    直接输入JAVA_HOME的安装地址即可

    在这里插入图片描述

    最后配置git的目录,记得先安装git

    yum install -y git
    
    • 1

    使用yum安装的git,目录是/usr/bin/git

    在这里插入图片描述

    GitLab简介&安装

    持续集成一般有3个组成的要素:

    • 一个自动构建的过程,代码检出、编译构建等过程都是自动完成,无需人工
    • 一个代码存储库(SVN或git)
    • 一个持续集成服务器(如Jenkins)

    现在还缺少一个代码存储库。在企业中为了掌握代码的所有权,一般都会自动搭建代码存储库。可以使用Gitlab。

    GitLab使用git作为代码管理工具,并且在此基础上开发了Web管理页面来进行项目管理。

    与github最大的不同是,gitlab部署在自己的服务器上,所有权都是掌握在自己手中。

    采用yum方式安装GitLab

    • 安装需要的依赖和设置ssh开机自启动,开启ssh及配置防火墙
    yum install -y curl policycoreutils-python openssh-server
    systemctl enable sshd
    systemctl start sshd
    firewall-cmd --permanent --add-service=http
    firewall-cmd --permanent --add-service=https
    systemctl reload firewalld
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 安装Postfix并设置开机自启动、开启Postfix,便于邮件通知
    yum install -y postfix
    systemctl enable postfix
    systemctl start postfix
    
    • 1
    • 2
    • 3
    • 添加Gitlab软件包存储库并安装软件包
    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | bash
    
    • 1
    • 配置Gitlab访问地址并安装Gitlab(http://192.168.1.41是gitlab访问地址)
    EXTERNAL_URL="http://192.168.1.41" yum install -y gitlab-ee
    
    • 1
    • 打开防火墙端口(或关闭防火墙)
    firewall-cmd --permanent --zone=public --add-port=80/tcp
    firewall-cmd --reload
    
    • 1
    • 2
    • 完成后,打开http://192.168.1.41,第一次进入时需要去/etc/gitlab/initial_root_password找下初始化密码,然后登录即可

    在这里插入图片描述

    Docker方式安装Gitlab

    使用Docker方式安装Gitlab是比较快捷的方式,如下命令即可:

    mkdir -p /data/gitlab # 先创建gitlab存储数据、配置、日志的目录
    
    docker run -d --hostname 192.168.1.41:80 --publish 443:443 --publish 80:80 --publish 23:22 --name gitlab --restart always --volume /data/gitlab/config:/etc/gitlab --volume /data/gitlab/logs:/var/log/gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:latest
    
    • 1
    • 2
    • 3

    -d : 后台运行

    –hostname:gitlab服务地址

    –publish或-p:宿主机和容器的端口映射

    –name 设置容器名称

    –volume或-v:宿主机和容器的目录映射

    –restart always: 开机自启

    Gitlab常用命令

    • gitlab-ctl start:启动
    • gitlab-ctl stop:停止
    • gitlab-ctl status:查看
    • gitlab-ctl restart:重启

    Jenkins+Gitlab部署运行

    现在已经有了存储库,然后创建git仓库把项目上传到Gitlab上面。

    git init 
    git remote add origin http://192.168.1.41/root/jenkins-demo.git
    git add .
    git commit -m "Initial commit"
    git push -u origin main
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这些就比较简单了,笔者这里不再赘述了。直接展示下项目的目录

    在这里插入图片描述

    需要注意的是:如果普通用户push代码,可能会没有权限,管理员设置下即可。

    Jenkins页面创建任务

    • 在Jenkins页面点击新建项目(New Item),输入项目名称(名称随便取,别重复)。选择自由风格项目。

    在这里插入图片描述

    • 在General一栏输入描述,可以任意填写,重要的是源代码管理,仓库地址就填写gitlab的项目地址,然后添加你的gitlab账号的凭证(账号密码)。
    • 完成后,下面有一个分支选择,选择你要部署的分支即可。

    在这里插入图片描述

    • 来到构建这一栏,点击添加构建步骤,选择Invoke toplevel maven targets(调用顶层 Maven 目标)项,maven版本选择配置好的,目标Goals填写clean package

    在这里插入图片描述

    这里的maven命令不需要添加mvn,请注意!!

    • 打包完成后,就可以运行jar包了,再增加一个构建步骤,选择Excecute shell,执行shell命令,在Command输入以下命令,考虑到可能出现第二次部署时,需要把上一次的jar停止,那么命令如下
    #!/bin/bash
    # 先停止进程
    ps -ef |grep consumer |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
    ps -ef |grep provider-8001 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
    ps -ef |grep provider-8002 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
    sleep 5s	# 5s后再启动
    BUILD_ID=dontKillMe	# 表示别干掉启动的程序
    cd consumer/target/
    nohup java -jar consumer-1.0-SNAPSHOT.jar > consumer.logs.log 2 >&1 &
    cd ../../provider-8001/target/
    nohup java -jar provider-8001-1.0-SNAPSHOT.jar > provider1.logs.log 2 >&1 &
    cd ../../provider-8002/target/
    nohup java -jar provider-8002-1.0-SNAPSHOT.jar > provider2.logs.log 2 >&1 &
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    完事后,保存即可。

    在这里插入图片描述

    • 点击立即构建,即可

    在这里插入图片描述

    同时还可以去看日志信息:

    在这里插入图片描述

    我们可以到服务器上看下程序有没有启动成功

    ps -ef |grep java
    
    • 1

    在这里插入图片描述

    成功部署了三个jar包。

    Webhook网络钩子

    当我们需要每次提交合并代码时,自动进行项目部署时,可以使用网络钩子Webhook完成我们的需求。

    大致流程就是:Jenkins提供一个地址,当代码有更新时代码存储库(gitlab)主动调用一次这个地址,触发Jenkins构建即可。

    需要在Jenkins上面安装Generic Webhook Trigger插件

    在这里插入图片描述

    到项目主界面,点击配置,到构建触发器那里,选择Generic Webhook Trigger一项,然后添加一个Token(随便写,但不要重复了)

    在这里插入图片描述

    那么,构建的URL格式如下:

    http://JENKINS_URL/generic-webhook-trigger/invoke/invoke?token=刚刚自定义的Token
    
    • 1

    JENKINS_URL:是JENKINS的访问地址。

    此项目中就是如下

    http://192.168.1.41:8085/generic-webhook-trigger/invoke/invoke?token=nihaowoshichufaqi
    
    • 1

    回到gitlab

    因为Gitlab10.6版本后,为了安全,默认不允许向本地网络发送Webhook请求,这里因为笔者是把gitlab和jenkins安装到一台服务器了,所以这里先允许发送本地网络webhook。

    在这里插入图片描述

    到gitlab项目中,设置webhook即可。这里暂时写所有分支push时触发了,实际可以按照项目情况执行。

    在这里插入图片描述

    配置完成

    完成后,即可提交任意分支的代码,看到jenkins已经自动触发构建了,并且jar也重新启动了

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Nginx 丢失Cookies问题。所需的防伪表单字段“__RequestVerificationToken”不存在
    【OI学习笔记】线性代数-高斯消元法
    java毕业设计选题二手车汽车车辆管理系统项目[包运行成功]
    一年跳一行,南京校区小哥哥最终选择在软件测试扎根,入职就拿9k!
    计算机网络 - 物理层 选择复习题
    【节能学院】数据机房中智能小母线与列头柜方案的对比分析
    2022最新windows上传ipa文件到app store的方法
    springboot 通过url下载文件并上传到OSS
    9. SQL中Insert into/Update/Delete的用法
    Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)
  • 原文地址:https://blog.csdn.net/weixin_45248492/article/details/133622203