K8S学习之基础五十四:jenkins新建测试流水线

jenkins新建测试流水线

新建任务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

node('testak') {stage('第1步:从gitee上下载源代码') {git url: "https://gitee.com/akang007/jenkins-sample"script {build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}}stage('第2步:基于dockerfile文件制作镜像') {sh "docker build -t 192.168.40.62/jenkins-demo/jenkins-demo:${build_tag} ."}stage('第3步:把镜像上传到harbor私有仓库') {withCredentials([usernamePassword(credentialsId: 'dockerharbor', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {sh "docker login 172.16.80.140 -u ${dockerHubUser} -p ${dockerHubPassword}"sh "docker push 172.16.80.140/jenkins-demo/jenkins-demo:${build_tag}"}}stage('第4步:把pod部署到开发环境') {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev-harbor.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev-harbor.yaml"
//        sh "bash running-devlopment.sh"sh "kubectl apply -f k8s-dev-harbor.yaml  --validate=false"}	stage('第5步:把pod部署到测试环境') {	def userInput = input(id: 'userInput',message: '确定部署到测试环境吗?输入yes确定',parameters: [[$class: 'ChoiceParameterDefinition',choices: "YES\nNO",name: 'Env']])echo "This is a deploy step to ${userInput}"if (userInput == "YES") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa-harbor.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa-harbor.yaml"
//            sh "bash running-qa.sh"sh "kubectl apply -f k8s-qa-harbor.yaml --validate=false"sh "sleep 6"sh "kubectl get pods -n qatest"sh "cd /home/jenkins/agent/workspace/jenkins-harbor"sh "/root/Python-3.12.5/python qatest.py"} else {//exit}}stage('第6步:pod部署到生产环境') {	def userInput = input(id: 'userInput',message: '确定部署到生产环境吗?输入yes确定',parameters: [[$class: 'ChoiceParameterDefinition',choices: "YES\nNO",name: 'Env']])echo "This is a deploy step to ${userInput}"if (userInput == "YES") {sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod-harbor.yaml"sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod-harbor.yaml"
//            sh "bash running-production.sh"sh "cat k8s-prod-harbor.yaml"sh "kubectl apply -f k8s-prod-harbor.yaml --record --validate=false"sh "cd /home/jenkins/agent/workspace/jenkins-harbor"sh "/root/Python-3.12.5/python smtp.py"}}
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Skip to content
[Jenkins]Jenkins
查找 (⌘+K)
1
2
admin注销
Dashboard
jenkins-harbor
#11
状态
变更历史
Console Output
View as plain text
编辑构建信息
删除构建 ‘#11’
Timings
Git Build Data
回放
流水线步骤
Workspaces
上一次构建
Console Output
Started by user admin
[Pipeline] Start of Pipeline
[Pipeline] node
Agent test-p2tjd is provisioned from template test
---
apiVersion: "v1"
kind: "Pod"
metadata:annotations:kubernetes.jenkins.io/last-refresh: "1742977713779"labels:jenkins: "slave"jenkins/label-digest: "0d1a27dd84b68b7896a5df6f824a36e1721850f6"jenkins/label: "testak"kubernetes.jenkins.io/controller: "ttp___jenkins-service_jenkins-k8s_svc_cluster_local_8080x"name: "test-p2tjd"namespace: "jenkins-k8s"
spec:containers:- env:- name: "JENKINS_SECRET"value: "********"- name: "JENKINS_AGENT_NAME"value: "test-p2tjd"- name: "REMOTING_OPTS"value: "-noReconnectAfter 1d"- name: "JENKINS_NAME"value: "test-p2tjd"- name: "JENKINS_AGENT_WORKDIR"value: "/home/jenkins/agent"- name: "JENKINS_URL"value: "http://jenkins-service.jenkins-k8s.svc.cluster.local:8080/"image: "172.16.80.140/jenkins/jenkins.agent:v2"imagePullPolicy: "IfNotPresent"name: "jnlp"resources: {}securityContext:privileged: truetty: truevolumeMounts:- mountPath: "/home/jenkins/.kube"name: "volume-1"readOnly: false- mountPath: "/etc/docker/daemon.json"name: "volume-4"readOnly: false- mountPath: "/usr/bin/kubectl"name: "volume-3"readOnly: false- mountPath: "/usr/bin/docker"name: "volume-2"readOnly: false- mountPath: "/run/docker.sock"name: "volume-0"readOnly: false- mountPath: "/home/jenkins/agent"name: "workspace-volume"readOnly: falseworkingDir: "/home/jenkins/agent"hostNetwork: falsenodeSelector:kubernetes.io/os: "linux"restartPolicy: "Never"serviceAccountName: "jenkins-k8s-sa"volumes:- hostPath:path: "/run/docker.sock"name: "volume-0"- hostPath:path: "/usr/bin/docker"name: "volume-2"- hostPath:path: "/root/.kube"name: "volume-1"- emptyDir:medium: ""name: "workspace-volume"- hostPath:path: "/etc/docker/daemon.json"name: "volume-4"- hostPath:path: "/usr/bin/kubectl"name: "volume-3"Running on test-p2tjd in /home/jenkins/agent/workspace/jenkins-harbor
[Pipeline] {
[Pipeline] stage
[Pipeline] { (第1步:从gitee上下载源代码)
[Pipeline] git
The recommended git tool is: NONE
No credentials specified
Cloning the remote Git repository
Cloning repository https://gitee.com/akang007/jenkins-sample> git init /home/jenkins/agent/workspace/jenkins-harbor # timeout=10
Fetching upstream changes from https://gitee.com/akang007/jenkins-sample> git --version # timeout=10> git --version # 'git version 2.39.5'> git fetch --tags --force --progress -- https://gitee.com/akang007/jenkins-sample +refs/heads/*:refs/remotes/origin/* # timeout=10> git config remote.origin.url https://gitee.com/akang007/jenkins-sample # timeout=10> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
Checking out Revision df755ee1bbcf162fbfb6cadf8bb008039d6ccbb6 (refs/remotes/origin/master)
Commit message: "update smtp.py."> git rev-parse refs/remotes/origin/master^{commit} # timeout=10> git config core.sparsecheckout # timeout=10> git checkout -f df755ee1bbcf162fbfb6cadf8bb008039d6ccbb6 # timeout=10> git branch -a -v --no-abbrev # timeout=10> git checkout -b master df755ee1bbcf162fbfb6cadf8bb008039d6ccbb6 # timeout=10> git rev-list --no-walk df755ee1bbcf162fbfb6cadf8bb008039d6ccbb6 # timeout=10
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ git rev-parse --short HEAD
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (第2步:基于dockerfile文件制作镜像)
[Pipeline] sh
+ docker build -t 172.16.80.140/jenkins-demo/jenkins-demo:df755ee .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.Install the buildx component to build images with BuildKit:https://docs.docker.com/go/buildx/Sending build context to Docker daemon  245.2kBStep 1/5 : FROM golang:1.10.4-alpine---> bd36346540f3
Step 2/5 : ADD . /go/src/app---> ffc6aa5f3db2
Step 3/5 : WORKDIR /go/src/app---> Running in 9823c707df6a---> Removed intermediate container 9823c707df6a---> 8de16f4e2759
Step 4/5 : RUN  go build -v -o /go/src/app/jenkins-app---> Running in 8383ac606d62
[91mapp
[0m ---> Removed intermediate container 8383ac606d62---> c56dc76e52d1
Step 5/5 : CMD ["./jenkins-app"]---> Running in a9cfa67f329d---> Removed intermediate container a9cfa67f329d---> de8f85fff5b3
Successfully built de8f85fff5b3
Successfully tagged 172.16.80.140/jenkins-demo/jenkins-demo:df755ee
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (第3步:把镜像上传到harbor私有仓库)
[Pipeline] withCredentials
Masking supported pattern matches of $dockerHubPassword
[Pipeline] {
[Pipeline] sh
Warning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.Affected argument(s) used the following variable(s): [dockerHubPassword]See https://jenkins.io/redirect/groovy-string-interpolation for details.
+ docker login 172.16.80.140 -u admin -p ****
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
[Pipeline] sh
+ docker push 172.16.80.140/jenkins-demo/jenkins-demo:df755ee
The push refers to repository [172.16.80.140/jenkins-demo/jenkins-demo]
4a8fd9bc91b9: Preparing
67781d6fba74: Preparing
ac1c7fa88ed0: Preparing
cc5fec2c1edc: Preparing
93448d8c2605: Preparing
c54f8a17910a: Preparing
df64d3292fd6: Preparing
c54f8a17910a: Waiting
df64d3292fd6: Waiting
93448d8c2605: Layer already exists
c54f8a17910a: Layer already exists
ac1c7fa88ed0: Layer already exists
cc5fec2c1edc: Layer already exists
df64d3292fd6: Layer already exists
67781d6fba74: Pushed
4a8fd9bc91b9: Pushed
df755ee: digest: sha256:6c80d0f4d2c2bb82ebb3286b874c21b1917ef381e348bcc600b05d5e7dbf899a size: 1785
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (第4步:把pod部署到开发环境)
[Pipeline] sh
+ sed -i s/<BUILD_TAG>/df755ee/ k8s-dev-harbor.yaml
[Pipeline] sh
+ sed -i s/<BRANCH_NAME>/null/ k8s-dev-harbor.yaml
[Pipeline] sh
+ kubectl apply -f k8s-dev-harbor.yaml --validate=false
deployment.apps/jenkins-demo created
service/demo created
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (第5步:把pod部署到测试环境)
[Pipeline] input
Input requested
Approved by admin
[Pipeline] echo
This is a deploy step to YES
[Pipeline] sh
+ sed -i s/<BUILD_TAG>/df755ee/ k8s-qa-harbor.yaml
[Pipeline] sh
+ sed -i s/<BRANCH_NAME>/null/ k8s-qa-harbor.yaml
[Pipeline] sh
+ kubectl apply -f k8s-qa-harbor.yaml --validate=false
deployment.apps/jenkins-demo created
service/demo created
[Pipeline] sh
+ sleep 6
[Pipeline] sh
+ kubectl get pods -n qatest
NAME                            READY   STATUS    RESTARTS   AGE
jenkins-demo-56fd75f4db-5nbst   1/1     Running   0          8s
[Pipeline] sh
+ cd /home/jenkins/agent/workspace/jenkins-harbor
[Pipeline] sh
+ /root/Python-3.12.5/python qatest.py
邮件发送成功!
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (第6步:pod部署到生产环境)
[Pipeline] input
Input requested
Approved by admin
[Pipeline] echo
This is a deploy step to YES
[Pipeline] sh
+ sed -i s/<BUILD_TAG>/df755ee/ k8s-prod-harbor.yaml
[Pipeline] sh
+ sed -i s/<BRANCH_NAME>/null/ k8s-prod-harbor.yaml
[Pipeline] sh
+ cat k8s-prod-harbor.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: jenkins-demonamespace: production
spec:replicas: 1selector:matchLabels:app: jenkins-demotemplate:metadata:labels:app: jenkins-demospec:containers:- image: 172.16.80.140/jenkins-demo/jenkins-demo:df755eeimagePullPolicy: IfNotPresentname: jenkins-demoenv:- name: branchvalue: null
---
apiVersion: v1
kind: Service
metadata:name: jenkins-demonamespace: production
spec:selector:app: jenkins-demotype: NodePortports:- port: 18888targetPort: 18888nodePort: 31890
[Pipeline] sh
+ kubectl apply -f k8s-prod-harbor.yaml --record --validate=false
Flag --record has been deprecated, --record will be removed in the future
deployment.apps/jenkins-demo created
service/jenkins-demo created
[Pipeline] sh
+ cd /home/jenkins/agent/workspace/jenkins-harbor
[Pipeline] sh
+ /root/Python-3.12.5/python smtp.py
邮件发送成功!
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Jenkins 中文社区
REST API
Jenkins 2.426.3

开发、测试、生产三个环境都部署了pod和svc,均可以通过访问ip+port的方式访问
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
收到邮件
在这里插入图片描述

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

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

相关文章

SylixOS 中 select 原理及使用分析

1、select接口简介 1.1 select接口使用用例 select 是操作系统多路 I/O 复用技术实现的方式之一。 select 函数允许程序监视多个文件描述符&#xff0c;等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指&#xff1a;文件描述符不再是阻塞状…

Spring WebFlux之ServerWebExchange

ServerWebExchange 是 Spring WebFlux 中的一个核心接口&#xff0c;用于表示服务器端处理的 HTTP 请求和响应。它封装了请求和响应的所有信息&#xff0c;并提供了相应的方法来操作这些信息。ServerWebExchange 在响应式编程模型中扮演着关键角色&#xff0c;支持非阻塞、异步…

Flutter 常见错误和坑

1. 状态管理问题 StatefulWidget 生命周期误用 // 错误&#xff1a;在 build 方法中修改状态 override Widget build(BuildContext context) {setState(() { counter; }); // 会导致无限重建循环return Text($counter); }// 正确&#xff1a;在事件处理中修改状态 Widget bui…

C++智能指针万字详细讲解(包含智能指针的模拟实现)

在笔试&#xff0c;面试中智能指针经常出现&#xff0c;如果你对智能指针的作用&#xff0c;原理&#xff0c;用法不了解&#xff0c;那么可以看看这篇博客讲解&#xff0c;此外本博客还简单模拟实现了各种指针&#xff0c;在本篇的最后还应对面试题对智能指针的知识点进行了拓…

【Go】Go语言结构体笔记

整体介绍 虽然 Go 语言不是传统意义上的面向对象语言&#xff0c;但它提供了结构体&#xff08;struct&#xff09;来组织数据&#xff0c;并且可以为结构体绑定方法&#xff0c;从而达到面向对象的部分效果。 关键知识点包括&#xff1a; 结构体定义与实例化 定义结构体时使用…

Three.js 快速入门教程【十八】射线拾取模型——鼠标点击屏幕选中模型或物体

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

Object.defineProperty()Proxy详解(Vue23数据劫持实现)

底层原理&#x1f447;&#x1f3ff; 总结一下&#xff0c;结构应该包括&#xff1a; 1. 方法的基本作用和参数。 2. 数据描述符和存取描述符的区别。 3. 属性定义的内部处理流程。 4. 在Vue中的应用实例。 5. 常见错误和正确实践。 每个部分都要结合搜索结果的信息&…

MySQL 进阶语法:函数、约束、多表查询、事务

目录 一、MySQL 常用函数 1. 字符串函数 1.1 基本字符串操作 1.2 字符串截取与处理 1.3 字符串搜索与替换 2. 数值函数 2.1 基本数学运算 2.2 数学计算 2.3 随机数与符号 3. 日期时间函数 3.1 获取当前时间 3.2 日期时间计算 3.3 日期时间提取 3.4 日期时间格式化…

第 12 章(番外)| Solidity 安全前沿趋势 × 审计生态 × 职业路径规划

&#x1f310; 第 12 章&#xff08;番外&#xff09;| Solidity 安全前沿趋势 审计生态 职业路径规划 ——做得了审计&#xff0c;也接得了项目&#xff0c;走进 Web3 安全工程师的职业实战地图 ✅ 本章导读 Solidity 安全&#xff0c;不只是代码安全、业务安全、审计安全…

1、pytest基本用法

目录 先给大家分享下学习资源 1. 安装pytest 2. 编写用例规则 3. 执行用例 最近在学习pytest的用法 并且用这套框架替换了原来的unittest&#xff0c; 同是测试框架 确实感觉到pytest更加便捷 这边分享给大家我得学习心得 先给大家分享下学习资源 1 官方文档 pytest 官方…

【sylar-webserver】5 协程调度模块

文章目录 设计思路三种协程的切换 协程调度模块&#xff0c;需要把前面的线程模块和协程模块结合使用 ~ 设计思路 构造函数定义 线程池 基本信息。start()&#xff0c;创建线程池&#xff0c;每个线程创建都执行 run()。每个线程在 run() 里&#xff0c;查找任务队列 m_tasks…

Go 语言规范学习(1)

文章目录 IntroductionNotation示例&#xff08;Go 语言的 if 语句&#xff09;&#xff1a; Source code representationCharacters例子&#xff1a;变量名可以是中文 Letters and digits Lexical elementsCommentsTokensSemicolons例子&#xff1a;查看程序所有的token Ident…

探索抓包利器ProxyPin,实现手机APP请求抓包,支持https请求

以下是ProxyPin的简单介绍&#xff1a; - ProxyPin是一个开源免费HTTP(S)流量捕获神器&#xff0c;支持 Windows、Mac、Android、IOS、Linux 全平台系统- 可以使用它来拦截、检查并重写HTTP(S)流量&#xff0c;支持捕获各种应用的网络请求。ProxyPin基于Flutter开发&#xff0…

深度学习3-pytorch学习

深度学习3-pytorch学习 Tensor 定义与 PyTorch 操作 1. Tensor 定义&#xff1a; Tensor 是 PyTorch 中的数据结构&#xff0c;类似于 NumPy 数组。可以通过不同方式创建 tensor 对象&#xff1a; import torch# 定义一个 1D Tensor x1 torch.Tensor([3, 4])# 定义一个 Fl…

深入浅出Spring-Boot-3.x.pdf

通过网盘分享的文件&#xff1a;深入浅出Spring-Boot-3.x.pdf 链接: https://pan.baidu.com/s/10ZkhmeIXphEwND9Rv4EBlg?pwduatm 提取码: uatm

springboot启动事件CommandLineRunner使用

什么是CommandRunner CommandRunner是springboot启动完成时会调用的一个runner 启动参数会传递到这个runner 我们能用来做一些初始化工作和缓存预热等工作 ApplicationRunner VS CommandRunner? 这两个Runner作用一样 只是得到的启动参数格式不一样 前者是一个Argument对象…

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具&#xff0c;而 TensorBoardX 是其社区驱动的替代品&#xff0c;支持 PyTorch 等其他框架。以下是它…

蓝桥杯C++基础算法-多重背包

这段代码实现了一个多重背包问题的动态规划解法。多重背包问题与完全背包问题类似&#xff0c;但每个物品有其数量限制。以下是代码的详细思路解析&#xff1a; 1. 问题背景 给定 n 个物品&#xff0c;每个物品有其体积 v[i]、价值 w[i] 和数量 s[i]&#xff0c;以及一个容量为…

【SUNO】【AI作词】【提示词】

仿写歌词提示词模板&#xff08;升级版&#xff09; 一、仿写目标 风格定位 音乐风格&#xff1a; [填写目标风格&#xff0c;如&#xff1a;民谣/流行/古风/电子/爵士等]参考案例&#xff1a;如《成都》的叙事民谣&#xff0c;《孤勇者》的励志流行。 情感基调&#xff1a; […

26考研——树与二叉树_树与二叉树的应用(5)

408答疑 文章目录 三、树与二叉树的应用哈夫曼树和哈夫曼编码哈夫曼树的定义概念带权路径长度&#xff08;WPL&#xff09;计算示例分析 哈夫曼树的构造算法描述哈夫曼树的性质示例 哈夫曼编码Huffman树的编码规则Huffman树的构建过程前缀编码前缀编码的分析及应用 Huffman树的…