基于Jenkins构建微服务发布平台-2

news/2024/11/30 20:28:32/文章来源:https://www.cnblogs.com/LiuChang-blog/p/18578832

基于Jenkins构建微服务发布平台-2

续——基于Jenkins构建微服务发布平台-1

4 流水线自动发布微服务项目

4.4 Docker阿里云镜像加速失效解决方案
在所有节点上执行。
# tee /etc/docker/daemon.json <<-'EOF'
{
   "registry-mirrors": [
       "https://do.nark.eu.org",
       "https://dc.j8.work",
       "https://docker.m.daocloud.io",
       "https://dockerproxy.com",
       "https://docker.mirrors.ustc.edu.cn",
       "https://docker.nju.edu.cn"
   ],
   "exec-opts": ["native.cgroupdriver=systemd"],
   "insecure-registries": ["172.16.1.61"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker
4.5 将 k8s-master1 上的 maven cache 复制到 k8s-node1、k8s-node2 节点上
[root@k8s-master1 ~]# scp -rp /root/.m2/ root@172.16.1.83:/root/
[root@k8s-master1 ~]# scp -rp /root/.m2/ root@172.16.1.84:/root/
4.6 微服务配置修改
1 由于镜像无法从互联网拉取,将镜像推送到本地公共镜像仓库
[root@k8s-master1 ~]# docker tag java:8-jdk-alpine 172.16.1.61/library/java:8-jdk-alpine
[root@k8s-master1 ~]# docker push 172.16.1.61/library/java:8-jdk-alpine

2 修改所有微服务文件夹中 Dockerfile 的基础镜像源
[root@k8s-master1 ~]# cd ms/simple-microservice/
# 以 product-service 服务为例
[root@k8s-master1 simple-microservice]# vim product-service/product-service-biz/Dockerfile
FROM 172.16.1.61/library/java:8-jdk-alpine
......

3 推送代码
[root@k8s-master1 simple-microservice]# git add .
[root@k8s-master1 simple-microservice]# git commit -m "modify Dockerfile"
[root@k8s-master1 simple-microservice]# git push
4.7 本地 harbor 镜像仓库

1 公共镜像仓库

image-20241129221809755

2 微服务项目仓库

image-20241130183724716

4.8 jenkinsfile脚本文件
#!/usr/bin/env groovy
// 所需插件: Git Parameter/Git/Pipeline/Config File Provider/kubernetes/Extended Choice Parameter

// harbor仓库地址
def registry = "172.16.1.61"
// harbor仓库项目名称
def project = "microservice"
// jenkins agent 镜像
jenkins_agent = "172.16.1.61/library/jenkins-slave-jdk:1.8"

// gitlab仓库地址
def git_url = "http://172.16.1.62:9999/dev/microservice.git"

// jenkins存储的认证信息
def harbor_auth = "cefb7cc5-d454-4e88-9095-e6d7f6f796c5"
def git_auth = "e80eb4fe-4564-48f5-9ef4-a75b49c1c079"
def k8s_auth = "5c5ae334-12dd-4a6a-8a47-1e2a1dbed983"

pipeline {
agent {
   kubernetes {
       label "jenkins-agent"
       yaml """
apiVersion: v1
kind: Pod
metadata:
name: jenkins-agent
spec:
containers:
- name: jnlp
   image: "${jenkins_agent}"
   imagePullPolicy: Always
   volumeMounts:
     - name: docker-cmd
       mountPath: /usr/bin/docker
     - name: docker-sock
       mountPath: /var/run/docker.sock
     - name: maven-cache
       mountPath: /root/.m2
volumes:
   - name: docker-cmd
     hostPath:
       path: /usr/bin/docker
   - name: docker-sock
     hostPath:
       path: /var/run/docker.sock
   - name: maven-cache
     hostPath:
       path: /root/.m2
"""
   }
}

   parameters {
       gitParameter branch: '', branchFilter: '.*', defaultValue: 'origin/master', description: '选择发布的分支', name: 'Branch', \
         quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition'
       extendedChoice description: '选择发布的微服务', multiSelectDelimiter: ',', name: 'Service', \
         quoteValue: false, saveJSONParameterToFile: false, type: 'PT_CHECKBOX', \
         value: 'eureka-service,gateway-service,portal-service,product-service,order-service,stock-service', visibleItemCount: 5
   }

   stages {
       stage('拉取代码') {
           steps {
               checkout scmGit(branches: [[name: "${params.Branch}"]], extensions: [], \
                 userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
           }
       }

       stage('代码编译') {
           // 编译指定服务
          steps {
               sh """
                 pwd
                 echo ${WORKSPACE}
                 ls -l ${WORKSPACE}
                 export JAVA_HOME=/usr/local/jdk1.8.0_45
                 export PATH=\${JAVA_HOME}/bin:\${PATH}
                 mvn clean package -Dmaven.test.skip=true
               """
           }
       }

       stage('构建镜像') {
           steps {
               withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                 sh """
                   docker login -u ${username} -p ${password} ${registry}
                   for service in \$(echo ${Service} |sed 's/,/ /g'); do
                     cd \${service}
                     if ls |grep biz &>/dev/null; then
                       cd \${service}-biz
                     fi
                     service_name=\${service%-*}
                     image_name=${registry}/${project}/\${service_name}:${BUILD_NUMBER}
                     docker build -t \${image_name} .
                     docker push \${image_name}
                     cd ${WORKSPACE}
                     sed -i -r "s#(image: )(.*)#\\1\${image_name}#" k8s/\${service_name}.yaml
                   done
                 """
               }
           }
       }

       stage('部署到K8S') {
           steps {
               configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: 'admin.kubeconfig')]) {
                 sh """
                   cd ${WORKSPACE}/k8s/
                   for service in \$(echo ${Service} |sed 's/,/ /g'); do
                     service_name=\${service%-*}
                     kubectl apply -f \${service_name}.yaml --kubeconfig ${WORKSPACE}/admin.kubeconfig
                   done
                 """
               }
           }
       }
   }
}
4.9 创建pipeline流水线

