GitLab+Jenkins结合构建持续集成(CI)环境

git版本控制的使用

链接地址:https://www.cnblogs.com/Mercury-linux/p/12623343.html

Jenkins和GitLab概述

Jenkins概述:是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,是软件的持续集成变成可能。

Jenkins官方:https://jenkins.io/

GitLab概述:是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开或者私人项目。Ruby on Rails 是一个可以使开发、部署、维护 web应用程序变得简单的框架。

GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团体对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它提供一个代码收集功能可以轻松实现代码复用,便于日后需要的时候进行查找。

GitLab官网:https://docs.gitlab.com/

GitLab和GitHub的区别

  • 相同点:

二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,他们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。

  • 不同点:

GitHub 如果要使用私有仓库,是需要付费的。 GitLab 可以在上面创建私人的免费仓库。

GitLab 让开发团队对他们的代码拥有更多的控制,相比 GitHub,它有不少的特色:允许免费设置仓库权限;允许用户选择分享一个 project 的部分代码;允许用户设置 project 的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过 innersourceing 让不在范围内的人访问不到该资源。

总结:从代码私有性方面来看,有时公司并不希望员工获取到全部代码,这时候GitLab无疑是最好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。

git相关概念:

git 是一种版本控制系统,是一个命令,是一种工具

gitlib 是用于实现git功能的开发库

github 是一个基于git实现的在线代码托管仓库,包含一个网站页面,向互联网开放

gitlab 是一个基于git实现的在线代码仓库托管软件,一般用于在企业内部网络搭建git私服

注:gitlab-ce 社区版gitlab-ee 是企业版,收费

持续集成系统的工作流程大概分为以下几步:

  1. 开发者将新版本 push到 Gitlab

  2. Gitlab 随后触发 Jenkins master 节点进行一次 build。(通过 web hook 或者定时检测)

  3. Jenkins master 结点将这个 build 人为分配给若干注册的 slave结点中的一个,这个 slave结点根据一个事先设置号的脚本进行 build。这个脚本可以做的事情很多,比如编译,测试、生成测试报告等等。这些原本需要手动完成的任务都可以交给Jenkins 来做。

  4. 我们在 build 中要进行编译,这里使用了分布式编译器 distcc 来加快编译速度。

GitLab平台部署

架构图:

整体实验环境部署:

主机名 公网ip 内存 服务
lb01 10.0.0.5 2G 数据库、负载均衡、Jenkins上线
web01 10.0.0.7 1G tomcat
web02 10.0.0.8 1G tomcat
es01 10.0.0.240 3G gitlab仓库


GitLab搭建

注:实验环境内存建4G大小,否则服务起不来

我们的gitlab仓库rpm包去 清华源 下载

#配置扩展源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#安装gitlab和依赖包
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm
yum localinstall gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm -y
  • gitlab配置文件
vim  /etc/gitlab/gitlab.rb
#设置访问url和关闭prometheus
external_url 'http://gitlab.oldqiang.com'
#如果安装普罗米修斯全家桶需要4G内存
prometheus_monitoring['enable'] = false
#配置gitlab通过smtp发送邮件
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '1354586675@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'china'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "1354586675@qq.com"
gitlab_rails['smtp_password'] = "xxxxxx"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

#应用重新配好的配置并重启gitlab
gitlab-ctl  reconfigure

注:重新配置应用程序。修改gitlab服务配置文件后,都需要重启执行gitlab-ctl reconfigure命令。让各个服务的配置文件,重新加载一下配置文件

登录gitlab:http://gitlab.class.com/

GitLab汉化

注:因为下载官方汉化包我们需要去国外,所以直接在码云上下载    gitlab汉化版本目前最高是12.5版本

unzip AEIOUAEIOU-xhang_gitlab-v12.3.5-zh.zip 
#查看当前汉化版本,如果gitlab版本太新部分不能汉化
cat xhang_gitlab/VERSION 
12.3.5


