当前位置: 首页 > news >正文

小白成长之路-jenkins使用pipline部署

初始化远程仓库

拉取空仓库

生成代码

上传代码 

Git的暂存区

Git的本地仓库

git的远程仓库

问题

原因是你尝试推送代码到远程仓库的主分支(master),但此时远程仓库的主分支正处于被检出(checked out) 状态,也就是说远程仓库那边有人正在使用这个分支进行工作 

解决

在远程仓库设置

允许直接向远程仓库当前正在检出(checked out)的分支推送代码,绕过 Git 默认的安全限制

or 

推送新的内容

jenkinsl连接k8集群 

 Kubernetes 云配置

下载插件

创建新项目

  1. kubectl cluster-info
  2. ## 查看K8S集群信息
  3. crt=$(cat /etc/kubernetes/admin.conf | awk -F: '/certificate-authority-data/{print $2}' | tr -d ' ')
  4. ## 将证书赋给crt变量
  5. echo $crt | base64 -d
  6. ## 解密证书
AI优化运行代码

获取解密证书

创建连接账户 

kubectl create sa jenkins
AI优化运行代码

创建role角色
  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: default
  5. name: pod-reader-role
  6. rules:
  7. - apiGroups: [""]
  8. resources: ["pods"]
  9. verbs: ["get", "list", "watch","create","update","delete"]
AI优化运行代码

添加bindroling绑定
  1. kind: RoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: default
  5. name: pod-reader-role-binding
  6. subjects:
  7. - kind: ServiceAccount
  8. name: jenkins
  9. namespace: default
  10. roleRef:
  11. kind: Role
  12. name: pod-reader-role
  13. apiGroup: rbac.authorization.k8s.io
AI优化运行代码

  1. kubectl describe rolebinding pod-reader-role-binding -n default
  2. ##查看绑定关系是否建立
  3. kubectl auth can-i get pods -n default --as=system:serviceaccount:default:jenkins
  4. ##验证是否有读取 Pod 的权限
AI优化运行代码

生成token凭证

有效期为1h

kubectl -n default create token jenkins
AI优化运行代码

添加凭证 

添加jenkins地址

部署discuz论坛

  1. cat /var/lib/jenkins/mysql-svc.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: mysql-svc
  6. namespace: default
  7. spec:
  8. selector:
  9. app: mysql
  10. ports:
  11. - port: 3306
  12. targetPort: 3306
  13. clusterIP: None # 无头服务,Pod 可直接通过服务名访问
AI优化运行代码
  1. cat /var/lib/jenkins/mysql-deploy.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: mysql
  6. namespace: default
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: mysql
  12. template:
  13. metadata:
  14. labels:
  15. app: mysql
  16. spec:
  17. containers:
  18. - name: mysql
  19. image: mysql:5.7 # 官网镜像
  20. ports:
  21. - containerPort: 3306
  22. env:
  23. - name: MYSQL_ROOT_PASSWORD
  24. value: "123.com" # root 密码
  25. - name: MYSQL_DATABASE
  26. value: "discuz" # 预创建数据库
  27. - name: MYSQL_USER
  28. value: "discuz" # 专用用户
  29. - name: MYSQL_PASSWORD
  30. value: "123.com" # 用户密码
  31. volumeMounts:
  32. - name: mysql-data
  33. mountPath: /var/lib/mysql
  34. - name: init-script
  35. mountPath: /docker-entrypoint-initdb.d # MySQL 初始化脚本目录
  36. volumes:
  37. - name: mysql-data
  38. emptyDir: {} # 非持久化存储
  39. - name: init-script
  40. configMap:
  41. name: mysql-init-script # 引用初始化脚本的 ConfigMap
  42. ---
  43. # 创建 MySQL 初始化脚本的 ConfigMap
  44. apiVersion: v1
  45. kind: ConfigMap
  46. metadata:
  47. name: mysql-init-script
  48. namespace: default
  49. data:
  50. init.sql: |
  51. # 授权 discuz 用户访问 discuz 数据库(可选,增强权限控制)
  52. GRANT ALL PRIVILEGES ON discuz.* TO 'discuz'@'%' IDENTIFIED BY '123.com';
  53. FLUSH PRIVILEGES;
AI优化运行代码
  1. cat /var/lib/jenkins/discuz-deploy.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: discuz
  6. namespace: default
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: discuz
  12. template:
  13. metadata:
  14. labels:
  15. app: discuz
  16. spec:
  17. containers:
  18. - name: discuz
  19. image: php:7.4-apache # 官网 PHP+Apache 镜像
  20. ports:
  21. - containerPort: 80
  22. volumeMounts:
  23. - name: discuz-data
  24. mountPath: /var/www/html # Apache 网站根目录
  25. # 安装 Discuz 依赖的 PHP 扩展
  26. command: ["/bin/sh", "-c"]
  27. args:
  28. - apt-get update && \
  29. apt-get install -y libmysqlclient-dev zip unzip && \
  30. docker-php-ext-install mysqli pdo pdo_mysql && \
  31. apache2-foreground
  32. volumes:
  33. - name: discuz-data
  34. emptyDir: {} # 非持久化存储
AI优化运行代码

安装kubectl命令

拷贝证书到 jenkins用户

检测

编写 pipeline 

使用构建wezzer平台的镜像 

