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 测试访问正常

 

posted @ 2022-10-31 10:42  IT运维成长笔记  阅读(2441)  评论(2编辑  收藏  举报