gitlab+jenkins自动化上线部署持续集成(代码片段)

author author     2022-12-27     596

关键词:

相信大家开始玩gitlab+jenkins的时候对着两个工具有肯定有一定了解,我就不做详细解释了,下面就跟大家简单的说下gitlab,jenkins之间工作关系:

GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运行各种自动化构建、测试或部署任务。所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率自动运行测试、构建和部署的任务,帮组开发团队更高效的集成和发布代码,下面是形象的图片:

技术分享图片

废话也不多说直接把我自己在摸索使用过程积攒下来的心德记录下来,给大家做技术分享也方便以后自己回顾,如果有参考不是很清楚的地方,可以多看几遍或者结合官方文档研究研究肯定是会成功的,世上无难事只怕有心人。

汉化部分参考文档:
https://www.cnblogs.com/straycats/p/7637373.html

实验所需安装包:
链接:https://pan.baidu.com/s/1ZzOHQQIhXk7gjtFSZ_hNYw 密码:z9zy

环境部署:

  1. 安装gitlab:(汉化版)

首先安装git:

yum -y install git

获取最新汉化版本库:

git clone https://gitlab.com/xhang/gitlab.git

查看汉化补丁包:

cat gitlab/VERSION

安装gitlab依赖项:

yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python

启动postfix并设置开机自启动:

systemctl start postfix
systemctl enable postfix

若防火墙是开启状态的则需要配置一下规则:

firewall-cmd --add-service=http --permanent
firewall-cmd --reload

下载gitlab安装包:

方法一、
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.0.2-ce.0.el7.x86_64.rpm

方法二、
https://packages.gitlab.com/gitlab/gitlab-ce/

安装rpm包:

rpm -i gitlab-ce-10.0.2-ce.0.el7.x86_64.rpm

配置gitlab:

gitlab-ctl reconfigure

修改gitlab配置:

vim /etc/gitlab/gitlab.rb

将external_url变量地址改为gitlab所在主机IP
技术分享图片

重新加载配置文件:

gitlab-ctl reconfigure
gitlab-ctl restart

查看gitlab版本:

head -1 /opt/gitlab/version-manifest.txt

覆盖汉化包:

gitlab-ctl stop                                                  #停掉gitlab

cd /root/gitlab                                                 #切换到gitlab汉化包目录下

git diff v10.0.2 v10.0.2-zh > ../10.0.2-zh.diff   #比较汉化标签和源标签并导出patch用的diff文件导/root

cd /root                                                           #切回/root目录下并将10.0.2-zh.diff作为补丁更新到gitlab中

yum install patch -y
patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < 10.0.2-zh.diff

启动gitlab:

gitlab-ctl start

注:如果gitlab启动失败需要查看本地80端口是否被占用,gitlab默认使用的是80,若需要修改默认端口号查看参考:https://segmentfault.com/a/1190000011266124

重新载入配置:

gitlab-ctl reconfigure

通过Web登录查看:

http://IP
#默认是root和root密码即可登录

访问结果如下:
技术分享图片

  1. 下面安装jenkins依赖环境:

安装jdk:

tar zxf jdk-8u91-linux-x64.tar.gz –C /usr/local
ln –s /usr/local/jdk1.8.0_91 /usr/local/jdk

添加jdk环境变量:

vim /etc/profile
JAVA_HOME=/usr/local/jdk
export JRE_HOME=/usr/local/jdk/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

安装maven:

tar zxf apache-maven-3.5.3-bin.tar.gz –C /usr/local/
ln –s /usr/local/apache-maven-3.5.3 /usr/local/maven

添加maven环境变量:

M3_HOME=/usr/local/maven
export PATH=$M3_HOME/bin:$PATH

加载环境变量:

source /etc/profile

查看jdk是否安装成功:
技术分享图片

查看maven是否安装成功:
技术分享图片

部署tomcat8.0:
注:tomcat版本和jdk版本需要需要吻合否则启动成功web访问jenkins始终不成功,最好使用jdk1.8,tomcat8.0

创建tomcat存放目录:

mkdir -p /home/app/tomcat8.0

解压tomcat:

