02_使用Docker在服务器上部署Jekins实现项目的自动化部署

02_使用Docker在服务器上部署jenkins实现项目的自动化部署

一、使用docker拉取阿里云容器私有镜像仓库内的jenkins镜像

  1. 登录阿里云Docker Registry
$ sudo docker login --username=wxxxo@1xxx registry.cn-shanghai.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

  1. 从Registry中拉取镜像
$ sudo docker pull registry.cn-shanghai.aliyuncs.com/xxx/jenkins:[镜像版本号]

二、创建jenkins容器并运行

$ sudo docker run -d -u root -p 8080:8080 -p 50000:50000 -v /home/docker/jenkins_home:/var/jenkins_home --name jenkins registry.cn-shanghai.aliyuncs.com/xxx/jenkins:2.491-jdk17

每个参数的含义:

  • docker run: 运行 Docker 容器的命令。

  • -d: 在后台运行容器,即“detached”模式。

  • -u root: 以 root 用户身份运行容器。这通常用于确保容器内的进程具有足够的权限执行需要的操作。

  • -p 8080:8080: 将容器内部的 8080 端口映射到宿主机的 8080 端口(宿主机端口:容器内部端口)。Jenkins 服务通常在 8080 端口上运行。

  • -p 50000:50000: 将容器内部的 50000 端口映射到宿主机的 50000 端口(宿主机端口:容器内部端口)。这是 Jenkins 使用的用于构建和执行任务的端口。

  • -v /home/docker/jenkins_home:/var/jenkins_home: 将宿主机上的目录(/home/docker/jenkins_home)挂载到容器内的 /var/jenkins_home 目录(宿主机目录:容器内部目录)。这样可以确保 Jenkins 数据和配置持久化,即使容器被删除,数据仍然保存在宿主机上。

    注意:/home/docker/jenkins_home 为自己在Linux系统里创建的用来持久化jenkins数据的目录,而/var/jenkins_home是docker容器内的默认路径,即jenkins_home的路径在docker容器内的/var下。

  • –name jenkins: 为容器指定一个名称,即 “jenkins”。

  • registry.cn-shanghai.aliyuncs.com/xxx/jenkins:2.491-jdk17: 指定要运行的 Docker 镜像的名称和版本(镜像名称:版本号)。

三、登录jenkins

通过访问[服务器IP]:[jenkins端口]访问jenkins服务,刚使用jenkins服务时,需要使用jenkins提供的默认密码进行验证。

jenkins提供的默认密码路径(在docker容器内)为:

/var/jenkins_home/secrets/initialAdminPassword

(如果将宿主机的某个目录路径挂载到 /var/jenkins_home 路径):如将宿主机上的目录(/home/docker/jenkins_home)挂载到容器内的 /var/jenkins_home 目录,那么默认密码路径为

/home/docker/jenkins_home/secrets/initialAdminPassword

安装插件,当然也可以跳过,不过一般推荐按照jenkins的推荐的插件。安装完毕后,可以创建jenkins用户。

四、编写dockerfile、K8S/deployment.yaml、jenkinsfile文件

dockerfile文件:docker打包镜像时,可以读取该文件中的内容,依据文件中的命令进行打包。

dockerfile示例:

# FROM 指定使用哪个镜像作为基准
FROM docker.m.daocloud.io/openjdk:8u191-jdk-alpine# 创建目录, 并设置该目录为工作目录
RUN mkdir -p /aaa
WORKDIR /aaa# 复制文件到镜像中
COPY target/aaa-1.0.jar aaa.jar# 设置时区
ENV TZ=Asia/Shanghai# 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV JAVA_OPTS="-Xms300m -Xmx300m -Djava.security.egd=file:/dev/./urandom"# 应用参数,可通过 docker run -e "ARGS=" 来设置,如 -e "ARGS=--spring.profiles.active=prod"
ENV ARGS=""# 暴露 8080 端口
EXPOSE 8080# 启动后端服务
CMD java ${JAVA_OPTS} -jar aaa.jar $ARGS

K8S/deployment.yaml文件:K8S创建应用时,可以通过该文件中的内容进行创建。