1 创建名为 jenkins-ms 的 pipeline 流水线任务

image-20241130180051161

2 将"4.8 jenkinsfile脚本文件"贴入如下 "Pipeline script" 文本框中并保存流水线任务

image-20241130180319906

4.10 执行pipeline流水线任务

1 第一次构建流水线任务(第一次构建时会报错,为参数化构建做准备)

image-20241130181051054

image-20241130181944358

2 参数化构建

image-20241130182625734

3 构建时会自动创建 jenkins agent pod,流水线结束后该 pod 会自动被销毁

image-20241130182931049

4 构建完成

image-20241130192038687

(1) Console Output

image-20241130185115538

......

image-20241130185151209

(2) 流水线步骤

image-20241130185441514

5 查看镜像仓库

image-20241130192329900

所有镜像的版本号都和pipeline流水线构建版本号相同,以 gateway 服务镜像为例。

image-20241130192516886

6 查看pod状态

pod自动销毁后并自动重建

image-20241130190045122

image-20241130190232575

4.11 流水线脚本与源代码一起版本管理
Jenkinsfile 文件建议与源代码放在一起进行版本管理,实现流水线即代码(Pipeline as Code),这样做的好处有:
(1) Jenkins从Git仓库中读取Jenkinsfile
(2) 自动为所有分支创建流水线脚本。
(3) 方便流水线代码复查、追踪、迭代。
(4) 可被项目成员查看和编辑。
4.12 小结
1 使用Jenkins的插件
(1) Chinese
(2) Git & gitParameter
(3) Kubernetes
(4) Pipeline
(5) Config File Provider
(6) Extended Choice Parameter

2 CI/CD环境特点
(1) Slave 弹性伸缩
(2) 基于镜像隔离构建环境
(3) 流水线发布,易维护
(4) Jenkins 参数化构建可帮助你完成更复杂环境 CI/CD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/844252.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九种常见二维插值方法及双线性插值的理解

九种常见二维插值方法概述 在数据分析、计算机视觉和图形处理等领域,插值是一种重要的技术,用于估算在已知数据点之间的未知值。以下是几种常用的插值方法的详细介绍。 1. 双线性插值 (Bilinear Interpolation) 双线性插值是一种在二维直线网格上进行插值的技术。它首先在一个…

