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

发布于:2025-09-10 ⋅ 阅读:(22) ⋅ 点赞:(0)

初始化远程仓库

拉取空仓库

生成代码

上传代码 

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端口暴露"
        }
    }
}

访问


网站公告

今日签到

点亮在社区的每一天
去签到