一.概述
GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运行各种自动化构建、测试或部署任务。所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率自动运行测试、构建和部署的任务,帮组开发团队更高效的集成和发布代码。
下面是我最近安装GitLab+Jenkins环境的一个过程,记录下来,以备日后参考。
另外,这篇文章虽然很长,讲得很琐碎,但是仍有未能描述清楚的地方,如果按照这篇文章未能搭建成功,请耐心分析,也可从官方文档找找灵感,继续下去总会成功的。
环境
操作系统 | ip地址 | 角色 | 访问地址 |
---|---|---|---|
centos 7.6 | 192.168.1.240 | Jenkins | http://192.168.1.240:9000 |
centos 7.6 | 192.168.1.251 | GitIab | http://192.168.1.240:9000 |
Jenkins 安装教程,请参考链接
https://blog.youkuaiyun.com/m0_46168595/article/details/108335403
二.部署GitLab
1.为什么搭建nfs服务器?
因为我们要使用nfs作为持久化存储,创建的pv后端存储时需要nfs,所以需要搭建nfs服务。
2.安装nfs服务
选择自己的任意一台机器,我选择k8s的master1节点,对应的机器ip是192.168.0.6,在192.168.0.6上执行如下步骤,大家在自己环境找一台k8s节点的机器安装就可以了~
(1) 安装nfs
yum install nfs-utils -y
systemctl start nfs
chkconfig nfs on
(2)在master1上创建一个nfs共享目录
mkdir /data/v3 -p
mkdir /data/v4
mkdir /data/v5
vim /etc/exports
/data/v3 192.168.1.0/24(rw,no_root_squash)
/data/v4 192.168.1.0/24(rw,no_root_squash)
/data/v5 192.168.1.0/24(rw,no_root_squash)
exportfs -arv #使配置文件生效
systemctl restart nfs
(3)k8s的各个node节点也需要安装nfs
yum install nfs-utils -y
systemctl start nfs
chkconfig nfs on
创建安装gitlab需要的pv和pvc
1.创建一个名称空间
kubectl create ns kube-ops
2.创建gitlab需要的pv和pvc
vim pv_pvc_gitlab.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: gitlabt
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
nfs:
server: 192.168.1.251 #这个就是nfs服务端的机器ip,也就是k8s的master1节点ip
path: /data/v5
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: gitlabt
namespace: kube-ops
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
通过kubectl apply更新yaml文件
kubectl apply -f pv_pvc_gitlab.yaml
查看pv和pvc是否绑定
kubectl get pvc -n kube-ops
显示如下,说明绑定成功了
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data Bound data 20Gi RWX 4h14m
3.创建postsql的pv和pvc
vim pv_pvc_postsql.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: postsql
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
nfs:
server: 192.168.1.251
path: /data/v4
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postsql
namespace: kube-ops
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
通过kubectl apply更新yaml文件
kubectl apply -f pv_pvc_postsql.yaml
查看pv和pvc是否绑定
kubectl get pvc -n kube-ops
显示如下,说明postsql的pvc和pv绑定成功了
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
gitlabt Bound gitlabt 10Gi RWX 4h17m
postsql Bound postsql 10Gi RWX 4h15m
4.创建redis的pv和pvc
vim pv_pvc_redis.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: data
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
nfs:
server: 192.168.1.251
path: /data/v3
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: data
namespace: kube-ops
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
通过kubectl apply更新yaml文件
kubectl apply -f pv_pvc_redis.yaml
查看pv和pvc是否绑定
kubectl get pvc -n kube-ops
显示如下,说明gitlab的pvc和pv绑定成功了
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data Bound data 20Gi RWX 4h14m
gitlabt Bound gitlabt 10Gi RWX 4h17m
postsql Bound postsql 10Gi RWX 4h15m
安装postgresql服务
vim gitlab-postgresql.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgresql
namespace: kube-ops
labels:
name: postgresql
spec:
selector:
matchLabels:
name: postgresql
template:
metadata:
name: postgresql
labels:
name: postgresql
spec:
containers:
- name: postgresql
image: sameersbn/postgresql:10
imagePullPolicy: IfNotPresent
env:
- name: DB_USER
value: gitlab
- name: DB_PASS
value: passw0rd
- name: DB_NAME
value: gitlab_production
- name: DB_EXTENSION
value: pg_trgm
ports:
- name: postgres
containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql
name: data
livenessProbe:
exec:
command:
- pg_isready
- -h
- localhost
- -U
- postgres
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
- pg_isready
- -h
- localhost
- -U
- postgres
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
persistentVolumeClaim:
claimName: postsql
---
apiVersion: v1
kind: Service
metadata:
name: postgresql
namespace: kube-ops
labels:
name: postgresql
spec:
ports:
- name: postgres
port: 5432
targetPort: postgres
selector:
name: postgresql
通过kubectl apply更新yaml文件
kubectl apply -f gitlab-postgresql.yaml
查看postgresql是否部署成功
kubectl get pods -n kube-ops
显示如下,说明postgresql部署成功
NAME READY STATUS RESTARTS AGE
postgresql-79f85cdfb4-klfb7 1/1 Running 0 4h20m
安装gitlab需要的redis服务
vim gitlab-redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: kube-ops
labels:
name: redis
spec:
selector:
matchLabels:
name: redis
template:
metadata:
name: redis
labels:
name: redis
spec:
containers:
- name: redis
image: sameersbn/redis
imagePullPolicy: IfNotPresent
ports:
- name: redis
containerPort: 6379
volumeMounts:
- mountPath: /var/lib/redis
name: data
livenessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
persistentVolumeClaim:
claimName: data
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: kube-ops
labels:
name: redis
spec:
ports:
- name: redis
port: 6379
targetPort: redis
selector:
name: redis
通过kubectl apply更新yaml文件
kubectl apply -f gitlab-redis.yaml
查看postgresql是否部署成功
kubectl get pods -n kube-ops
显示如下,说明redis部署成功
NAME READY STATUS RESTARTS AGE
postgresql-79f85cdfb4-klfb7 1/1 Running 0 4h20m
redis-56c8dc76cd-pr22g 1/1 Running 0 4h17m
安装gitlab服务
vim gitlab.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab
namespace: kube-ops
labels:
name: gitlab
spec:
selector:
matchLabels:
name: gitlab
template:
metadata:
name: gitlab
labels:
name: gitlab
spec:
containers:
- name: gitlab
image: sameersbn/gitlab:11.8.1
imagePullPolicy: IfNotPresent
env:
- name: TZ
value: Asia/Shanghai
- name: GITLAB_TIMEZONE
value: Beijing
- name: GITLAB_SECRETS_DB_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_SECRETS_SECRET_KEY_BASE
value: long-and-RANDOM-ALPHA-NUMERIc-string
- name: GITLAB_SECRETS_OTP_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_ROOT_PASSWORD
value: admin321
- name: GITLAB_ROOT_EMAIL
value: 19xxxxxxxx@qq.com
- name: GITLAB_HOST
value: 192.168.0.6
- name: GITLAB_PORT
value: "30852"
- name: GITLAB_SSH_PORT
value: "32353"
- name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
value: "true"
- name: GITLAB_NOTIFY_PUSHER
value: "false"
- name: GITLAB_BACKUP_SCHEDULE
value: daily
- name: GITLAB_BACKUP_TIME
value: 01:00
- name: DB_TYPE
value: postgres
- name: DB_HOST
value: postgresql
- name: DB_PORT
value: "5432"
- name: DB_USER
value: gitlab
- name: DB_PASS
value: passw0rd
- name: DB_NAME
value: gitlab_production
- name: REDIS_HOST
value: redis
- name: REDIS_PORT
value: "6379"
ports:
- name: http
containerPort: 80
- name: ssh
containerPort: 22
volumeMounts:
- mountPath: /home/git/data
name: data
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 180
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
persistentVolumeClaim:
claimName: gitlabt
---
apiVersion: v1
kind: Service
metadata:
name: gitlab
namespace: kube-ops
labels:
name: gitlab
spec:
ports:
- name: http
port: 80
targetPort: http
nodePort: 30852
- name: ssh
port: 22
nodePort: 32353
targetPort: ssh
selector:
name: gitlab
type: NodePort
通过kubectl apply更新yaml文件
kubectl apply -f gitlab.yaml
查看postgresql是否部署成功
NAME READY STATUS RESTARTS AGE
gitlab-7d5f6bb557-bdkf9 1/1 Running 0 37m
postgresql-79f85cdfb4-klfb7 1/1 Running 0 4h20m
redis-56c8dc76cd-pr22g 1/1 Running 0 4h17m
查看gitlab在宿主机暴露的端口
kubectl get svc -n kube-ops
显示如下:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gitlab NodePort 10.0.0.130 <none> 80:30852/TCP,22:32353/TCP 4h3m
postgresql ClusterIP 10.0.0.119 <none> 5432/TCP 4h24m
redis ClusterIP 10.0.0.20 <none> 6379/TCP 4h21m
我们在浏览器访问k8s的master1节点的IP:30852即可访问到gitlab web界面
第一次登陆,我们需要点击注册Registry
完成注册并登陆显示如下:
3.安装Git
1.移除旧版本git centos自带Git,7.x版本自带git 1.8.3.1(应该是,也可能不是),
安装新版本之前需要使用yum remove git卸载(安装后卸载也可以)。
git --version ## 查看自带的版本git version 1.8.3.1
yum remove git ## 移除原来的版本
2.安装所需软件包
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
gcc-c++ perl-ExtUtils-MakeMaker
3.下载git的压缩包并进行解压
git安装包下载地址
https://mirrors.edge.kernel.org/pub/software/scm/git/
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.5.tar.gz
tar xf git-2.7.3.tar.gz
4.配置编译安装
cd git-2.19.5
make configure
./configure --prefix=/usr/git ##配置目录
make profix=/usr/git
make install
5.加入环境变量
echo "export PATH=$PATH:/usr/git/bin" >> /etc/profile
source /etc/profile
6.检查版本
git --version
三.GitLab+Jenkins持续集成
1.使用GitLab创建一个项目
点击 Create a project
创建 test 项目
添加 README 文件
输入内容,点击确定
效果如下:
2.创建jenkins用户
点击扳手按钮
点击 User
添加 jenkins 用户,点击最下面的Create user按钮。
点击编辑
修改密码,这里我定义的是 admin321
3.设置jenkins 用户ssh秘钥
点击 Impersonate ,表示冒充jenkins 用户
点击设置
左侧点击 ssh keys
登录到jenkins服务器,生成秘钥
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
查看公钥
cat /root/.ssh/id_rsa.pub
将公钥内容复制到网页,点击添加秘钥
4.创建Access Tokens
点击左侧的Access Tokens,输入用户 jenkins,勾选权限,点击创建
复制token,待会 jenkins 设置时,会用到。Zzis8ALsiYuytsg2GH-5
点击退出
重新登录root用户,点击test
点击设置-成员
添加jenkins 用户,这样就可以访问项目了
5.jenkins 安装Git,GitLab插件
由于 jenkins安装时,勾选了推荐安装的插件,因此包含了git插件。
现在只需要安装gitlab插件即可
点击 Manage Jenkins --> Manage Plugins -->可选插件,搜索gitlab
勾选gitlab,点击直接安装
等待十几分钟
提示安装完成
点击 Manage Jenkins --> Global Tool Configuration–> Git
“ Name ”随便填,“ Path to Git executable ”为git的安装路径
点击 Manage Jenkins --> Configure System -->配置 -->Gitlab
Connection Name ”随便填,“Git Host URL”填GitLab的访问地址,然后点“Add”——“jenkins”,如下所示:
选择gitlalb api,输入 jenkins 用户创建的token Zzis8ALsiYuytsg2GH-5
选择 gitlab api token,点击测试连接,出现 Success,表示成功。
6.配置Git插件
点击 Manage Jenkins --> Configure System -->配置 -->Git plugin
设置Git插件的全局配置,然后点击最下面的保存。
7.创建一个Jenkins Job
在jenkins里,一个任务叫做一个job。一般我们的项目会有多个分支,比如开发分支和产品分支,我们可以对每一个分支都新建一个job,比如,我们对开发分支创建一个测试的job,每次有代码提交就自动运行一次测试,对产品分支创建一个打包的job,每次有代码提交就运行打包任务。
不过在这里,我们只是单纯的创建一个job,来演示jenkins自动运行任务的过程。
首先,点击 新建Item,item name”可以随便起,然后点击“构建一个自由风格的软件项目”,点击Ok
至此,创建一个Job成功了
由于 jenkins 服务器的ssh秘钥,已经添加到gitlab上面了。那么就可以进行下一步了!
8.配置Job的源码管理
选择“源码管理”,选择“Git”,然后去GitLab中复制项目地址,粘贴到“Repository URL”,然后点击“credentials”后面的“Add”按钮
类型,选择 SSH Username with private key
Username 填 root
PrivateKey 选择Enter directly,点击add
登录到jenkins 服务器,查看私钥
cat /root/.ssh/id_rsa
将内容复制到网页上面,点击添加
在“credentials”里选择我们刚刚创建的认证方式:root
如果没报错,说明成功了,点击页面底部的“apply”。如果出错了,会在“Repository URL”和“Credentials”之间显示红色的错误信息。
jenkins job默认对master分支进行构建,你也可以自定义分支。这要求你的Gitlab代码仓库中要存在这个分支,一般来说,就是要向代码仓库提交一次更改,请 自行完成(Gitlab项目刚创建时是空的,一个分支也没有,这样的话,自动构建时会出错)
9.配置Job的构建触发器
选择“构建触发器”,勾选“Pull SCM”,这个选项会每隔一段时间检查一下GitLab仓库中代码是否有更新,有的话就执行构建操作。日程表如何设置,在这个输入框下面有说明。
扩展阅读:
常见构建触发器、:
Build after other projects are built 当另一个构建任务完成之后触发
Build periodically 周期性的触发
Build when a change is pushed to GitLab. GitLab CI Service URL: http://191.8.2.112:12000/project/test-go-dev 当代码有更新的时候触发,通过GitLab CI
GitHub hook trigger for GITScm polling 通过Github钩子触发
Poll SCM 定期检查代码有无更新,有更新时触发
10.配置Job的构建脚本
在build栏目里,选择“jenkins execute shell”,然后输入你项目的构建命令(这依赖于你的项目,如Maven的maven build,gulp的gulp xxx 等等)
这里我输入一段测试命令,表示将git项目的代码复制到/tmp/test
\cp -r $WORKSPACE /tmp/test
点击 可用的环境变量列表,就可以看到很多变量
其中 WORKSPACE 表示,下载git项目后的路径。
由于git项目为test,因此路径为:/var/lib/jenkins/workspace/test
点击保存
点击 Build Now,点击下面的构建过程
点击控制台输出,就可以看到完整的cp命令
登录到jenkins服务器,查看/tmp/test目录,是否有文件存在。
[root@Jenkins bin]# ll /tmp/test/
总用量 4
drwxr-xr-x. 3 root root 35 9月 24 14:08 deom
-rw-r--r--. 1 root root 15 9月 24 09:35 test