tar zxf apache-tomcat-8.0.51.tar.gz -C /home/app/tomcat8.0

启动tomcat查看是否成功:

/home/app/tomcat8.0/bin/startup.sh 

查看端口启动情况,并使用web访问:
技术分享图片

技术分享图片

将jenkins程序包放到tomcat里面并重新启动:

mv jenkins.war /home/app/tomcat8.0/webapps/Jenkins.war 

注:如果是本地jenkins的话想关闭web登录校验,可以参考:
##################################

查看jenkins程序包是否正常启动:
直接查看webapps目录即可
技术分享图片

测试访问jenkins:
http://IP:8080/jenkins
注:第一次访问jenkins等待时间可能较长,等待的时候需要看服务器的性能
技术分享图片

打开界面后,会根据提示发到服务器上查看初始密码:
技术分享图片

登录进入后选择安装插件:
注:最省事的方式就是安装官方推荐的插件,但有些时候点击无效,不用着急后面我们进入jenkins可以选择我们需要安装插件

方法一、
技术分享图片

插件等待过程中:
技术分享图片

方法二、
登录jenkins后点击管理插件:
技术分享图片

如果在可选插件中看不到插件,点击高级:
技术分享图片

高级地下有个提升站点:
站点地址:http://mirror.xmission.com/jenkins/updates/update-center.json

技术分享图片

然后点击左下角提交,在点击右下角立即获取后查看可选插件看是否有插件可选择,如果没有重启jenkins即可(重启jenkins方式即重启tomcat)

安装插件:
jenkins自带的过滤不好用,使用浏览器的过滤器过滤ctrl+f 进行搜索
技术分享图片

搜索一下几个关键字,把带有此关键字的全部安装:shell,maven,jdk,git,gitlab,ssh 把搜索到的插件都安装后重启jenkins

配置全局工具:
技术分享图片

配置JDK:
把自动选的“自动安装”取消掉,并点击新增JDK
技术分享图片

注:JAVA_HOME为jdk路径

配置Git:
查找git路径
技术分享图片

技术分享图片

配置maven:
技术分享图片

最后选择save

下面是三个jenkins需要调用的脚本:cloud-run.sh(jenkins服务端),run-pord.sh(客户端),check-port.sh(客户端),放在/opt/work/目录下,也可以修改脚本内容自己定义:(此处的脚本支持java的spring cloud程序,其他语言或者框架如使用此脚本请稍作修改)
vim /opt/work/cloud-run.sh

#!/bin/bash  

#变量定义
jenkins_item=$1
app_name=$2
source_jar_path="/root/.jenkins/workspace/$jenkins_item/$app_name/target/$app_name-*.jar"
run_cmd_path="/opt/work/run-prod.sh"
run_cmd="/opt/work/./run-prod.sh"
app_home=/opt/work/$app_name
now_user=root
all_param=$3
#本地通过ssh执行远程服务器的脚本  
function check_http()
        now_ip=$1
        now_app_port=$2
        sleep_time=$3
        justWeb=`curl -I -m 10 -o /dev/null -s -w %http_code http://$now_ip:$now_app_port`
        if [ !"$justWeb" = 404 ];
        then
                if [ !"$sleep_time" = 10 ];
                then
                        echo "执行$justWeb时间$sleep_times,构建失败"
                        exit 1;
                else
                        sleep_time=$(($sleep_time+1))
                        check_http $now_ip $now_app_port $sleep_time
                fi
        fi

for i in $all_param[@]
do
        OLD_IFS="$IFS"
        IFS=","
        arr=($i)
        IFS="$OLD_IFS"
        now_ip=$arr[0]
        now_port=$arr[1]
        now_app_port=$arr[2]
        jar_path=$app_home/$app_name-$now_app_port.jar
        echo $now_ip
        echo $now_port
                echo $now_app_port
        #复制脚本到远程地址
        scp -P $now_port $run_cmd_path [email protected]$now_ip:$run_cmd_path

        ssh -t -p $now_port [email protected]$now_ip "mkdir -p $app_home"
        #复制程序jar到远程地址
        scp -P $now_port $source_jar_path [email protected]$now_ip:$jar_path

        #执行远程脚本
        ssh -t -p $now_port [email protected]$now_ip "chmod +x $run_cmd_path"
    ssh -t -p $now_port [email protected]$now_ip "$run_cmd restart $app_name $now_app_port"
        check_http $now_ip $now_app_port 1
        sleep 30s
        ID=`ssh [email protected]$now_ip ‘/opt/work/check-port.sh‘`
        if [ "$ID" == 0 ]; then
                echo "$ID"
                echo "程序启动正常"
        else
                echo "$ID"
                echo "程序启动失败"
                exit
        fi
        sleep 30s