K8S/deployment.yaml文件:

apiVersion: v1 // apiVersion: v1:指定 Kubernetes API 版本,v1 适用于 Service 资源
kind: Service // 定义该资源的类型是一个 Service
metadata:name:  // 定义 Service 的名称
spec: // 定义 Service 的详细配置type: NodePort //指定 Service 类型为 NodePort,即允许外部通过 NodeIP:nodePort 访问服务。selector:app: aaa // 表示该 Service 只会选择 app: aaa 这个标签的 Pod 作为后端服务。ports: // 定义 Service 的端口映射- protocol: TCP // 指定使用 TCP 作为通信协议port: 8080 // 这是 Service 内部的端口,其他 Pod 访问该 Service 时使用这个端口。 port 会转发流量到 targetPort,通常它们可以相同,但不强制相同nodePort: 31500 // Kubernetes 在每个节点上分配的端口号,用于外部访问targetPort: 8080 // 这是 Pod 内部运行的容器监听的端口,对应 Dockerfile 里 EXPOSE 的端口和后文的里的 containerPortname: http // 端口名称(可不写)---
apiVersion: apps/v1 // 指定 Kubernetes API 版本,apps/v1 适用于 Deployment 资源
kind: Deployment // 定义该资源的类型是一个 Deployment,用于管理 Pod 的创建和更新
metadata:name: aaa // Deployment 的名称annotations:kubernetes.io/change-cause: registry-vpc.cn-shanghai.aliyuncs.com/aaa/aaa:{{GIT_COMMIT}} // 用于记录该 Deployment 变更的原因,常用于回滚和版本管理,其中 {{GIT_COMMIT}} 是 Git 提交的版本号,通常在 CI/CD 过程中会被替换为实际值,例如Jenkinsfile文件中有一条命令便是查找{{GIT_COMMIT}}并将其替换为实际的版本号
spec: // 定义 Deployment 的详细配置replicas: 1 // 指定副本数,即 Pod 的数量为 1selector:matchLabels:app: aaa // 表示该 Deployment 只会管理 app: aaa 这个标签的 Podtemplate: // 定义 Pod 模板,所有由该 Deployment 创建的 Pod 都会遵循此模板metadata:labels:app: aaa // 给 Pod 打上 app: aaa 的标签,便于 Service 发现该 Podspec: // 定义 Pod 的详细配置 containers:- name: aaa // 容器名称image: registry-vpc.cn-shanghai.aliyuncs.com/aaa/aaa:{{GIT_COMMIT}} // 指定容器的镜像地址,{{GIT_COMMIT}} 代表 Git 版本号,CI/CD 过程中会被替换为实际值ports: - containerPort: 8080 // 定义容器内部监听的端口,应和dockerfile里explode暴露的端口保持一致//下面注射的为健康检查配置#          livenessProbe: // (存活探针):检查容器是否存活,若失败 Kubernetes 会重启该容器#            httpGet:#              path: /user/health_check // 通过 HTTP GET 请求 /user/health_check 端点检查健康状态#              port: 8080#            initialDelaySeconds: 30#          readinessProbe: // (就绪探针):检查容器是否准备好接收流量,未通过时 Kubernetes 不会将其加入负载均衡#            httpGet:#              path: /user/health_check // 通过 HTTP GET 请求 /user/health_check 端点检查健康状态#              port: 8080#            initialDelaySeconds: 30 // 表示容器启动后等待 30 秒再执行检查env: // 定义环境变量- name: PROFILE // 环境变量名value: dev // 环境变量值,表示该容器运行在 dev(开发)环境volumeMounts:- name: timezone // 引用 volumes 定义的 timezonemountPath: /etc/localtime // 将宿主机的 /usr/share/zoneinfo/Asia/Shanghai 文件挂载到容器的 /etc/localtime,确保容器使用上海时区imagePullSecrets:- name: aliyun-registry // 指定 Kubernetes 拉取私有镜像所需的凭据,通常用于登录阿里云镜像仓库volumes: - name: timezone 定义一个名为 timezone 的存储卷hostPath:path: /usr/share/zoneinfo/Asia/Shanghai // 宿主机路径,提供时区文件

