背景
依据官方文档java应用的案例,记录下在kubesphere上,构建python单体应用的CICD流程。
简介
流程一共分为以下四个步骤:
- 拉取代码
- 代码扫描
- 构建镜像&推送到仓库
- 部署
准备工作
环境准备
在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
。
进入【企业空间】,创建一个企业空间。
点击新建的企业空间,进入【企业空间设置】-【企业成员】,邀请新建的用户,并设置角色为demo-workspace-self-provisioner
。
点击右上角的【平台管理】,选择【集群管理】,进入【项目管理】,创建一个项目,分配到企业空间,设置项目管理员。
此处的项目名称对应k8s中的namespace。
步骤
创建devops工程
使用新用户登录kubesphere。
按【F1】,选择企业空间。
【F1】查看历史记录,来快速切换资源。
进入【DevOps工程】,创建一个工程。
点击工程,进入工程内部。
进入【工程管理】-【凭证】,创建代码仓库(如图gitlab-account)、镜像仓库(如图harbor-id)、sonar(如图sonar-token)、k8s集群相关凭证。
。
其中gitlab和harbor的凭证都采用账号密码类型,k8s集群的凭证类型为kubeconfig,sonar的凭证为秘密文本,需要登录sonar,生成token,如下图。
进入【流水线】,创建流水线。
若代码仓库中有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/**')
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。