done

vim /opt/work/run-pord.sh

#!/bin/bash --login

APP_NAME=$2
APP_PORT=$3
APP_HOME=/opt/work/$APP_NAME

#创建目录
if [ ! -d "$APP_HOME" ];then
  mkdir -p $APP_HOME
fi

if [ ! -d "$APP_HOME/logs" ];then
  mkdir $APP_HOME/logs
fi

APP_LOG_PATH=$APP_HOME/logs/$APP_PORT
LOG_PATH=$APP_HOME/logs/$APP_PORT.out
JAR_FILE=$APP_NAME-$APP_PORT.jar
BACK_JAR_FILE=$APP_NAME-$APP_PORT.back
PID_FILE=$APP_HOME/$APP_PORT.pid

pid=""
function start()
  checkpid
  if [ ! -n "$pid" ]; then
    nohup java -server -Xms512m -Xmx1024m -jar $APP_HOME/$JAR_FILE --spring.pid.file=$PID_FILE --server.port=$APP_PORT --logging.path=$APP_LOG_PATH > $LOG_PATH 2>&1 &
    echo "---------------------------------"
    echo "启动完成>>>>>"
    echo "---------------------------------"
    sleep 2s
        exit 0
  else
      echo "$APP_NAME is runing PID: $pid"  
  fi



function reback()
        #还原备份文件
        cp $APP_HOME/$BACK_JAR_FILE $APP_HOME/$JAR_FILE
        restart


function status()
   checkpid
   if [ ! -n "$pid" ]; then
     echo "$APP_NAME not runing"
   else
     echo "$APP_NAME runing PID: $pid"
   fi


function checkpid()
        pid=`ps -ef |grep $JAR_FILE |grep -v grep |awk ‘print $2‘`


function stop()
    checkpid
    if [ ! -n "$pid" ]; then
     echo "$APP_NAME not runing"
    else
      echo "$APP_NAME stop..."
          #curl -X POST ‘http://127.0.0.1:$APP_PORT/system/shutdown‘
          kill -9 $pid
          sleep 1s
          stop
    fi


function restart()
    stop
    sleep 1s
    start


case $1 in
          start) start;;
          stop)  stop;;
          restart)  restart;;
          status)  status;;
          reback)  reback;;
#              *)  echo "require start|stop|restart|status|reback"  ;;  
esac

vim /opt/work/check-port.sh

#!/bin/bash
#检测本地程序端口
source /opt/work/run-prod.sh
check_port() 
        netstat -tlpn | grep "$1" >> /dev/null

if check_port $APP_PORT
then
        echo "0"
#    exit 1
else
        echo "1"
fi

此处构建需要用到无秘钥登录,即是jenkins服务器本地部署都需要本机无秘钥登录:

无秘钥登录配置方法:

ssh-keygen (接下来一路狂按回车即可)
cd /root/.ssh/
cat id_rsa.pub >> authorized_keys

测试是否可以无秘钥登录:
技术分享图片

现在一切准备好了,开始创建个新任务构建下看看是否成功:
点击新建项目
技术分享图片

确定后进行配置:
General
技术分享图片

源码管理:
技术分享图片

注:
Repositories配置:
Repository URL: 为gitlab中项目连接
Credentials:设置为gitlab中登录的用户名和密码

gitlab中项目连接如下:
点击到需要上线的项目中

技术分享图片

Credentials设置:

技术分享图片

Branch Specifier (blank for ‘any‘):项目分支

技术分享图片

构建触发器和构建环境不用设置:
技术分享图片