Jenkinsfile文件:Jenkins全流程部署时,根据该文件中的内容,进行全流程部署。

Jenkinsfile文件:

pipeline { // 定义一个工作流environment { //定义环境变量//定义Docker镜像仓库地址registry = "registry-vpc.cn-shanghai.aliyuncs.com/xxxx/aaa"registryCredential = "dockerhub"parentWorkspace = "$WORKSPACE" FAILED_STAGE=""CURRENT_ENVIRONMENT=""BLUE_OR_GREEN=""}agent any // 定义在哪个 agent 上运行,这里使用任意可用节点stages { // 定义流水线中各个阶段(stages)stage("Deply Parent") { // 项目构建阶段agent {docker { //指定使用 Docker 代理运行image 'registry.cn-hangzhou.aliyuncs.com/acs/maven:3-jdk-8'args '-v $HOME/.m2/repository:/root/.m2/repository -u root'}}steps { // 定义该阶段的步骤(steps),并使用 script 块以脚本形式执行命令script {FAILED_STAGE=env.STAGE_NAME //将当前阶段名称(env.STAGE_NAME)赋值给变量 FAILED_STAGE,以便在出错时记录是哪一阶段失败了。sh "mvn -Dmaven.repo.local=/var/jenkins_home/jenkins_m2_repo -U install -Dmaven.test.skip=true" // 执行一个 shell 命令,通过 Maven 进行项目构建:-Dmaven.repo.local=/var/jenkins_home/jenkins_m2_repo 指定 Maven 本地仓库路径,-U 表示强制更新 SNAPSHOT 依赖,install 命令用于构建并安装项目,-Dmaven.test.skip=true 则跳过测试执行。// 拷贝到容器外sh "cp target/aaa-1.0.jar " + parentWorkspace +"/aaa-1.0.jar" // 执行一个 shell 命令,将 target 目录下生成的 aaa-1.0.jar 文件复制到外部的工作空间路径(由变量 parentWorkspace 指定)。}}}stage("Building image") { //构建镜像阶段steps {script {FAILED_STAGE=env.STAGE_NAME // 将当前阶段名称赋值给 FAILED_STAGE,docker.build(registry) // 调用 docker.build(registry) 方法,根据之前定义的 registry 变量构建 Docker 镜像。}}}stage("Deploy Image") { // 部署镜像阶段steps {script {FAILED_STAGE=env.STAGE_NAME // 将当前阶段名称赋值给 FAILED_STAGEdocker.withRegistry('https://registry-vpc.cn-shanghai.aliyuncs.com', registryCredential) { // 使用 docker.withRegistry 方法指定镜像仓库地址 https://registry-vpc.cn-shanghai.aliyuncs.com 和凭据 registryCredential,docker.image(registry).push("$GIT_COMMIT") //将构建的镜像以当前 Git 提交号($GIT_COMMIT)作为标签推送到仓库。}}}}stage("Update k8s cluster") { // 更新 Kubernetes 集群阶段options {timeout(time: 5, unit: 'MINUTES') // 本阶段超时时间限定为 5 分钟}steps {script {FAILED_STAGE = env.STAGE_NAME // 当前阶段名称赋值给 FAILED_STAGEif (env.GIT_BRANCH == "origin/master") { // 判断当前的 Git 分支是否为 "origin/master"sh "cat k8s/deployment.yml | sed 's/{{GIT_COMMIT}}/$GIT_COMMIT/g' | kubectl apply -n default -f -" // 使用 sed 命令将 k8s/deployment.yml 文件中的占位符 {{GIT_COMMIT}} 替换为实际的 Git 提交号,并通过管道传递给 kubectl apply 命令,应用于 default 命名空间sh "kubectl rollout status deployment/aaa -n default" // 使用 kubectl rollout status 命令检查部署状态,确保部署成功}else{sh "cat k8s/deployment-test.yml | sed 's/{{GIT_COMMIT}}/$GIT_COMMIT/g' | kubectl apply -n test -f -" // 对 k8s/deployment-test.yml 文件进行替换,并将其应用于 test 命名空间sh "kubectl rollout status deployment/aaa -n default" // 检查部署状态}}}}}post { // 流水线的后置操作(post)aborted { // 流水线被中止(aborted)时,执行以下 script 脚本script {if (FAILED_STAGE == "Update k8s cluster") { // 如果最后出错的阶段(FAILED_STAGE)是 "Update k8s cluster",则根据当前 Git 分支进行回滚操作if (env.GIT_BRANCH == "origin/master") { // 如果在 origin/master 分支下sh "kubectl config use kubernetes" // 切换 kubectl 配置)sh "kubectl rollout undo deployment/aaa" // 回滚部署 aaa。}else{sh "kubectl config use kubernetes" 切换配置sh "kubectl rollout undo deployment/aaa-test" 回滚部署}}}}}
}

