背景

依据官方文档java应用的案例,记录下在kubesphere上,构建python单体应用的CICD流程。

简介

流程一共分为以下四个步骤:

  1. 拉取代码
  2. 代码扫描
  3. 构建镜像&推送到仓库
  4. 部署

准备工作

环境准备

在kubesphere上安装devops,并配置好sonarqube,添加jenkins agent。

启用devops:https://kubesphere.com.cn/doc...
配置sonarqube:https://kubesphere.com.cn/doc...
添加jenkins agent:https://segmentfault.com/a/11...

项目准备

创建一个新工程,以单体flask应用为例,需要包含以下文件。
├── Dockerfile # 镜像构建文件
├── deploy
│ ├── dev # dev环境部署文件
│ └── pro # pro环境部署文件
└── tests

创建企业空间、账号、项目

在kubesphere中,权限分为平台、企业空间、项目级别。平台是对kubesphere的权限,企业空间对应团队。对于运维人员,在平台级别设置相应的权限;对于开发测试人员,先邀请到企业空间内,再根据项目分配相应的权限。

点击右上角的【平台管理】,选择【访问控制】,进入【账号管理】,创建一个账号,角色设置为platform-regular
image.png

进入【企业空间】,创建一个企业空间。
image.png

点击新建的企业空间,进入【企业空间设置】-【企业成员】,邀请新建的用户,并设置角色为demo-workspace-self-provisioner
image.png

点击右上角的【平台管理】,选择【集群管理】,进入【项目管理】,创建一个项目,分配到企业空间,设置项目管理员。
image.png

此处的项目名称对应k8s中的namespace。

步骤

创建devops工程

使用新用户登录kubesphere。

按【F1】,选择企业空间。

image.png

【F1】查看历史记录,来快速切换资源。

进入【DevOps工程】,创建一个工程。

image.png

点击工程,进入工程内部。

image.png

进入【工程管理】-【凭证】,创建代码仓库(如图gitlab-account)、镜像仓库(如图harbor-id)、sonar(如图sonar-token)、k8s集群相关凭证。

image.png

其中gitlab和harbor的凭证都采用账号密码类型,k8s集群的凭证类型为kubeconfig,sonar的凭证为秘密文本,需要登录sonar,生成token,如下图。

image.png

进入【流水线】,创建流水线。
image.png

若代码仓库中有Jenkinsfile,则可指定代码仓库,会自动识别流水线。

编辑Jenkinsfile,如下:

pipeline {
  agent {
    node {
      label 'general'
    }
  }
  environment {
    GITHUB_CREDENTIAL_ID = 'github-id'
    KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    REGISTRY = 'harbor.com'
    HARBOR_PRO = 'public'
    APP_NAME = 'demo'
    SONAR_CREDENTIAL_ID = 'sonar-token'
  }
  stages {
    stage('SCM') {
      steps {
        git(url: 'you project url', credentialsId: 'gitlab-account', branch: 'dev', changelog: true, poll: false)
      }
    }
    stage('Code Analysis') {
      steps {
        container('general') {
          withCredentials([string(credentialsId : 'sonar-token' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh 'sonar-scanner -Dsonar.projectKey=$APP_NAME -Dsonar.sources=. -Dsonar.host.url=you sonar url -Dsonar.token=$SONAR_TOKEN'
            }
          }
          timeout(unit: 'HOURS', activity: true, time: 1) {
            waitForQualityGate 'true'
          }
        }
      }
    }
    stage('Build and Push') {
      steps {
        container('general') {
          sh 'docker build -f Dockerfile -t $REGISTRY/$HARBOR_PRO/$APP_NAME:SNAPSHOT-$BUILD_NUMBER .'
          withCredentials([usernamePassword(credentialsId : 'harbor-id' ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker push $REGISTRY/$HARBOR_PRO/$APP_NAME:SNAPSHOT-$BUILD_NUMBER'
          }
        }
      }
    }
    stage('Deploy to Dev') {
      steps {
        kubernetesDeploy(enableConfigSubstitution: true, deleteResource: false, kubeconfigId: 'demo-kubeconfig', configs: 'deploy/dev/**')
      }
    }
  }
}

这杯可乐有点甜
64 声望3 粉丝

研发工程师