gitlab-ctl stop
cp -a xhang_gitlab/*  /opt/gitlab/embedded/service/gitlab-rails/
#这里会有两个报错,因为这里两个软连接
gitlab-ctl start

netstat -lntup
tcp        0      0 127.0.0.1:9229          0.0.0.0:*               LISTEN      10859/gitlab-workho 
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      10916/unicorn maste 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10877/nginx: master 
tcp        0      0 127.0.0.1:8082          0.0.0.0:*               LISTEN      10895/sidekiq 5.2.7 
tcp        0      0 127.0.0.1:9236          0.0.0.0:*               LISTEN      10846/gitaly        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6693/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7128/master         
tcp        0      0 0.0.0.0:8060            0.0.0.0:*               LISTEN      10877/nginx: master

注:这里需要等待!8080端口起不来会出现 502 报错

主页面汉化完成:

彻底汉化:

gitlab-用户-用户组-项目之间的关系

关系图:

创建组

创建项目

根据配置推送代码项目,将项目推送到仓库

#进行解析
vim /etc/hosts
10.0.0.88 class.com

#准备目录和项目
mkdir /opt/shop
cd /opt/shop
2000.png  21.js  icon.png  img  index.html  sound1.mp3

#上传仓库
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"
git init
git add .
git commit -m "Initial commit"
git remote add origin http://class.com/shop/shop.git
git push -u origin master
#输入用户名和密码

推送结果:

  • ssh推送:
#主机创建密钥
ssh-keygen <--一路回车
cat /root/.ssh/id_rsa.pub
将内容添加到gitlab仓库的SSH密钥

#配置仓库
git init
git remote add origin git@class.com:root/bbs.git
git add .
git commit -m "Initial commit"
git push -u origin maste

创建用户

加入用户:

GitLab备份与恢复

#备份
gitlab-rake gitlab:backup:create
#这里有些敏感文件不会去备份,需要手动备份

#删一个库在恢复
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

#注:执行下面一条命令会删除库中的表和数据
#BACKUP内容:时间戳+时间+版本
gitlab-rake gitlab:backup:restore BACKUP=1585361881_2020_03_28_12.3.5
gitlab-ctl start unicorn
gitlab-ctl start sidekiq


vim /etc/gitlab/gitlab.rb
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_keep_time'] = 604800

gitlab-ctl reconfigure
netstat -lntup

#迁移云主机
先备份,云主机安装相同版本,恢复

GitLab版本升级

注:gitlab升级,10-->11-->12 gitlab升级不能跨大版本,如果之前已经汉化,请选择可以汉化的版本进行升级,因为最新的版本不支持汉化会出现服务起不来

#升级:
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.3.9-ce.0.el7.x86_64.rpm
yum localinstall gitlab-ce-12.9.1-ce.0.el7.x86_64.rpm -y

#gitlab会备份数据并重启
ll /var/opt/gitlab/backups/
-rw------- 1 git git 1781760 Mar 28 10:18 1585361881_2020_03_28_12.3.5_gitlab_backup.tar
-rw------- 1 git git  133120 Mar 28 10:56 1585364188_2020_03_28_12.3.5_gitlab_backup.tar
drwx------ 7 git git     131 Mar 28 10:30 tmp

#查看当前gitlab版本:
rpm -qa | grep gitlab
gitlab-ce-12.9.1-ce.0.el7.x86_64
#如果设置汉化不彻底可以在汉化一次

注:这里gitlab需要启动一会出现8080端口在查看网页

将svn中的数据迁移到git仓库

推荐参考地址:http://john.albin.net/git/convert-subversion-to-git

svn教程地址:https://www.runoob.com/svn/svn-intro.html

安装svn客户端

yum install subversion -y
svn --version

初始化仓库

#手动新建版本库目录
mkdir /svn/repo -p
#创建版本库
svnadmin create /svn/repo

svn服务配置文件svnserver.conf,该文件仅由一个[general]配置段组成。

cd /svn/repo/conf
vim  svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = /svn/repo
[sasl]
  • anon-access: “访客”,取值范围为:“write (可读可写)”、“read (只读)”和“none (无访问权限)”,默认指:read

  • auth-access: “用户”,取值范围为:“write (可读可写)”、“read (只读)”和“none (无访问权限)”,默认值:write

  • authz-db: 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。这里使用相对路径

  • realm: 指定版本库的认证域,即在等录时提示的认证域名称

用户名口令文件passwd

#用户名口令文件由svnserve.conf的配置项password-db指定,默认为conf目录中的passwd。由[users]配置段组成。
vim passwd
[users]
admin = 123456   <-- 授权用的
test = 123456    <-- 账户密码

权限配置文件authz

#由svnserve.conf的配置项authz-db指定,默认为conf目录中的authz。该配置文件由一个[groups]配置段和若干个版本库路径权限段组成。
vim authz
[/]
admin = rw
test = r

注:[/],则表示所有库的根目录

启动服务并进行转换

svnserve -d -r /svn/repo

#创建git仓库
mkdir  /opt/git
git svn clone svn://10.0.0.100 --username=admin --no-metadata --authors-file=/opt/git/password.txt /opt/git/


cat password.txt
admin=zhangsan<296917342@qq.com>
  • --no-metadata:默认情况下,git会在svn的提交信息里补充一些git的信息。这个标识是用来把这些信息去掉。

  • --authors-file:svn用户列表

  • /opt/class:新的git仓库。这个是拉取svn数据到本地的文件夹,它会在dest-dir上新建git仓库。

搭建Jenkins实现持续集成

代码上线流程:

官方网站:https://jenkins.io/zh/

安装jdk1.8

jdk下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

jdkrpm包网盘链接:https://pan.baidu.com/s/1zyFC-mTVqFPfFnTJQXaa4g 提取码:69eq

yum localinstall jdk-8u102-linux-x64.rpm -y
java -version

安装Jenkins

tomcat下载地址:https://tomcat.apache.org/download-80.cgi#8.5.53

#安装tomcat
mkdir /app
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz
tar xf apache-tomcat-8.5.53.tar.gz -C /app/
ln -s /app/apache-tomcat-8.5.53/ /app/tomcat
cd /app/tomcat/webapps/
rm -rf ROOT
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war
mv jenkins.war ROOT.war
/app/tomcat/bin/startup.sh
netstat -lntup | grep 8080

注:这里Jenkins的信息都放在了root目录下的.Jenkins下。

  • 访问加速设置,插件安装将指向清华源

  注:只有页面插件安装才会出现updates这个目录。

cd /root/.jenkins/updates/
sed -i 's/http://updates.jenkins-ci.org/download/https://mirrors.tuna.tsinghua.edu.cn/jenkins/g' default.json && sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json
#重启tomcat

这里需要等待很长时间,如果迟迟不出现界面建议将下面的包之间解压在/root下面

Jenkins目录地址:https://pan.baidu.com/s/1P5bfqOUx8ZDjjkLHsYpo3A 提取码:34xy

rm -rf /root/.jenkins
tar xf jenkins-data.tar.gz -C /root/

#登录:
admin
123456

创建一个job

概述:一个项目,创建一个job,一个job就是一个自动化上线的流程(拉取-html-打包-scp-tar)

构建job:

通用 源码管理 构建触发器 构建环境 构建 构建后操作
关闭job 对接代码仓库 gitlab代码仓库 构建前准备操作 shell脚本 构建后操作通知

构建任务:

Jenkins自动拉取gitlab代码

前提:gitlab仓库有代码可以拉取还有主机与域名解析在hosts文件做好

用户和密码添加:

密钥添加:

cat /root/.ssh/id_rsa
#内容添加到凭证

使用脚本实现html自动化上线

环境准备

#Jenkins主机创建并分发密钥实现免输入传输
ssh-keygen
ssh-copy-id root@10.0.0.7
ssh-copy-id root@10.0.0.8
#负载均衡主机配置文件
vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream java {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
    }
    server {
        listen       80;
        server_name  zrlog.oldedu.com;
        root   html;
        index  index.html index.htm;
        location / {
            proxy_pass http://java;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
  }
}

#网站主机07,08
yum install nginx -y
systemctl start nginx
systemctl enable nginx

#删除默认网页修改首页文件
rm -rf /usr/share/nginx/html/*
echo "web01" > index.html
echo "web02" > index.html
#刷新查看
  • 脚本思路
#Jenkins主机将源码压缩到
mkdir /data    <--压缩文件目录
cd /root/.jenkins/workspace/shop
tar zcf /opt/data/shop.tar.gz *
scp  -rp /opt/data/shop.tar.gz 10.0.0.8:/opt/data/

#网站主机
mkdir /jenkins_data      <--存放压缩包目录
mkdir /code/shop  -p     <--网站代码目录
chmod 755 -R /code/
/usr/share/nginx/html  <--nginx默认网站目录,code目录软链接地址
#解压
tar xf /opt/data/shop.tar.gz -C  /code/shop
rm -rf /usr/share/nginx/html
ln -s /code/shop /usr/share/nginx/html  <--代码更新方式目录直接软连接
ll /usr/share/nginx   <--查看软链接情况
  • 脚本

mkdir /server/scripts -p
vim auto_code_update_html.sh
#!/bin/bash
#执行脚本默在这个目录下
# cd  /root/.jenkins/workspace/shops/shop

project=$1
tag=$2
#mkdir /data
tar zcf /data/${project}-${tag}.tar.gz *
IP="10.0.0.7 10.0.0.8"
#web主机操作
for n in `echo $IP`
do
#mkdir /data
scp -rp /data/${project}-${tag}.tar.gz root@${n}:/data
ssh root@$n "  mkdir -p /code/${project}-${tag} && 
tar xf /data/${project}-${tag}.tar.gz -C /code/${project}-${tag} && 
rm -rf /usr/share/nginx/html && 
chmod 755 -R /code/ && 
ln -s /code/${project}-${tag} /usr/share/nginx/html"
done

#执行脚本测试
sh -x /server/scripts/auto_code_update_html.sh
  • Jenkins构建

版本回退操作

脚本

vim /server/scripts/auto_code_undo_html.sh
#!/bin/bash

# cd  /root/.jenkins/workspace/shops/shop
project=$1
tag=$2
IP="10.0.0.7 10.0.0.8"
for n in `echo $IP`
do
ssh root@$n "rm -rf /usr/share/nginx/html && 
ln -s /code/${project}-${tag} /usr/share/nginx/html"
done
  • 添加文本参数,选择版本号
  • 构建时执行的shell
  • 构建

注:这里如果项回退版本,之前的版本目录都必须要有

使用gitlab自动触发Jenkins构建

安装gitlab插件

  插件名称:gitlab

修改job的配置

修改gitlab配置

网络配置:

配置集成:

修改文件:

查看结果:

使用码云实现java代码上线

实验步骤:

  • 搭建java环境
rpm -ivh jdk-8u102-linux-x64.rpm
mkdir /app
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz
tar xf apache-tomcat-8.5.53.tar.gz -C /app/
ln -s /app/apache-tomcat-8.5.53/ /app/tomcat
/app/tomcat/bin/startup.sh 
  • maven环境

  maven下载地址:https://maven.apache.org/download.cgi

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local
ll /usr/local/apache-maven-3.6.3/
ln -s /usr/local/apache-maven-3.6.3/ /usr/local/maven
ll /usr/local/maven/
vim /etc/profile
#文件结尾添加两行
export M2_HOME=/usr/local/maven
export PATH=${M2_HOME}/bin:$PATH

source /etc/profile
mvn -v

#更新源为阿里源
vim  /usr/local/maven/conf/settings.xml
#将所有内容复制到<mirrors>之间
<mirror> 
    <id>nexus-aliyun</id>  
    <mirrorOf>central</mirrorOf>    
    <name>Nexus aliyun</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
</mirror>
  • 创建码云仓库并将java代码上传上去
mkdir /opt/java_git
tar xf SpringBootWeb.tar.gz -C /opt/java_git
cd /opt/java_git
<--将需要上传的源码放在这里-->

#创建码云仓库并将信息信息和地址写在目录
git config --global user.name "weijixiang"
git config --global user.email "1354586675@qq.com"
git init
git add .
git commit -m "first commit"
git remote add origin git@gitee.com:weijixiang_god/java.git
git push -u origin master

注:这里主机的ssh要在码云上的ssh公钥配置好,后去拉取不用输入密码,码云打上标签

  • jenkins安装maven插件

Jenkins创建一个java业务的job

配置maven

构建过程

正在构建

使用脚本实现部署

  • 准备
#编译文件地址
/root/.jenkins/workspace/springBoot/target/SpringBootWeb.war

#tomcat配置文件允许使用软连接
vim /app/tomcat/conf/context.xml
<Context>
    <Resources allowLinking="true" />
</Context>
#重启
  • 测试脚本

注:此脚本为了验证是否可行,结合Jenkins需要修改参数

vim  auto_code_update_java.sh
#!/bin/bash

#project=$1
tag=v1.0
packname="SpringBootWeb"
dir="/root/.jenkins/workspace/springBoot/target/SpringBootWeb.war"
IP="10.0.0.7 10.0.0.8"
for n in `echo $IP`
do
scp -rp $dir root@${n}:/data
ssh root@$n "mkdir -p /code/$packname-$tag && 
unzip -d /code/$packname-$tag /data/${packname}.war && 
rm -rf /app/tomcat/webapps/class && 
ln -s /code/$packname-$tag /app/tomcat/webapps/class && 
/app/tomcat/bin/shutdown.sh && 
/app/tomcat/bin/startup.sh"
done

Jenkins完成Java项目代码上线

  • 脚本
vim /server/scripts/auto_code_update_java.sh 
#!/bin/bash

project=$1
tag=$2
dir=$(find `pwd` -name "*.war")
IP="10.0.0.7 10.0.0.8"
for n in `echo $IP`
do
scp -rp $dir root@${n}:/data/${project}.war-$tag
ssh root@$n "mkdir -p /code/$project-$tag && 
unzip -d /code/$project-$tag /data/${project}.war-$tag && 
rm -rf /app/tomcat/webapps/${project} && 
ln -s /code/$project-$tag /app/tomcat/webapps/${project} && 
/app/tomcat/bin/shutdown.sh && 
/app/tomcat/bin/startup.sh"
done

项目构建

  1. 码云上更新源码,添加版本标签

  2. Jenkins的job添加执行shell

3. 立即构建

4. 查看效果

使用Jenkins完成Java项目的回滚

  • 回滚脚本
vim /server/scripts/auto_code_undo_java.sh 
#!/bin/bash

project=$1
tag=$2
IP="10.0.0.7 10.0.0.8"
for n in `echo $IP`
do
ssh root@$n "rm -rf /app/tomcat/webapps/${project} && 
ln -s /code/$project-$tag /app/tomcat/webapps/${project} && 
/app/tomcat/bin/shutdown.sh && 
/app/tomcat/bin/startup.sh"
done
  • 创建一个回滚job

添加文本参数:

选择版本进行构建:

构建结果:

使用Jenkins完成jeesns项目代码上线

软件包地址:https://pan.baidu.com/s/1294itvj22Vb0044oIjZH1Q 提取码:19nn

项目思路:

  1. 创建项目仓库

  2. 解压文件并将源码推到码云指定仓库

  3. 编写自动部署脚本,并进行验证

  4. Jenkins创建job添加git仓库地址,shell执行脚本

  5. 验证

项目配置数据库

#创建数据库,创建用户和权限
create database jeesns;
grant all on jeesns.* to 'jeesns'@'10.0.0.%' identified by '123456';

#导入项目sql文件
cd /opt/jeesns/jeesns-web/database
mysql -ujeesns -p123456 -h 10.0.0.5 jeesns <jeesns.sql 

#修改数据库连接地址
vim /opt/jeesns/jeesns-web/src/main/resources/jeesns.properties
地址:10.0.0.5
jdbc.user=jeesns
jdbc.password=123456
#这里修改完了文件需要重新git仓库一下在上传到码云

#编译测试
mvn clean package

创建项目仓库

创建git仓库push代码

unzip -d /opt/jeesns.zip
cd /opt/jeesns
<--将需要上传的源码放在这里-->

#创建码云仓库并将信息信息和地址写在目录
git config --global user.name "weijixiang"
git config --global user.email "1354586675@qq.com"
git init
git add .
git commit -m "first commit"
git remote add origin git@gitee.com:weijixiang_god/jeesns.git
git push -u origin master

Jenkins创建job

添加一个项目

添加git仓库地址:

编译项目时清空缓存编译:

执行脚本:

构建项目

注:这里访问的是ip地址:8080/项目地址,如果想直接访问就把链接到的地址改为tomcat下的ROOT

原文地址:https://www.cnblogs.com/Mercury-linux/p/12623779.html