GitLab + Jenkins +Sonar Qube+docker+Harbor+ Kubernetes 实现 CI/CD 全流程

GitLab + Jenkins + Kubernetes 实现 CI/CD 全流程

将 GitLab、Jenkins 和 Kubernetes 结合实现 CI/CD 流程,能够充分发挥各自优势:GitLab 提供代码托管和版本控制,Jenkins 作为自动化构建工具,Kubernetes 提供弹性部署环境。

架构设计

GitLab 作为代码仓库和触发源,通过 Webhook 触发 Jenkins 流水线。Jenkins 负责构建、测试并将镜像推送至镜像仓库(如 GitLab Container Registry)。Kubernetes 接收部署指令,拉取镜像并创建 Pod。

graph LR
    A[GitLab代码提交] --> B[Jenkins流水线]
    B --> C[构建Docker镜像]
    C --> D[推送至镜像仓库]
    D --> E[Kubernetes部署]

环境配置

安装并配置必要的工具和插件:

  • GitLab Runner 注册到 GitLab
  • Jenkins 安装 GitLab 和 Kubernetes 插件
  • kubectl 配置 Jenkins 对 Kubernetes 集群的访问权限
# 示例:kubectl 配置
kubectl config set-cluster k8s --server=https://kubernetes.default.svc
kubectl config set-credentials jenkins --token=<service-account-token>

Jenkins 流水线配置

创建 Jenkinsfile 定义完整的 CI/CD 流程,包括构建、测试、打包和部署阶段。使用声明式流水线语法增强可读性。

pipeline {
    agent any

    environment {
        sonarLogin = '2bab7bf7d5af25e2c2ca2f178af2c3c55c64d5d8'
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborHost = '192.168.11.12:8888'
        harborRepo = 'repository'
    }

    stages {
        stage('拉取Git代码'){
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/lsx.git']]])
            }
        }
        stage('Maven构建代码'){
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
            }
        }
        stage('SonarQube检测代码'){
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=${sonarLogin}'
            }
        }
        stage('自动化测试脚本'){
            steps {
                sh 'pip install -r requ.txt'
                sh 'pytest run.py'

            }
        }

        stage('制作自定义镜像'){
            steps {
                sh '''cd docker
                mv ../target/*.jar ./
                docker build -t ${JOB_NAME}:$tag .
                '''
            }
        }

        stage('推送自定义镜像'){
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborHost}
                docker tag ${JOB_NAME}:$tag ${harborHost}/${harborRepo}/${JOB_NAME}:$tag
                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:$tag'''
            }
        }

        stage('通知目标服务器'){
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-docker', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }  
        }
       stage('远程执行kubectl命令')
        {
            sh '''ssh root@ 192.1.1.2 kubectl apply -f /usr/k8s/pipeline.yml
                    kubectl rollout restart deployment pipeline -n test'''
        }

    }
    post {
        success {
            dingtalk (
                robot: 'Jenkins-DingDing',
                type:'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        failure {
            dingtalk (
                robot: 'Jenkins-DingDing',
                type:'MARKDOWN',
                title: "fail: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}

Kubernetes 部署文件

准备 Kubernetes 部署文件定义应用规格,包括 Deployment 和 Service 资源。使用 ConfigMap 和 Secret 管理配置和敏感信息。

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline    
    spec:
      containers:
      - name: pipeline
        image: 192.168.11.102:80/repo/pipeline:v4.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  labels:
    app: pipeline
  name: pipeline  
spec:
  selector:
    app: pipeline
  ports:
  - port: 8081
    targetPort: 8080
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: pipeline
spec:
  ingressClassName: ingress
  rules:
  - host: mashibing.pipeline.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: pipeline
            port:
              number: 8081

GitLab 集成配置

在 GitLab 项目中设置 Webhook,将 push 事件通知 Jenkins。配置 Jenkins 的 GitLab 插件以接收这些事件并触发相应流水线。

# GitLab Webhook 示例
URL: http://jenkins.example.com/project/myapp
Trigger: Push events
Secret token: secure_token_here

安全与权限管理

配置 RBAC 确保 Jenkins 服务账户在 Kubernetes 集群中具有适当权限。限制 GitLab Runner 的执行环境以增强安全性。

# rbac.yaml 示例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: jenkins-deploy
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

监控与日志

集成 Prometheus 和 Grafana 监控部署状态和性能指标。使用 EFK 或 Loki 收集和分析日志数据。

# service-monitor.yaml 示例
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: myapp-monitor
spec:
  selector:
    matchLabels:
      app: myapp
  endpoints:
  - port: web

优化建议

使用 Kaniko 或 Buildah 在 Kubernetes 集群内直接构建镜像,避免 Docker-in-Docker 的安全隐患。考虑采用 Argo CD 实现 GitOps 工作流加强部署可观测性。

# kaniko 示例
apiVersion: batch/v1
kind: Job
metadata:
  name: kaniko
spec:
  template:
    spec:
      containers:
      - name: kaniko
        image: gcr.io/kaniko-project/executor:latest
        args: ["--dockerfile=Dockerfile",
               "--context=git://github.com/org/repo",
               "--destination=gcr.io/my-project/myapp"]

通过以上配置可实现从代码提交到生产部署的完整自动化流程,各组件分工明确又紧密集成,形成高效的 CI/CD 管道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值