CI/CD之Jenkins+Gitlab
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CI/CD之Jenkins+Gitlab相关的知识,希望对你有一定的参考价值。
文章目录
本文章达到了一万六千字,有点多,但是比较全
一、Jenkinx+Gitlab持续集成环境概述
(1)什么是CI/CD
-
CI为持续集成,CD为持续交付和持续部署,一般CD就是持续交付
-
CI/CD概述:
持续集成(CI): 持续集成(Continuous integration)是指开发者在代码的开发过程中,可以频繁的将代码部署到master主干上,并且进行自动化测试
持续交付(CD): 持续交付(Continuous Delivery)是指在持续集成的基础上,将代码部署到预生产环境,即测试环境
持续部署(CD): 在持续交付的基础上,把代码部署到生产环境的过程自动化
- 一层套一层,使用CI/CD的目的就是使整个开发、运维的环境变成一个闭环,提高效率
(2)Jenkins概述
-
Jenkins是一个开源软件项目,是基于JAVA开发的一款持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变为可能
-
官方网站: https://jenkins.io/
(3)Gitlab概述
-
Gitlab是一个利用Ruby on Redis开发的开源应用程序,实现了一个自托管的Git项目仓库,用户可以通过web界面进行访问公开或者私人项目
-
Gitlab拥有和Github类似的功能,都能浏览源代码、管理缺陷和注释,可以管理团队对仓库的访问,Gitlab会提供一个文件历史库去存放提交过的项目版本,并且还提供一个代码片段收集功能,可以轻松实现代码复用,方便以后有需要的时候进行查找
-
Ruby on Redis: 是一个可以使开发、部署、维护web应用程序变得简单的框架
-
官方网站: https://about.gitlab.com/
(4)Gitlab和Github的区别
- 相同点
二者都是基于web的Git仓库,很大程度上Gitlab是仿照Github做出来的,并且二者都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化的、云存储的场所
- 不同点
- GitHub如果要使用私有仓库,超过四个是需要付费的,而Gitlab可以在上面创建私人的免费仓库,因为公司可以自己部署Gitlab
- Gitlab让开发团队对他们的代码仓库拥有更多的控制,相对于Github,有着不少特色,例如:可以免费设置仓库权限、运行用户选择分享一个项目的源代码、运行用户设置项目的获取权限,进一步的提升了安全性,还可以设置获取到团队整体的改进进度,通过innersourcing让不在权限范围内的人访问不到该资源。开发者还可以把某个代码打上”仍在进行中“的标签来提醒其他成员这个代码没有完成,从而阻止未完成的代码合并到其他的代码中
总的来说,从代码的私有性来看,有时候公司并不希望员工获取到全部的代码,而Gitlab无疑是更好的选择,但是对于开源代码来说,GIthub依然是代码托管的首选
******注释******
git是一个分布式的版本控制器,是一种命令、一种工具,Gitlab和Github都是基于git实现的在线代码托管仓库,不同的是Github是面向互联网开放的,而Gitlab通常都是公司内部网络使用,两者都有网站页面
gitlab-ce是社区服,是免费的,gitlab-ee是企业版,是收费的
(5)Jenkins配合Gitlab持续集成系统的工作流程
-
开发者将新版本推送到Gitlab中
-
Gitlab会触发Jenkins的master主节点(Jenkinx是可以分主从节点的)进行一次建造
-
Jenkins主节点将这个建造任务分配给若干个注册的从节点中的一个,这个从节点会根据事先设置好的脚本进行建造,这个脚本可以做的事情有很多,例如编译、测试、生产测试报告等功能,这些原本需要手动完成的任务都可以交给Jenkins来完成
如果在建造过程中需要编译,一般会使用分布式编译器distcc来加快编译速度
二、部署持续集成环境
(1)实验环境
系统 | 主机名 | ip | 扮演角色 | 安装软件 |
---|---|---|---|---|
Centos7.4 | gitlab | 192.168.100.202 | Gtilab | gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm |
Centos7.4 | jenkins | 192.168.100.203 | Jenkins | jenkins-2.222.4-1.1.noarch.rpm |
Centos7.4 | apache | 192.168.100.204 | web | apache |
注意:Gitlab的内存给大一点,最好是4G,Jenkins给2G,不然后面会报错
(2)实验步骤
-搭建Gitlab(100.202)
******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname gitlab
[root@Centos7 ~]# su
[root@gitlab ~]# systemctl stop firewalld
[root@gitlab ~]# setenforce 0
setenforce: SELinux is disabled
[root@gitlab ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
******(2)安装gitlab依赖包
[root@gitlab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix policycoreutils-python
。。。。。。
完毕!
******(3)开启邮件服务,默认使用postfix发送邮件
[root@gitlab ~]# systemctl enable postfix
[root@gitlab ~]# systemctl start postfix
******(4)关闭防火墙,或者允许http通过,做基础配置的时候已经关了
[root@gitlab ~]# firewall-cmd --permanent --add-service=http #允许http通过
[root@gitlab ~]# systemctl reload firewalld #重载
******(5)安装gitlab
#安装gitlab需要rpm包,有两种方法下载rpm包
使用迅雷下载:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
使用YUM源下载:(YUM下载非常慢)
[root@gitlab ~]# vim /etc/yum.repos.d/gitlab.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key
[root@gitlab ~]# yum install -y gitlab-ce #安装社区版的gitlab
。。。。。。
完毕!
#这里直接上传软件包进行安装gitlab
[root@gitlab ~]# ll
总用量 625204
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 640204790 6月 30 17:16 gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
[root@gitlab ~]# yum -y install gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
。。。。。。
完毕!
*. *.
*** ***
***** *****
.****** *******
******** ********
,,,,,,,,,***********,,,,,,,,,
,,,,,,,,,,,*********,,,,,,,,,,,
.,,,,,,,,,,,*******,,,,,,,,,,,,
,,,,,,,,,*****,,,,,,,,,.
,,,,,,,****,,,,,,
.,,,***,,,,
,*,.
_______ __ __ __
/ ____(_) /_/ / ____ _/ /_
/ / __/ / __/ / / __ `/ __ \\
/ /_/ / / /_/ /___/ /_/ / /_/ /
\\____/_/\\__/_____/\\__,_/_.___/
******(6)配置gitlab访问地址
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
。。。。。。
13 external_url 'http://192.168.100.202' #修改url为自己的ip地址
。。。。。。
#保存退出
******(7)重置gitlab,每次修改完配置文件都需要重置,重置大约需要三分钟左右
[root@gitlab ~]# gitlab-ctl reconfigure
。。。。。。
Running handlers:
Running handlers complete
Chef Client finished, 509/1343 resources updated in 02 minutes 27 seconds
gitlab Reconfigured! #出现这个表示重置成功
******(8)查看端口,gitlab默认使用nginx作为web界面,要注意的是,如果在访问web界面时总是报502的话,需要清空防火墙规则或者关闭防火墙,并且内存要大于4G不然有时也会报502,每次重置完之后不要马上进行访问,稍微等一两分钟再访问
[root@gitlab ~]# netstat -anpt | grep 80
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 2038/unicorn master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2103/nginx: master
tcp 0 0 127.0.0.1:8082 0.0.0.0:* LISTEN 2056/sidekiq 5.2.7
tcp 0 0 0.0.0.0:8060 0.0.0.0:* LISTEN 2103/nginx: master
tcp 0 0 127.0.0.1:8080 127.0.0.1:47272 TIME_WAIT -
tcp 0 0 127.0.0.1:8080 127.0.0.1:47264 TIME_WAIT -
tcp 0 0 127.0.0.1:8080 127.0.0.1:47274 TIME_WAIT -
tcp 0 0 127.0.0.1:44214 127.0.0.1:8060 ESTABLISHED 2526/prometheus
tcp 0 0 127.0.0.1:8060 127.0.0.1:44214 ESTABLISHED 2104/nginx: worker
tcp 0 0 127.0.0.1:52642 127.0.0.1:8082 ESTABLISHED 2526/prometheus
tcp 0 0 127.0.0.1:8080 127.0.0.1:47266 TIME_WAIT -
tcp 0 0 127.0.0.1:8082 127.0.0.1:52642 ESTABLISHED 2056/sidekiq 5.2.7
(9)登录gitlab
第一次登录gitlab需要为root用户修改密码,root用户是gitlab的超级管理员,这里输入新的密码:nihao123!
成功登录gitlab
******(10)汉化gitlab
# gitlab中文社区版的项目,v7-v8.8 是由 Larry Li发起的“GitLab 中文社区版项目”(https://gitlab.com/larryli/gitlab),从 v8.9之后,@xhang 开始继续该汉化项目(https://gitlab.com/xhang/gitlab)。
# 软件下载地址,这里使用是V12版本的gitlab所以需要下载v12的汉化包
# 下载地址:https://gitlab.com/xhang/gitlab/-/archive/12-0-stable/gitlab-12-0-stable-zh.tar.gz
[root@gitlab ~]# ll #上传软件包
总用量 699968
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 76557595 6月 30 17:35 gitlab-12-0-stable-zh.tar.gz
-rw-r--r-- 1 root root 640204790 6月 30 17:16 gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
[root@gitlab ~]# tar xf gitlab-12-0-stable-zh.tar.gz
[root@gitlab ~]# cat gitlab-12-0-stable-zh/VERSION #确认版本
12.0.3
******(11)开始汉化
[root@gitlab ~]# gitlab-ctl stop #先停止gitlab
ok: down: alertmanager: 0s, normally up
ok: down: gitaly: 1s, normally up
ok: down: gitlab-monitor: 0s, normally up
ok: down: gitlab-workhorse: 0s, normally up
ok: down: grafana: 0s, normally up
ok: down: logrotate: 0s, normally up
ok: down: nginx: 1s, normally up
ok: down: node-exporter: 0s, normally up
ok: down: postgres-exporter: 1s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis: 1s, normally up
ok: down: redis-exporter: 0s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 0s, normally up
[root@gitlab ~]# unalias cp #删除cp的别名
[root@gitlab ~]# cp -rf gitlab-12-0-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/ #后面的报错不用管
cp: 无法以目录"gitlab-12-0-stable-zh/log" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/log"
cp: 无法以目录"gitlab-12-0-stable-zh/tmp" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/tmp"
[root@gitlab ~]# gitlab-ctl start #开启gitlab,在开启后等一两分钟再访问gitlab否则会报错
ok: run: alertmanager: (pid 4094) 0s
ok: run: gitaly: (pid 4102) 1s
ok: run: gitlab-monitor: (pid 4123) 0s
ok: run: gitlab-workhorse: (pid 4127) 0s
ok: run: grafana: (pid 4134) 1s
ok: run: logrotate: (pid 4147) 0s
ok: run: nginx: (pid 4153) 1s
ok: run: node-exporter: (pid 4158) 0s
ok: run: postgres-exporter: (pid 4162) 1s
ok: run: postgresql: (pid 4243) 0s
ok: run: prometheus: (pid 4252) 0s
ok: run: redis: (pid 4261) 1s
ok: run: redis-exporter: (pid 4265) 0s
ok: run: sidekiq: (pid 4270) 1s
ok: run: unicorn: (pid 4276) 0s
访问web界面,成功汉化
-Gitlab的使用
- 基本命令
名称 | 作用 |
---|---|
gitlab-ctl stop | 关闭gitlab |
gitlab-ctl start | 开启gitlab |
gitlab-ctl restart | 重启gitlab |
gitlab-ctl reconfigure | 重置gitlab,在修改完配置文件后需要执行,不能乱用 |
- gitlab相关配置文件和目录
名称 | 作用 |
---|---|
/etc/gitlab/gitlab.rb | gitlab主配置文件,可以自定义一些邮件服务等 |
/var/log/gitlab/ | 日志目录,对应各服务的日志的目录 |
/var/opt/gitlab/ | 服务目录,对应各个服务的目录 |
/var/opt/gitlab/git-data | 仓库目录,记录项目仓库等提交信息 |
-关闭gitlab注册功能
默认情况下,用户可以自己去注册账号,这样显然是不安全的,所以可以关闭gitlab的账户注册功能
-配置gitlab邮件报警
运维人员最注重的一点就是告警邮件,所以gitlab也配备了邮件发送的功能,但是使用gitlab的默认设置可能收不到邮件,所以需要我们手动修改,在做邮件报警时需要加一块桥接网卡
官网各种邮箱配置实例:https://docs.gitlab.com/omnibus/settings/smtp.html
******(1)修改配置文件,这里配置的是qq的smtp
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
。。。。。。 #在58行添加,都是注释直接空一行写就行
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com" #指定smtp服务器
gitlab_rails['smtp_port'] = 465 #每个服务器都有对应的端口,qq的是465
gitlab_rails['smtp_user_name'] = "1248873545@qq.com" #邮箱
gitlab_rails['smtp_password'] = "tlefpqamwrhkhage" #smtp号
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '1248873545@qq.com' #发送邮件的邮箱
#保存退出
******(2)重置gitlab
[root@gitlab ~]# gitlab-ctl reconfigure
。。。。。。
Running handlers:
Running handlers complete
Chef Client finished, 16/669 resources updated in 01 minutes 07 seconds
gitlab Reconfigured!
******(3)登录控制台发送邮件
[root@gitlab ~]# gitlab-rails console
。。。。。。
irb(main):002:0> Notify.test_email('1248873545@qq.com', 'test', 'test').deliver_now #发送邮箱到1248873545@qq.com,标题为test,内容为test
Notify#test_email: processed outbound mail in 123.1ms
Sent mail to 1248873545@qq.com (2811.6ms)
Date: Wed, 30 Jun 2021 10:07:59 +0800
From: GitLab <1248873545@qq.com>
Reply-To: GitLab <noreply@192.168.100.202>
To: 1248873545@qq.com
Message-ID: <60dbd1ff541c0_1ff33fc03fccf97c28335@gitlab.mail>
Subject: test
Mime-Version: 1.0
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>test</p></body></html>
=> #<Mail::Message:70094578102080, Multipart: false, Headers: <Date: Wed, 30 Jun 2021 10:07:59 +0800>, <From: GitLab <1248873545@qq.com>>, <Reply-To: GitLab <noreply@192.168.100.202>>, <To: 1248873545@qq.com>, <Message-ID: <60dbd1ff541c0_1ff33fc03fccf97c28335@gitlab.mail>>, <Subject: test>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
邮件可以成功发送后,开始修改root用户的邮箱,因为root用户的默认邮箱为admin@example.com,修改邮箱后创建组会发送邮件警告
-创建一个新群组
- Private: 只有组成员才能看到
- Internal: 只要登录的用户就能看到
- Public: 所有人都能看到
-创建一个新账户
使用新账户登录gitlab
可以很明显看到,普通用户的权限是没有root多的
-把新创建的用户加入组
#Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
Guest(访客):可以创建issue、发表评论,不能读写版本库
Reporter(报告者):可以克隆代码,不能提交,QA(测试人员)、PM(主管或者产品经理)可以赋予这个权限
Developer(开发人员):可以克隆代码、开发、提交、push,RD(研发人员)可以赋予这个权限
Master(主程序员):可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner(所有者):可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限
-创建一个新项目
可以在群组中创建项目,也可以创建私有的项目,创建完后的使用方法和github相同
这里之后都汉化了,下面生成ssh密钥
#因为是要配合jenkins,所有这里使用的密钥直接在jenkins主机上操作即可
[root@Centos7 ~]# hostnamectl set-hostname jenkins
[root@Centos7 ~]# su
[root@jenkins ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gh6chv+S4eK5Tnd8mWzbQNTmWdi4BLK9/H/VrA1Qenk root@Centos7.4-1
The key's randomart image is:
+---[RSA 2048]----+
| . . |
| + o + . |
| . o * oo . |
| o o o = +o o E|
| . * . S + o o.|
| +.o + + . +|
| ..+oo B . = |
| ..o+o o + . o .|
| o=o .. . . .. |
+----[SHA256]-----+
[root@jenkins ~]# cat .ssh/id_rsa.pub #查看公钥并且复制到gitlab的web界面中
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcUghkjbif7vFFzmUfeWaon08+VDF314si8Fa0xonE3dFbpfr1tzSLmldaulj8yBwXvvtS7XKJUuh54gqgQycor/T1apfyfPSLHtCoeZWYzbACufm9penKCA0USkYwTkOQU9HpOx17p85nBO6ydo6Xz0l8UBNqvoy7/tO7mIslcignj+r6mgskTxCoOk9ujwDSQ3QmfhLmc/7B4wGSWclvETZyRGyb8g3rye7+16fpPENpq1YaweoiNAytdb+IZBVjgdIT0k2PVggVdYxntoA0IulCYwolT1KcjJllcSm47IHtDL4J8AgPGO8ZXf7oJM+vMtZRiHlURjLlQzbcAnOh root@Centos7.4-1
使用jenkins主机复制一下仓库
[root@jenkins ~]# git clone git@192.168.100.202:root/test.git #克隆,后面的URL直接在web界面复制就行
正克隆到 'test'...
The authenticity of host '192.168.100.202 (192.168.100.202)' can't be established.
ECDSA key fingerprint is SHA256:VhTZ5YxS5af2rHtfCvyc6ehXh3PD2A8KY2MyE6rHjiU.
ECDSA key fingerprint is MD5:e8:41:d2:8a:7e:e9:a9:47:a3:f0:29:be:e9:6d:df:51.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.202' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.
[root@jenkins ~]# ll
总用量 4
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
drwxr-xr-x 3 root root 32 6月 30 18:57 test
[root@jenkins ~]# cd test/
[root@jenkins test]# ll #成功克隆仓库
总用量 4
-rw-r--r-- 1 root root 16 6月 30 18:57 1.html
-搭建Jenkins(100.203)
- Jenkins下载地址
https://pkg.jenkins.io/redhat-stable/jenkins-2.176.2-1.1.noarch.rpm
- linux的wget下载地址:
wget https://pkg.jenkins.io/redhat-stable/jenkins-2.176.2-1.1.noarch.rpm
******(1)先做基础配置
[root@jenkins ~]# systemctl stop firewalld
[root@jenkins ~]# setenforce 0
setenforce: SELinux is disabled
[root@jenkins ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
/dev/sr0 已经挂载到 /mnt 上
******(2)因为Jenkins是使用JAVA开发,所以需要安装JDK
[root@jenkins ~]# ls #上传jdk包
anaconda-ks.cfg jdk-8u91-linux-x64.tar.gz test
[root@jenkins ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@jenkins ~]# mv /usr/local/jdk1.8.0_91 /usr/local/java
[root@jenkins ~]# ls /usr/local/
bin etc games include java lib lib64 libexec sbin share src
[root@jenkins ~]# vim /etc/profile
。。。。。。 #在最后一行添加,优化环境变量
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
#保存退出
[root@jenkins ~]# source /etc/profile #执行脚本,使刚刚的配置生效
[root@jenkins ~]# java -version #查看java版本,确认成功安装
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
******(3)上传Jenkins软件包,安装、配置
[root@jenkins ~]# ll
总用量 241624
-rw-------. 1 root root 1264 1月 12 18:27 anaconda-ks.cfg
-rw-r--r-- 1 root root 181367942 6月 30 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r-- 1 root root 66044542 6月 30 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x 3 root root 32 6月 30 18:57 test
[root@jenkins ~]# yum -y install jenkins-2.222.4-1.1.noarch.rpm #以上是关于CI/CD之Jenkins+Gitlab的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins vs GitLab CI:CI/CD工具之战
Jenkins + Gitlab + harbor + Kubernetes实现CI/CD