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的方式访问






收到邮件

相关文章:
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步:基…...
HarmonyOS NEXT(九) :图形渲染体系
HarmonyOS NEXT(九) :图形渲染体系 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 HarmonyOS NEXT࿰…...
SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索
在数据驱动的应用开发中,基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架,提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度,系统对比分析SQLAlchemy中关键词搜索的最佳实…...
ES数据过多,索引拆分
公司企微聊天数据存储在 ES 中,虽然按照企业分储在不同的ES 索引中,但某些常用的企微主体使用量还是很大。4年中一个索引存储数据已经达到46多亿条数据,占用存储3.1tb, ES 配置 由于多一个副本,存储得翻倍,成本考虑…...
Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践
引言 在短视频、直播、影视制作等领域,视频水印是一种常见的工具,用于保护版权、提升品牌辨识度或满足合规性要求。然而,开发者在实现水印添加时往往面临以下挑战: 手动处理效率低:使用图像编辑软件(如 P…...
Python语言的游戏物理
Python语言的游戏物理 引言 在现代游戏开发中,物理引擎是一个重要的组成部分,通过模拟真实世界的物理现象,增加了游戏的沉浸感和可玩性。Python作为一种高效、易用的编程语言,虽然在性能方面不如C等语言,但其灵活性和…...
uni-app自动升级功能
效果图 一、VUE login.vue <template><view><view class"uni-common-mt"><view class"uni-flex uni-column"><view class"flex-item flex-item-V"><view class"logo"><image src"/st…...
使用AI一步一步实现若依(26)
功能26:新增一个新员工培训页面 功能25:角色管理 功能24:菜单管理 功能23:从后端获取路由/菜单数据 功能22:用户管理 功能21:使用axios发送请求 功能20:使用分页插件 功能19:集成My…...
逻辑回归(Logistic Regression)模型的概率预测函数
以二分类问题为例,常见的损失函数有 负对数似然损失(neg log-likelihood loss),交叉熵损失(cross entropy loss),deviance loss指数损失(exponential loss)。 前三者虽然名字不同,但却具有相同的表达形式。此外,neg …...
【零基础学python】python高级语法(四)
接续上面的系列文章: 【零基础学python】python基础语法(一)-CSDN博客 【零基础学python】python基础语法(二)-CSDN博客 【零基础学python】python高级语法(三)-CSDN博客 目录 2,…...
HarmonyOS 之 @Require 装饰器自学指南
在 HarmonyOS 应用开发工作中,我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里,要是无法确保必要参数在构造时准确传入,就极易引发运行时错误,而且排查起来费时费力。一次偶然的机会,我接触到了 Require 装饰…...
Redis Cluster 详解
Redis Cluster 详解 1. 为什么需要 Redis Cluster? Redis 作为一个高性能的内存数据库,在单机模式下可能会遇到以下问题: 单机容量受限:Redis 是基于内存存储的,单机的内存资源有限,单实例的 Redis 只能…...
基于CNN的FashionMNIST数据集识别6——ResNet模型
前言 之前我们在cnn已经搞过VGG和GoogleNet模型了,这两种较深的模型出现了一些问题: 梯度传播问题 在反向传播过程中,梯度通过链式法则逐层传递。对于包含 L 层的网络,第 l 层的梯度计算为: 其中 a(k) 表示第 k层的…...
0323-B树、B+树
多叉树---->B树(磁盘)、B树 磁盘由多个盘片组成,每个盘片分为多个磁道和扇区。数据存储在这些扇区中,扇区之间通过指针链接,形成链式结构。 内存由连续的存储单元组成,每个单元有唯一地址,数…...
深度学习3-pytorch学习
深度学习3-pytorch学习 Tensor 定义与 PyTorch 操作 1. Tensor 定义: Tensor 是 PyTorch 中的数据结构,类似于 NumPy 数组。可以通过不同方式创建 tensor 对象: import torch# 定义一个 1D Tensor x1 torch.Tensor([3, 4])# 定义一个 Fl…...
【工作记录】F12查看接口信息及postman中使用
可参考 详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)_f12查看接口及参数-CSDN博客 1、接口信息 接口基础知识2:http通信的组成_接口请求信息包括-CSDN博客 HTTP类型接口之请求&响应详解 - 三叔测试笔记…...
正则表达式-万能表达式
1、正则 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找 出满足你想要的格式的句子. {“basketId”: 0, “count”: 1, “prodId”: #prodId#, “shopId”: 1, “skuId”: #skuId#} #prodId# re相关的文章: https://www.cnblogs.com/Simple-S…...
2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现: 人的大脑结构非常复杂,内部交织密布着神经和血管,所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术,通常需要…...
Android 12系统源码_系统启动(二)Zygote进程
前言 Zygote(意为“受精卵”)是 Android 系统中的一个核心进程,负责 孵化(fork)应用进程,以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程,后续所有…...
MOSN(Modular Open Smart Network)-05-MOSN 平滑升级原理解析
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN(Modular O…...
Flink介绍与安装
Apache Flink是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨在所有常见的集群环境中运行,以任意规模和内存级速度执行计算。 一、主要特点和功能 1. 实时流处理: 低延迟: Flink 能够以亚秒级的延迟处理数据流,非常…...
【gradio】从零搭建知识库问答系统-Gradio+Ollama+Qwen2.5实现全流程
从零搭建大模型问答系统-GradioOllamaQwen2.5实现全流程(一) 前言一、界面设计(计划)二、模块设计1.登录模块2.注册模块3. 主界面模块4. 历史记录模块 三、相应的接口(前后端交互)四、实现前端界面的设计co…...
PowerBI,用度量值实现表格销售统计(含合计)的简单示例
假设我们有产品表 和销售表 我们想实现下面的效果 表格显示每个产品的信息,以及单个产品的总销量 有一个切片器能筛选各个门店的产品销量 还有一个卡片图显示所筛选条件下,所有产品的总销量 实现方法: 1.我们新建一个计算表,把…...
Mac 常用命令
一、文件操作(必知必会) 1. 快速导航 cd ~/Documents # 进入文档目录 cd .. # 返回上级目录 pwd # 显示当前路径 2. 文件管理 touch new_file.txt # 创建空文件 mkdir -p project/{src,docs} # 递归创建目录 cp …...
26考研——查找_树形查找_二叉排序树(BST)(7)
408答疑 文章目录 三、树形查找二叉排序树(BST)二叉排序树中结点值之间的关系二叉树形查找二叉排序树的查找过程示例 向二叉排序树中插入结点插入过程示例 构造二叉排序树的过程构造示例 二叉排序树中删除结点的操作情况一:被删除结点是叶结点…...
美摄科技开启智能汽车车内互动及娱乐解决方案2.0
在科技飞速发展的今天,汽车已不再仅仅是简单的代步工具,而是逐渐演变为集出行、娱乐、社交于一体的智能移动空间。美摄科技,作为前沿视觉技术与人工智能应用的领航者,凭借其卓越的技术实力和创新精神,携手汽车行业&…...
【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式
项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…...
Vue-admin-template安装教程
#今天配置后台管理模板发现官方文档的镜像网站好像早失效了,自己稍稍总结了一下方法# 该项目环境需要node17及以下,如果npm install这一步报错可能是这个原因 git clone https://github.com/PanJiaChen/vue-admin-template.git cd vue-admin-template n…...
21.Excel自动化:如何使用 xlwings 进行编程
一 将Excel用作数据查看器 使用 xlwings 中的 view 函数。 1.导包 import datetime as dt import xlwings as xw import pandas as pd import numpy as np 2.view 函数 创建一个基于伪随机数的DataFrame,它有足够多的行,使得只有首尾几行会被显示。 df …...
LabVIEW FPGA与Windows平台数据滤波处理对比
LabVIEW在FPGA和Windows平台均可实现数据滤波处理,但两者的底层架构、资源限制、实时性及应用场景差异显著。FPGA侧重硬件级并行处理,适用于高实时性场景;Windows依赖软件算法,适合复杂数据处理与可视化。本文结合具体案例&#x…...