c# is 和 as 浅看重制版

前言 当年写的比较差:https://www.cnblogs.com/aoximin/p/12965408.html,所以特来重新写一遍。 正文 首先为什么会出现is 和 as 呢? 因为是为了有需要检验的地方,如果直接使用显示转换的话,那么可能直接报错了。 namespace ConsoleApp4 {class Program{static void Main(s…

20222422 2024-2025-1 《网络与系统攻防技术》实验五实验报告

一、实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:使用whois、dig、nslookup、traceroute、以及各类在线和离线…

安装扫描仪DS-410出现安装Desktop Experience提示

安装Epson Scan所需的某些模块没有安装。安装Desktop Experience之后安装Epson Scan。在Windows server 2012上安装扫描仪出现该错误,该错误为server系统需要桌面支持,默认Windows server 该功能是不安装的需要用户按需求安装。 安装windows server 2012 R2 安装桌面体验勾选…

2019-8-29-02-JS-DOM

图片轮播是Web开发中最常见的组件之一,这是一篇用原生JavaScript实现简单图片轮播的教程。 要实现图片轮播,首先我们要将图片轮播拆分为图片容器、图片、上一页按钮、下一页按钮、底部点选容器、底部点选按钮。 下面我们用HTML代码表示。 ... <div id="page">…

【朝花夕拾】蓝牙WiFi常识篇

一、蓝牙常识点 1、常见英文缩写缩写 英文全称 释义BLE Bluetooth Low Energy低功耗蓝牙BR Basic Rate基本速率,一般说的经典蓝牙就是指BR/EDREDR Enhanced Data Rate增强速率,BR的增强版,一般说的经典蓝牙就是指BR/EDRBluetooth SIG Bluetooth Special Interest Group蓝牙技…

Git入门图文教程(1.5W字40图)--深入浅出、图文并茂

原文:Git入门图文教程(1.5W字40图)🔥🔥--深入浅出、图文并茂 - 安木夕 - 博客园01、认识一下Git!—简介 Git是当前最先进、最主流的分布式版本控制系统,免费、开源!核心能力就是版本控制。再具体一点,就是面向代码文件的版本控制,代码的任何修改历史都会被记录管理起…

20222414 2024-2025-1 《网络与系统攻防技术》实验七实验报告

1.实验内容及要求 1.1本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。具体实践有 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 1.2本周学习内容 (1)web安全基础:…

硬盘的基本知识与选购指南

1、3.5和2.5英寸硬盘的英寸,不是指外壳的尺寸,而是硬盘盘片的直径尺寸。 无论是 2.5英寸的硬盘还是 3.5 英寸的硬盘,都是使用 SATA 接口。 1.1、3.5英寸 3.5 英寸的硬盘在 1984 年就已经诞生,直到在 1991 年出现首款容量为 1GB 的机械硬盘,3.5 英寸硬盘开始成为标准规格。…

《Django 5 By Example》阅读笔记:p455-p492

《Django 5 By Example》学习第 16 天,p455-p492 总结,总计 38 页。 一、技术总结 1.myshop (1)打折功能 使用折扣码实现,但是折扣码是手动生成的,感觉实际业务中应该不是这样的。 (2)推荐功能 使用 Redis 做缓存,结合商品的销量做推荐,算是一种普通的实现方案。 二、英语…

[ctf]跟着风二西复现NSSCTF流量题目

题目参考博客 https://blog.csdn.net/zerorzeror/article/details/135737476?spm=1001.2014.3001.5502 20241130 [GKCTF 2021]签到 解题过程 可以看到流量并不多,看到GET和POST里面有tmpshell 然后追踪HTTP流 可以看到初始的这一段字符,因为字符中字母最大的为f,无其他字符…

STM2F411智能手环设计

最近闲来无事就想制作一款智能手表,为此我直接从网上找到一个开源项目OV-Watch。这里我们就以这个开源项目为例,一步步就讲解,从最初的电路原理图绘制,到PCB打样焊接,到最后的程序编写烧录测试。 由于该开源项目包含了若干个版本,这里我们在复刻的时候以当前最新版本为例…