五、创建任务

创建一个任务(可以使用模板,如Freestyle project、Pipeline)。

  1. 如果使用的是Freestyle project
    1. 选择代码源,无论使用哪个模板,都需要处理代码源管理(Source Code Management),项目如果在Coding、GitHub、Gitee等托管平台上,则选择Git。
      1. 填写仓库路径(Repository URL),HTTP的仓库路径。填写完路径以后,一般会报错。
      2. 如果没有Credentials,则需要添加一个新的Credentials。添加时,Username 填仓库所在平台的邮箱,密码填仓库所在平台的用户密码。完成以后,如果账号密码没问题,则此处不会报错。
      3. 有时还需要选择分支(Branch Specifier)。
    2. 处理构建流程(Steps),需要手动一个一个添加(Add build step)。
  2. 如果使用的是Pipeline
    1. 一般选择Pipeline-Definition为Pipeline script from SCM。
    2. SCM (代码源)选择为 Git
      1. 填写仓库路径(Repository URL),HTTP的仓库路径。填写完路径以后,一般会报错。
      2. 如果没有Credentials,则需要添加一个新的Credentials。添加时,Username 填仓库所在平台的邮箱,密码填仓库所在平台的用户密码。完成以后,如果账号密码没问题,则此处不会报错。
      3. 有时还需要选择分支(Branch Specifier)。
    3. Script Path填写自己在项目根目录放置的用于jenkins读取的文件(自动化部署的命令),如jenkinsfile文件等。

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

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

相关文章

微服务组件——Eureka组件的安装与使用指南

文章目录 一、Eureka Server的安装与配置1、创建Spring Boot项目2、添加依赖3、配置Eureka Server4、启用Eureka Server5、启动并访问Dashboard 二、Eureka Client的配置(服务注册)1、添加客户端依赖2、配置客户端3、启用服务发现4、启动服务 三、服务发…

探索Doris:日志分析的新宠,是否能取代老牌ES?

在大数据时代,日志存储与分析对于企业的运营和决策起着至关重要的作用。Elasticsearch(简称 ES)作为一款广泛应用的开源分布式搜索和分析引擎,长期以来在日志管理领域占据着举足轻重的地位。然而,随着技术的不断发展&a…

学习threejs,使用Texture纹理贴图,测试repeat重复纹理贴图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Texture 纹理贴图1.1.1 ☘️…

图像配准及识别

一、图像配准基础 图像配准,听起来很高大上,其实用大白话来说,就是“让两张照片对齐”的技术。想象一下,你有两张拍得不完全一样的照片,比如一张是你从正面拍的风景,另一张是从侧面拍的同一个地方&#xff…

QT之QML(简单示例)

需求一:点击按钮弹出菜单,并且自定义菜单弹出位置。 mouse.x 和 mouse.y 获取的是相对于 MouseArea(在这个例子中是 Button)左上角的局部坐标。如果你想要在鼠标点击位置显示 Menu,你需要将这个局部坐标转换为相对于应…

如何编写单元测试

