gitlab+jenkins+harbor+k8s部署微服务-流水线自动部署
一、gitlab
1.1 登录gitlab创建项目
项目名称等自定义,权限可以选择私有或者公有
1.2 gitlab 代码提交
创建好的项目下复制项目地址
#在gitlab服务器上创建一个目录
[root@k8s-node2 local]# cd test/
[root@k8s-node2 test]# ll
total 0
[root@k8s-node2 test]# pwd
/usr/local/test
[root@k8s-node2 test]# ll -la
total 0
drwxr-xr-x 2 root root 6 Oct 31 09:45 .
drwxr-xr-x. 16 root root 206 Oct 31 09:45 ..
#克隆项目
[root@k8s-node2 test]# git@192.168.198.147:root/xmls.git
-bash: git@192.168.198.147:root/xmls.git: No such file or directory
[root@k8s-node2 test]# git clone git@192.168.198.147:root/xmls.git
Cloning into 'xmls'...
remote: Enumerating objects: 79, done.
remote: Counting objects: 100% (44/44), done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 79 (delta 22), reused 32 (delta 16), pack-reused 35
Receiving objects: 100% (79/79), 104.66 MiB | 11.57 MiB/s, done.
Resolving deltas: 100% (33/33), done.
#项目xmls已经克隆下来
[root@k8s-node2 test]# ll -la
total 0
drwxr-xr-x 3 root root 18 Oct 31 09:47 .
drwxr-xr-x. 16 root root 206 Oct 31 09:45 ..
drwxr-xr-x 3 root root 51 Oct 31 09:47 xmls
[root@k8s-node2 test]# cd xmls/
[root@k8s-node2 xmls]# ll -la
total 8
drwxr-xr-x 3 root root 35 Oct 31 09:48 .
drwxr-xr-x 3 root root 18 Oct 31 09:47 ..
drwxr-xr-x 8 root root 163 Oct 31 09:47 .git
-rw-r--r-- 1 root root 6183 Oct 31 09:47 README.md
#查询分支
[root@k8s-node2 xmls]# git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
#创建xmzw分支
[root@k8s-node2 xmls]# git branch xmzw
[root@k8s-node2 xmls]# git branch -a
* main
xmzw
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/xmzw
#切换到xmzw分支
[root@k8s-node2 xmls]# git checkout xmzw
D xmtb.txt
Switched to branch 'xmzw'
[root@k8s-node2 xmls]# git branch -a
main
* xmzw
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/xmzw
#创建test文件,测试文件上传是否正常
[root@k8s-node2 xmls]# touch test.txt
#给test文件添加标志
[root@k8s-node2 xmls]# git add test.txt
#添加提交信息
[root@k8s-node2 xmls]# git commit -m "test commit"
[xmzw 6aa912c] test commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test.txt
#提交,第一次提交提示报错。这是因为远程repository和本地的repository有冲突
[root@k8s-node2 xmls]# git push
To git@192.168.198.147:root/xmls.git
! [rejected] xmzw -> xmzw (non-fast-forward)
error: failed to push some refs to 'git@192.168.198.147:root/xmls.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
#解决上面报错,需要先pull拉取远程分支文件,在重新提交即可
[root@k8s-node2 xmls]# git pull origin xmzw
From 192.168.198.147:root/xmls
* branch xmzw -> FETCH_HEAD
Merge made by the 'recursive' strategy.
Jenkinsfile | 35 +++++++++++++++++++++++++++++++++++
copy.sh | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
deploy.yaml | 42 ++++++++++++++++++++++++++++++++++++++++++
harbor.sh | 32 ++++++++++++++++++++++++++++++++
xm_nginx.tar.gz | Bin 0 -> 146217984 bytes
xmyd.txt | 3 +++
6 files changed, 160 insertions(+)
create mode 100644 Jenkinsfile
create mode 100644 copy.sh
create mode 100644 deploy.yaml
create mode 100644 harbor.sh
create mode 100644 xm_nginx.tar.gz
create mode 100644 xmyd.txt
[root@k8s-node2 xmls]#
[root@k8s-node2 xmls]#
[root@k8s-node2 xmls]# ll
total 142820
-rw-r--r-- 1 root root 1352 Oct 31 10:01 copy.sh
-rw-r--r-- 1 root root 760 Oct 31 10:01 deploy.yaml
-rw-r--r-- 1 root root 852 Oct 31 10:01 harbor.sh
-rw-r--r-- 1 root root 2272 Oct 31 10:01 Jenkinsfile
-rw-r--r-- 1 root root 6183 Oct 31 09:47 README.md
-rw-r--r-- 1 root root 0 Oct 31 09:52 test.txt
-rw-r--r-- 1 root root 146217984 Oct 31 10:01 xm_nginx.tar.gz
-rw-r--r-- 1 root root 19 Oct 31 10:01 xmyd.txt
#重新提交,可以看到test文件已经成功上传
[root@k8s-node2 xmls]# git push
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 501 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote:
remote: To create a merge request for xmzw, visit:
remote: http://192.168.198.147/root/xmls/-/merge_requests/new?merge_request%5Bsource_branch%5D=xmzw
remote:
To git@192.168.198.147:root/xmls.git
bf35535..5455143 xmzw -> xmzw
二、Jenkins
2.1 Jenkins创建流水线项目
比如创建任务名称:pipeline的流水线项目,点击确定
2.2 项目配置
点击pipeline任务,点击配置
1. 选择scm,配置gitlab仓库地址,这里要复制http的地址。
2. 勾选参数化构建过程,配置版本为传参
3. 点击流水线语法,会自动转换成Jenkins脚本命令
三、流水线部署
3.1 在gitlab上创建一个Jenkins文件
内容如下:
大概流程:从git仓库拉取代码-发送目标服务器-上传镜像到harbor-使用k8s部署业务
pipeline {
agent any
stages {
stage('从git仓库拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/xmzw']], extensions: [], userRemoteConfigs: [[credentialsId: '8f6e9bea-7734-43d8-a6a2-d54e233fa9ff', url: 'http://192.168.198.147/root/xmls.git']]])
echo 'H从git仓库拉取代码成功'
}
}
stage('发送目标服务器') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'ssh', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '*tar.gz,*sh,*yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
echo '发送目标服务器成功'
}
}
stage('上传镜像') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'ssh', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''ssh root@192.168.198.144
cd /usr/local/devops
sh harbor.sh $tag''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
echo '上传镜像成功'
}
}
stage('部署业务') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: 'ssh', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''ssh root@192.168.198.144
cd /usr/local/devops
kubectl apply -f deploy.yaml
kubectl rollout restart -n my-ns-pipeline deployment my-deploy''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
echo '部署业务成功'
}
}
}
}
3.2 推送镜像的脚本
[root@k8s-node2 xmls]# cat harbor.sh
#/bin/bash
imageTag=$1
echo > $imageTag
containerName=xm_nginx:${imageTag}
echo containerName: ${containerName}
cd /usr/local/devops
scp xm_nginx.tar.gz root@192.168.198.146:/usr/local/devops/
scp xm_nginx.tar.gz root@192.168.198.147:/usr/local/devops/
imageID=`docker images | grep xm_nginx |grep -v grep| awk '{print $3}'`
hostImageTag=`docker images | grep xm_nginx |grep -v grep| awk '{print $2}'`
echo imageID:$imageID hostImageTag:$hostImageTag
#删除旧镜像
if [[ "$hostImageTag" =~ "$imageTag" ]] ; then
docker rmi -f ${imageID}
echo "Delete Image ${imageID} Success"
fi
#加载镜像
docker load -i xm_nginx.tar.gz
echo "load Success"
#打标签
docker tag xm_nginx:$imageTag 192.168.198.144:80/xmzw/xm_nginx:latest
docker login 192.168.198.144:80 -u admin -p Harbor12345
docker push 192.168.198.144:80/xmzw/xm_nginx:latest
3.3 业务部署的yaml文件
[root@k8s-node2 xmls]# cat deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-deploy
name: my-deploy
namespace: my-ns-pipeline
spec:
replicas: 1
selector:
matchLabels:
app: my-deploy
template:
metadata:
creationTimestamp: null
labels:
app: my-deploy
spec:
containers:
- image: 192.168.198.144:80/xmzw/xm_nginx:latest
imagePullPolicy: Always
name: xm-nginx-hzsn5
ports:
- containerPort: 80
name: web
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: my-svc
namespace: my-ns-pipeline
spec:
ports:
- port: 8081
name: http
targetPort: 80
nodePort: 31761
selector:
app: my-deploy
type: NodePort
3.4 把deploy.yaml,harbor.sh,Jenkinsfile都同步到gitlab仓库
xm_nginx.tar.gz为Nginx的1.23.1的镜像包,网上下载一个即可
3.5 gitlab上创建tag
3.6 构建
选择1.23.1,点击构建
成功构建
3.7 测试访问正常
分类:
DevOps
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了