pipeline {
agent any

environment {
// 定义Kubernetes相关环境变量
K8S_MASTER = "192.168.11.10"
POD_NAME = "lnmp-pod"
NAMESPACE = "wezzer"
CONTAINER_PORT = "80"
NODE_PORT = "30080"
IMAGE_NAME = "lnmp:1"
}

stages {
stage('部署到Kubernetes') {
steps {
script {
echo "部署 ${POD_NAME} 到Kubernetes集群..."

// 创建部署的YAML内容
def deploymentYaml = """
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${POD_NAME}
namespace: ${NAMESPACE}
spec:
replicas: 1
selector:
matchLabels:
app: ${POD_NAME}
template:
metadata:
labels:
app: ${POD_NAME}
spec:
containers:
- name: ${POD_NAME}
image: ${IMAGE_NAME}
imagePullPolicy: Never
ports:
- containerPort: ${CONTAINER_PORT}
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
"""
writeFile file: 'deployment.yaml', text: deploymentYaml
sh 'cat deployment.yaml'
sh "kubectl apply -f deployment.yaml -n ${NAMESPACE}"

// 创建Service
def serviceYaml = """
apiVersion: v1
kind: Service
metadata:
name: ${POD_NAME}-service
namespace: ${NAMESPACE}
spec:
selector:
app: ${POD_NAME}
type: NodePort
ports:
- port: ${CONTAINER_PORT}
targetPort: ${CONTAINER_PORT}
nodePort: ${NODE_PORT}
"""
writeFile file: 'service.yaml', text: serviceYaml
sh 'cat service.yaml'
sh "kubectl apply -f service.yaml -n ${NAMESPACE}"
}
}
}

stage('验证部署') {
steps {
script {
echo "验证部署状态..."
sh """
echo "等待Pod就绪..."
kubectl wait --for=condition=ready pod -l app=${POD_NAME} -n ${NAMESPACE} --timeout=300s

echo "部署状态:"
kubectl get deployments ${POD_NAME} -n ${NAMESPACE}

echo "Pod状态:"
kubectl get pods -l app=${POD_NAME} -n ${NAMESPACE}

echo "Service状态:"
kubectl get service ${POD_NAME}-service -n ${NAMESPACE}

echo "部署成功! 访问地址: http://${K8S_MASTER}:${NODE_PORT}"
"""
}
}
}
}

post {
failure {
echo "部署失败!"
}
success {
echo "部署成功! 服务已通过30080端口暴露"
}
}
}

访问


文章转载自:

http://sxUCU1Bk.fkmrj.cn
http://YRACwBiB.fkmrj.cn
http://MVACM27Q.fkmrj.cn
http://8s3B24Gr.fkmrj.cn
http://zgH2FZcf.fkmrj.cn
http://D6ULGtLS.fkmrj.cn
http://eWgtRrbi.fkmrj.cn
http://hWmaXeVF.fkmrj.cn
http://0VI1qC0W.fkmrj.cn
http://zvWCocm9.fkmrj.cn
http://RoSNVmVe.fkmrj.cn
http://F050MEYX.fkmrj.cn
http://zOaXufZN.fkmrj.cn
http://WGXOuGdN.fkmrj.cn
http://9GvVNqhj.fkmrj.cn
http://td3i9CEs.fkmrj.cn
http://BXYbPEJp.fkmrj.cn
http://DydSMSI7.fkmrj.cn
http://RITKlZap.fkmrj.cn
http://h1wMtIGs.fkmrj.cn
http://Ojvgyeoo.fkmrj.cn
http://99cs5XeI.fkmrj.cn
http://IJ7pRgwD.fkmrj.cn
http://tbNdpX51.fkmrj.cn
http://lx0J9Brc.fkmrj.cn
http://LnaiAsfu.fkmrj.cn
http://dpTWRQSr.fkmrj.cn
http://olC4EGI3.fkmrj.cn
http://3xT3Omm4.fkmrj.cn
http://wEAZgknW.fkmrj.cn
http://www.dtcms.com/a/374484.html

相关文章:

  • Elasticsearch面试精讲 Day 15:索引别名与零停机更新
  • vscode中使用git、githup的基操
  • Elasticsearch面试精讲 Day 12:数据建模与字段类型选择
  • 【Visual Studio 2017 和 2019下载】
  • 领码方案·AI狂潮:3天极速塑造高可用电商核心架构——从需求到上线,用智能驱动架构革新,打造可扩展、可维护、可复用的电商系统新范式
  • SpringCloud gateway配置predicates的匹配规则
  • Win系统下配置PCL库第一步之下载Visual Studio和Qt 5.15.2(超详细)
  • 腾讯云负载均衡增加访问策略后访问失败
  • 【Java EE进阶 --- SpringBoot】Spring DI详解
  • 内存中读写文件:设计原理与C/C++实现
  • 光场显微镜及其在三维生物成像中的应用
  • 基于FPGA的实时图像处理系统(3)——实时视频显示
  • 【慢教程】Ollama4:ollama命令汇总
  • 当医疗健康遇见RWA:区块链技术如何重塑医疗资产的未来
  • 【内存管理】6.6内核 - Vmalloc机制 - __purge_vmap_area_lazy
  • 第3周 机器学习课堂记录
  • 机器学习、深度学习与大模型:技术选型的思考与实战指南
  • 深度学习(四):数据集划分
  • Python最新的好用技巧和特性总结
  • 看不见的安全防线:信而泰仪表如何验证零信任有效性
  • PyQt 界面布局与交互组件使用指南
  • 资产 OCR 识别:批量导入效率提升指南
  • 萝卜切丁机 机构笔记
  • Java学习笔记三(封装)
  • 使用云手机能否给企业降本增效
  • Linux笔记---进程间关系与守护进程
  • 详细:虚拟机 + Linux 环境搭建 + Oracle 11.2.0 EE 安装全流程
  • 思利普科技:用BCG心冲击技术重新定义睡眠监测,掀起床垫行业智能化革命
  • 2025世界智博会,揭幕AI触手可及的科幻生活
  • 探索 CSS 3D 属性:从基础到炫酷动画案例