一、前言知识 1.开发过程 需求分析->设计->开发->测试->上线 2.测试种类 单元测试(测试模块编码)、黑盒测试(测试功能是否满足需求)、白盒测试(测试程序内部的逻辑结构)、回归测试(提出的缺陷进行二次验证)、集成测试(测试主要的业务功能及模块间的整合性)、系…

LeetCode 解题思路 30(Hot 100)

解题思路: 递归参数: 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程: 当当前路径 path 的长度等于 n * 2 时,说明已经生成有效括号,加入结果集。若左括号数小于 n&…

【Golang】Windows系统键鼠空闲监测练习

在本文中,我们将练习如何使用Golang编写一个简单的Windows系统空闲时间监测工具。该工具能够检测系统的空闲时间,并在达到一定阈值时计数。 功能概述 监控鼠标和键盘的空闲事件,每空闲超过50s,触发次数加一。 该工具具有以下功…

关于React Redux

官网:👉详情一 👉详情二 👉关于redux 使用原因:👉详情 /** 2-1、随着javascript单页应用程序的发展,需要在代码中管理更多的状态(包括服务器响应数据、缓存数据、本地创建还未发送…

MySQL和Oracle批量插入SQL差异详解

文章目录 MySQL和Oracle批量插入SQL差异详解1. 基本批量插入语法1.1 MySQL批量插入1.2 Oracle批量插入 2. 带序列的批量插入2.1 MySQL带自增ID的批量插入2.2 Oracle带序列的批量插入 3. 条件批量插入3.1 MySQL条件批量插入3.2 Oracle条件批量插入 MySQL和Oracle批量插入SQL差异…

43页可编辑PPT | 大数据管理中心设计规划方案大数据中心组织架构大数据组织管理

这份文档是一份关于大数据管理中心规划设计方案的详细报告,涵盖了背景与需求分析、整体规划方案、关键能力实现方案以及实施方案等内容。报告强调大数据在城市治理中的重要性,提出通过构建统一的大数据平台,整合城市各部门数据资源&#xff0…

Python-八股总结

目录 1 python 垃圾处理机制2 yield3 python 多继承,两个父类有同名方法怎么办?4 python 多线程/多进程/协程4.1 多线程与GIL全局解释器锁4.2 多进程4.3 协程 5 乐观锁/悲观锁6 基本数据结构**1. 列表(List)****2. 元组&#xff0…

HTML 标签类型全面介绍

HTML 标签类型全面介绍 HTML(HyperText Markup Language)是构建 Web 页面结构的基础语言。HTML 由不同类型的标签组成,每种标签都有特定的用途。本文将全面介绍 HTML 标签的分类及其用法。 1. HTML 标签概述 HTML 标签通常成对出现&#xf…

vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启

1、粘滞滚动的基本概念和作用 ‌VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果,使得编辑器在滚动到某个位置时会“粘”在那里,而不是平滑滚动到底部或顶部。‌ 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…

【商城实战(101)】电商未来已来:新技术引领商城发展新航向

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…

深度学习Note.5(机器学习.6)

1.Runner类 一个任务应用机器学习方法流程: 数据集构建 模型构建 损失函数定义 优化器 模型训练 模型评价 模型预测 所以根据以上,我们把机器学习模型基本要素封装成一个Runner类(加上模型保存、模型加载等功能。) Runne…

linux服务器专题1------redis的安装及简单配置

在 linux上安装 Redis 可以按照以下步骤进行(此处用Ubuntu 服务器进行讲解): 步骤 1: 更新系统包 打开终端并运行以下命令以确保你的系统是最新的: sudo apt update sudo apt upgrade步骤 2: 安装 Redis 使用 apt 包管理器安装 Redis: s…

面试问题总结:qt工程师/c++工程师

C 语言相关问题答案 面试问题总结:qt工程师/c工程师 C 语言相关问题答案 目录基础语法与特性内存管理预处理与编译 C 相关问题答案面向对象编程模板与泛型编程STL 标准模板库 Qt 相关问题答案Qt 基础与信号槽机制Qt 界面设计与布局管理Qt 多线程与并发编程 目录 基础…

实现实时数据推送:SpringBoot中SSE接口的两种方法

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

LXC 导入多Linux系统

前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<