配置构建:
刚开始是没有调用顶层Maven目标和执行shell的,需要手动添加:
技术分享图片

配置调用顶层Maven目标:
技术分享图片

目标:进行打包方式,每种打包方式不同可以问研发,后面的-P dev 为代码中配置文件

执行shell:
技术分享图片

命令:/opt/work/cloud-run.sh hcb-eureka-dev hcb-eureka "192.168.3.206,22,10100"
/opt/work/cloud-run.sh :jenkins服务上运行在服务端的一个脚本
hcb-eureka-dev:jenkins项目名
hcb-eureka :gitlab中拉去打包代码的子项目名,同时也是服务器中创建的文件夹名
192.168.3.206:程序需要上传到的服务IP
22:远程的端口号(每次都需要)
10100:程序的端口号
注:此脚本支持同一个程序往不同服务器上上线,可以是通一个端口也可以是不同端口,shell的配置方式如:
技术分享图片

构建后操作可以不用设置,直接点击保存即可:
技术分享图片

此时可以点击立即构建:
技术分享图片

构建历史中可以看到正在构建和已经构建过的项目:
技术分享图片

点击到一个构建项目中,项目中可以看到详细信息,以及在构建中弹出的日志:
控制台输出
技术分享图片

构建结束后可以看到success:
技术分享图片

在服务器中查看程序是否启动,以及端口监听:
技术分享图片

查看端口监听,以及进入目录进行查看:
技术分享图片

进入/opt/work/目录下查看:
技术分享图片

此时可以看到构建已经完成了,完全没有瑕疵


gitlab+jenkins不仅可以自动化java程序其他程序也可以构建,不过构建方式和上线脚本有所改动,很妒忌人以为gitlab+jenkins只能上线java的代码,其实是大家进入了误区,只是市面上现在用java比较多而已

60-cicd持续集成-jenkins连接gitlab资源并且自动部署上线全流程

Jenkins实现CICDJenkins结合GitLab实现代码下载导入项目Jenkins安装和Gitlab相关的插件在管理插件中搜索需要gitlab的相关插件并安装Jenkins服务器创建访问GitLab的凭据Jenkins所支持的凭证类型如下用户名和密码(Usernamewithpassword)SSH用户名和... 查看详情

linux-gitlab+jenkins持续集成+自动化部署(代码片段)

GitLab+Jenkins持续集成+自动化部署什么是持续集成?(1)Continuousintegration(CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成。每次集成都... 查看详情

持续集成+自动化部署[代码流水线管理及jenkins和gitlab集成]

持续集成+自动化部署[代码流水线管理及Jenkins和gitlab集成]标签(空格分隔):Jenkins一、代码流水线管理  Pipeline名词顾名思义就是流水线的意思,因为公司可能会有很多项目。如果使用jenkins构建完成后,开发构建项目需要一... 查看详情

1.gitlab和jenkins结合构建持续集成(ci)环境

...开发过程中,可以频繁的将代码部署集成到主干,并进行自动化测试。持续交付:持续交付指的是在持续集成的环境基础之上,将代码部署到预生产环境。持续部署:在持续交付的基础上,把部署到生产环境的过程自动化。 ... 查看详情

jenkins持续集成--看我如何从1到代码自动部署(代码片段)

jenkins持续集成看我如何从1到代码自动化部署背景近期由于工作原因需要学习jenkins持续化集成。对于一个好学又帅气的我来说。学习他还不是手到擒来。公司为一个中小型创业公司,在部署代码上面,很少用gitlab、jenkins等等,... 查看详情

jenkins+git+gitlab+ansible实现持续集成自动化部署静态网站--技术流ken(代码片段)

 前言 在之前已经写了关于Git,Gitlab以及Ansible的两篇博客《Git+Gitlab+Ansible剧本实现一键部署Nginx--技术流ken》,《Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken》,以及关于jenkins的简单使用《Jenkins持续集成介... 查看详情

jenkins+git+gitlab+ansible实现持续集成自动化部署动态网站--技术流ken(代码片段)

...流ken》中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个静态的网站。如果大家可以熟练掌握以上内容,势必会在工作中减轻不小的工作量。本篇博客将再次使用这四个工具结合freestyle和pipeline来完成动态网站的... 查看详情

jenkins+gitlab实现持续集成(代码片段)

...)如何高效准确的实现持续集成?必不可少的需要一套能自动化、并且可视化的平台来帮助我们!二、为什么Jenkins能帮助我们进行持续集成?1)Jenkins是一个开源的、且基于JAVA代码开发的持续集成系统因为含有非常丰富的插件... 查看详情

