背景
笔者在搭建 KubeSphere 集群时,发现 KubeSphere 控制台提供了内置的 DevOps 可视化工具,可以快速搭建 CI/CD 流水线。因官方文档没有详细说明,笔者决定通过实践的方式来研究 KubeSphere DevOps。
目标
探索 KubeSphere DevOps 能否满足研发团队的 CI/CD 需求。
步骤
创建 DevOps 项目
在 工作台 > 项目 > 流水线 创建您的应用。

选择流水线,KubeSphere 提供了单分支和多分支构建方式。

设置构建参数和触发器规则。

编辑流水线

KubeSphere 的可视化界面不是特别完善,笔者经过调试后,编写下面的脚本。如果您熟悉 Jenkinsfile 的语法,可以直接在流水线编辑界面中编写 Jenkinsfile。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| pipeline { agent { node { label 'maven' }
} stages { stage('Git Checkout') { agent none steps { git(url: 'https://git.code.tencent.com/demo/$APP_NAME', credentialsId: 'git-code', branch: '$BRANCH_NAME', changelog: true, poll: false) } }
stage('Maven Package') { agent none steps { container('maven') { withCredentials([ usernamePassword( credentialsId: 'maven-releases', usernameVariable: 'MAVEN_RELEASES_USERNAME' , passwordVariable: 'MAVEN_RELEASES_PASSWORD' ), usernamePassword( credentialsId: 'maven-snapshots', usernameVariable: 'MAVEN_SNAPSHOTS_USERNAME' , passwordVariable: 'MAVEN_SNAPSHOTS_PASSWORD' ) ]) { withEnv([ "MAVEN_RELEASES_ID=${MAVEN_RELEASES_ID}", "MAVEN_RELEASES_URL=${MAVEN_RELEASES_URL}", "MAVEN_RELEASES_USERNAME=${MAVEN_RELEASES_USERNAME}", "MAVEN_RELEASES_PASSWORD=${MAVEN_RELEASES_PASSWORD}", "MAVEN_SNAPSHOTS_ID=${MAVEN_SNAPSHOTS_ID}", "MAVEN_SNAPSHOTS_URL=${MAVEN_SNAPSHOTS_URL}", "MAVEN_SNAPSHOTS_USERNAME=${MAVEN_SNAPSHOTS_USERNAME}", "MAVEN_SNAPSHOTS_PASSWORD=${MAVEN_SNAPSHOTS_PASSWORD}" ]) { sh 'mvn -Pcoding versions:set -DnewVersion=$BUILD_VERSION package -DskipTests -s ./.coding/settings.xml' } } } } }
stage('Parallel') { parallel { stage('Maven Deploy') { agent none steps { container('maven') { withCredentials([ usernamePassword( credentialsId: 'maven-releases', usernameVariable: 'MAVEN_RELEASES_USERNAME' , passwordVariable: 'MAVEN_RELEASES_PASSWORD' ), usernamePassword( credentialsId: 'maven-snapshots', usernameVariable: 'MAVEN_SNAPSHOTS_USERNAME' , passwordVariable: 'MAVEN_SNAPSHOTS_PASSWORD' ) ]) { withEnv([ "MAVEN_RELEASES_ID=${MAVEN_RELEASES_ID}", "MAVEN_RELEASES_URL=${MAVEN_RELEASES_URL}", "MAVEN_RELEASES_USERNAME=${MAVEN_RELEASES_USERNAME}", "MAVEN_RELEASES_PASSWORD=${MAVEN_RELEASES_PASSWORD}", "MAVEN_SNAPSHOTS_ID=${MAVEN_SNAPSHOTS_ID}", "MAVEN_SNAPSHOTS_URL=${MAVEN_SNAPSHOTS_URL}", "MAVEN_SNAPSHOTS_USERNAME=${MAVEN_SNAPSHOTS_USERNAME}", "MAVEN_SNAPSHOTS_PASSWORD=${MAVEN_SNAPSHOTS_PASSWORD}" ]) { sh 'mvn -Pcoding deploy -DskipTests -s ./.coding/settings.xml' } } } } }
stage('Docker Build') { agent none steps { container('maven') { sh 'docker build -f docker/Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$BUILD_VERSION-$BUILD_NUMBER .' withCredentials([ usernamePassword( credentialsId: 'harbor-registry', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME' ) ]) { sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin' sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$BUILD_VERSION-$BUILD_NUMBER' } } } } } } } environment { APP_NAME = 'demo' BRANCH_NAME = 'dev' BUILD_VERSION = 'dev-SNAPSHOT' REGISTRY = '10.2.2.109:30003' DOCKERHUB_NAMESPACE = 'demo' MAVEN_RELEASES_ID = 'releases' MAVEN_RELEASES_URL = 'https://demo-maven.pkg.coding.net/repository/demo/releases/' MAVEN_SNAPSHOTS_ID = 'snapshots' MAVEN_SNAPSHOTS_URL = 'https://demo-maven.pkg.coding.net/repository/demo/snapshots/' } }
|
点击 运行。

查看部署日志。

多分支模式
KubeSphere 多分支不支持可视化编排,也不支持在控制台编写 Jenkinsfile,只能在项目代码中管理您的 Jenkinsfile 文件,并且,不支持变量,非常鸡肋。
笔者创建了一个名为 demo-multi-branches 的项目,指定脚本的路径为 .kubesphere/Jenkinsfile。

关于 .kubesphere/Jenkinsfile 的内容,请参考上述编写的 Jenkinsfile,将分支写死。

总结
KubeSphere DevOps 基本可以实现 CI/CD 的功能,但是功能不是很完善,单分支模式不支持 Git 事件触发流水线,只能使用 Cron 触发,多分支又不能在控制台管理,可能要等作者慢慢优化了。