Jenkins + gitlab + harbor + k8s 自动化部属

一、环境准备

1、准备三台服务器主机安装k8s,准备一台主机安装gitlab、harbor、jenkins

2、所有主机安装docker 【参考

3、安装服务

二、部属流程

一)常规部署

1、jenkins 新增任务

新增任务 -> 配置任务
image.png

image.png

image.png
:::note{title=“注”}
要记住webhook 地址,生成令牌,用来配置gitlab的钩子。当gitlab提交代码的时候主动触发jenkins编译流程
:::

2、gitlab 上配置钩子

image.png

image.png

3、测试本地提交代码

image.png

二)、脚本部署

1、Jenkinsfile docker-compose
pipeline {
    agent any
    environment {
	    harbor_host = "harbor.wjaiot.net"
        project_name = "xz-server"
		image = "${harbor_host}/${project_name}/${server_name}-${server_type}"
        config_path="service/${server_name}/rpc/etc/ch/config_test.yaml"
        date = "${BUILD_TIMESTAMP}"
    }
    stages {
        stage('编译') {
            steps {
                sh """
                export GOPROXY=https://goproxy.cn
                go mod tidy
                go build -o ./bin/main  service/${server_name}/${server_type}/${server_name}.go
                """
            }
        }
        stage('构建镜像') {
            steps {
                sh """
				docker build -t ${image}:latest  .
				docker tag ${image}:latest ${image}:test-${date}
				docker push ${image}:test-${date}
				"""
            }
        }
		stage('部署') {
		    steps {
              writeFile file: 'v-hosts', text: '''[test]
ip     ansible_ssh_port=36000
ip     ansible_ssh_port=36000'''
              writeFile file: 'ansible.cfg', text: '''[defaults]
inventory      = hosts
host_key_checking = False
command_warnings = false'''
              writeFile file: "${server_name}-${server_type}-docker-compose.yaml", text: """version: \'3\'

services:
  ${server_name}-${server_type}:
    image: ${image}:test-${date}
    environment:
      TZ: "Asia/Shanghai"
      XZ_REGION: "ch"
      XZ_ETCD_HOSTS: "ip:2379"
      ENV: "test"
    restart: always
    network_mode: "host"
    volumes:
      - /data/logs:/app/logs
"""
              sh """
				ansible -i v-hosts test -m copy -a 'src=${server_name}-${server_type}-docker-compose.yaml dest=/mnt/'
        ansible -i v-hosts test -m shell -a 'cd /mnt/ && docker-compose -p saas -f ${server_name}-${server_type}-docker-compose.yaml up -d'
				"""
				
			}
		}
    }
}

2、Jenkinsfile k8s
  • 创建更新

    1)配置k8s环境,jenkins必须能够使用docker、kubectl,使用挂载的方式

version: "3.8"

services:
  jenkins:
    image: jenkins/jenkins:2.419-centos7
    restart: always
    ports:
     - "8081:8080"
     - "50000:50000"
    expose:
      - "8081"
      - "50000"
    privileged: true
    user: root
    container_name: jenkins
    volumes:
     - ~/jenkins:/var/jenkins_home
     - /var/run/docker.sock:/var/run/docker.sock
     - /usr/bin/docker:/usr/bin/docker
     - /usr/bin/kubectl:/usr/bin/kubectl
     - /root/.kube/config:/root/.kube/config
     - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
    environment:
      JAVA_OPTS: '-Djava.util.logging.config.file=/var/jenkins_home/log.properties'
2)配置kubectl 配置 ~/.kube/config,通过挂载的方式实现
#####环境变量#####
harbor_host="x.x.x.x:5000"
project_name="ci-test"
tag="latest"
time=$(date "+%Y%m%d%H%M%S")

. ~/.bashrc

#####编译+构建镜像#####
docker login -u CI-runner -p CI-runner123456 x.x.x.x:5000
docker build -t x.x.x.x/platform/${project_name}:${tag} .
docker push x.x.x.x:5000/platform/${project_name}:${tag}

########部署 #######
sed -i "s#PROJECT_NAME#${project_name}#g" deployment.yaml
sed -i "s#TAG#${tag}#g" deployment.yaml
cat deployment.yaml
echo "start deployment"
kubectl version
kubectl apply -f deployment.yaml

# 清理无用镜像
#docker image prune -f
  • 更新
#####环境变量#####
harbor_host="harbor.wjaiot.net"
project_name="xz-server"
time=$(date "+%Y%m%d%H%M%S")

. ~/.bashrc

#####编译+构建镜像#####
export GOPROXY=https://goproxy.cn
go mod tidy

for i in `echo $server_name |sed 's/,/ /g'`
do
   mua=`echo $i |awk -F '-' '{print $1}'`
   mub=`echo $i |awk -F '-' '{print $2}'` 
   
   image="${harbor_host}/${project_name}/${mua}-${mub}"
   rm -rf ./bin/main
   go build -o ./bin/main  service/${mua}/${mub}/${mua}.go
   docker build . -t ${image}:test-${time}
   docker push ${image}:test-${time}  
done 

########部署 #######
for i in `echo $server_name |sed 's/,/ /g'`
do
   mua=`echo $i |awk -F '-' '{print $1}'`
   mub=`echo $i |awk -F '-' '{print $2}'` 
   kk set image deployment/$mua-$mub $mua-$mub=harbor.wjaiot.net/xz-server/$mua-$mub:test-${time}  --record  -n xz-server-test
done

# 清理无用镜像
#docker image prune -f
  • 效果

image.png

image.png

三、参考

Docker+Jenkins+Git自动部署项目