构建和部署 Maven 工程
准备工作
- 您需要启用 KubeSphere DevOps 系统。
- 您需要有一个 Docker Hub 帐户。
- 您需要创建一个企业空间、一个 DevOps 工程和一个用户帐户,并需要邀请该帐户至 DevOps 工程中并赋予
operator
角色。有关更多信息,请参见创建企业空间、项目、帐户和角色。
Maven 工程的工作流
KubeSphere DevOps 中有针对 Maven 工程的工作流,如下图所示,它使用 Jenkins 流水线来构建和部署 Maven 工程。所有步骤均在流水线中进行定义。
首先,Jenkins Master 创建一个 Pod 来运行流水线。Kubernetes 创建 Pod 作为 Jenkins Master 的 Agent,该 Pod 会在流水线完成之后销毁。主要流程包括克隆代码、构建和推送镜像以及部署工作负载。
Jenkins 中的默认配置
Maven 版本
在 Maven 构建器 (Builder) 容器中执行以下命令获取版本信息。
mvn --version
Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-24T19:49:05Z)
Maven home: /opt/apache-maven-3.5.3
Java version: 1.8.0_232, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.i386/jre
Default locale: en_US, platform encoding: UTF-8
Maven 缓存
Jenkins Agent 通过节点上的 Docker 存储卷 (Volume) 挂载目录。流水线可以缓存一些特殊目录,例如 /root/.m2
,这些特殊目录用于 Maven 构建并在 KubeSphere DevOps 中用作 Maven 工具的默认缓存目录,以便依赖项包下载和缓存到节点上。
Jenkins Agent 中的全局 Maven 设置
Maven 设置的默认文件路径是 maven
,配置文件路径是 /opt/apache-maven-3.5.3/conf/settings.xml
。执行以下命令获取 Maven 的设置内容。
kubectl get cm -n kubesphere-devops-system ks-devops-agent -o yaml
Maven Pod 的网络
具有 maven
标签的 Pod 使用 docker-in-docker 网络来运行流水线,即节点中的 /var/run/docker.sock
被挂载至该 Maven 容器。
Maven 流水线示例
Maven 工程准备工作
- 确保您在开发设备上成功构建 Maven 工程。
- 添加 Dockerfile 至工程仓库以构建镜像。有关更多信息,请参考 https://github.com/kubesphere/devops-java-sample/blob/master/Dockerfile-online。
- 添加 YAML 文件至工程仓库以部署工作负载。有关更多信息,请参考 https://github.com/kubesphere/devops-java-sample/tree/master/deploy/dev-ol。如果有多个不同环境,您需要准备多个部署文件。
创建凭证
凭证 ID | 类型 | 用途 |
---|---|---|
dockerhub-id | 帐户凭证 | 仓库,例如 Docker Hub |
demo-kubeconfig | kubeconfig | 部署工作负载 |
有关详细信息,请参考凭证管理。
为工作负载创建一个项目
在本示例中,所有工作负载都部署在 kubesphere-sample-dev
项目中。您必须事先创建 kubesphere-sample-dev
项目。
为 Maven 工程创建一个流水线
在您的 DevOps 工程中,转到流水线页面并点击创建。有关更多信息,请参见使用图形编辑面板创建流水线。
转到该流水线的详情页面,点击编辑 Jenkinsfile。
复制粘贴以下内容至弹出窗口。您必须将
DOCKERHUB_NAMESPACE
的值替换为您自己的值,完成操作后进行保存。pipeline {
agent {
node {
label 'maven'
}
}
parameters {
string(name:'TAG_NAME',defaultValue: '',description:'')
}
environment {
DOCKER_CREDENTIAL_ID = 'dockerhub-id'
KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
REGISTRY = 'docker.io'
// need to replace by yourself dockerhub namespace
DOCKERHUB_NAMESPACE = 'shaowenchen'
APP_NAME = 'devops-java-sample'
BRANCH_NAME = 'dev'
}
stages {
stage ('checkout scm') {
steps {
git branch: 'master', url: "https://github.com/kubesphere/devops-java-sample.git"
}
}
stage ('unit test') {
steps {
container ('maven') {
sh 'mvn clean -o -gs `pwd`/configuration/settings.xml test'
}
}
}
stage ('build & push') {
steps {
container ('maven') {
sh 'mvn -o -Dmaven.test.skip=true -gs `pwd`/configuration/settings.xml clean package'
sh 'docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .'
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER'
}
}
}
}
stage('deploy to dev') {
steps {
kubernetesDeploy(configs: 'deploy/dev-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
}
}
}
}
保存该 Jenkinsfile,您可以看到图形编辑面板上已自动创建阶段和步骤。
运行和测试
点击运行并在
TAG_NAME
中输入内容,运行流水线。待流水线运行完成,您可以看到下图所示内容。
在
kubesphere-sample-dev
项目中,已创建新的工作负载。您可以查看服务 (Service) 的访问地址,如下所示。