接口自动化平台搭建,自动化项目jenkins持续集成

一、Jenkins的优点1、传统网站部署流程??一般网站部署的流程这边是完整流程而不是简化的流程 需求分析—原型设计—开发代码—内网部署-提交测试—确认上线—备份数据—外网更新-最终测试 ,如果发现外网部署的代码... 查看详情

jenkins与gitlib实现自动化部署与持续构建

...动部署实现haproxy动态添加删除后端服务器编写脚本实现自动化部署与回滚持续集成的分类:持续集成:持续集成是指程序 查看详情

gitlab+jenkins自动化部署持续集成(代码片段)

环境:1、centos7.62、jdk1.8.0_1413、4G30G4core4、关闭防火墙和selinux一、安装jenkins  1、下载jenkinshttps://pkg.jenkins.io/redhat/ jenkins-2.208-1.1.noarch.rpm  2、安装jdk和jenkinsrpm包  rpm-ivhjdk-8u141-linux-x64.rpm  rpm-ivhjenkins-2.208-1.1.noarch.rpm... 查看详情

devops持续集成-jenkins+gitlab|环境部署|性能优化|报错排查(代码片段)

DevOps持续集成-Jenkins+Gitlab一、DevOps概述1.1持续集成1.2持续交付1.3持续部署二、部署Jenkins2.1安装JDK2.2安装Jenkins2.3Jenkins配置优化①JVM内存优化②插件源优化2.4启动Jenkins①解锁Jenkins②选择插件安装2.5安装Git2.6配置Git2.7初始化Git三... 查看详情

自动化篇cicd的概念和搭建(代码片段)

文章目录前言一、CICD是什么?组件二部署jenkins和git组件安装GIT组件安装gitlab安装三预测试环境部署Jenkins补全gitlab组件Jenkins密钥认证Jenkins添加认证Jenkins和gitlab对接添加SSH服务器四开始构建配置wobook构建测试报错128代码gitlab... 查看详情

自动化篇cicd的概念和搭建(代码片段)

文章目录前言一、CICD是什么?组件二部署jenkins和git组件安装GIT组件安装gitlab安装三预测试环境部署Jenkins补全gitlab组件Jenkins密钥认证Jenkins添加认证Jenkins和gitlab对接添加SSH服务器四开始构建配置wobook构建测试报错128代码gitlab... 查看详情

gitlab+jenkins持续集成

构建:  需要将jenkins服务器上 jenkins用户的公钥发送给 目标服务器的gs用户,使得在jenkins上能用gs免密登录目标服务器自动化构建需要配置gitlab的钩子,并在jenkins上做配置 自动构建后,邮件通知 查看详情

jenkins——持续集成介绍及jenkins安装部署(插件+用户权限+凭据+maven打包)(代码片段)

...nkins介绍Jenkins安装和持续集成环境配置持续集成流程说明Gitlab代码托管服务器安装Gitlab添加组、创建用户、创建项目源代码上传至Gitlab服务器Jenkins服务器安装Jenkins服务器安装Jenkins插件管理Jenkins用户权 查看详情

持续集成之④:gitlab触发jenkins构建项目

持续集成之④:GitLab触发jenkins构建项目一:目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins进行构建项目、代码质量测试然后部署至测试环境,注意这只是测试环境,而生产环境依然需要手动部署... 查看详情

使用gitlab+droneci持续集成自动部署web项目,图文详细(代码片段)

扩展参考:Gitlab+Jenkins通过钩子实现自动部署web项目一:环境介绍1:gitlab服务器192.168.152.131搭建参考:Linux安装gitlab、docker安装gitlab2:Drone服务器192.168.152.132搭建参考:Linux基于gitlab搭建DroneCI3&# 查看详情