最新更新:

    构建和部署 Maven 项目

    准备工作

    Maven 项目的工作流

    Kube AI Hub DevOps 中有针对 Maven 项目的工作流,如下图所示,它使用 Jenkins 流水线来构建和部署 Maven 项目。所有步骤均在流水线中进行定义。

    maven-project-jenkins

    首先,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 构建并在 Kube AI Hub DevOps 中用作 Maven 工具的默认缓存目录,以便依赖项包下载和缓存到节点上。

    Jenkins Agent 中的全局 Maven 设置

    Maven 设置的默认文件路径是 maven,配置文件路径是 /opt/apache-maven-3.5.3/conf/settings.xml。执行以下命令获取 Maven 的设置内容。

    kubectl get cm -n kubesphere-devops-worker ks-devops-agent -o yaml
    

    Maven Pod 的网络

    具有 maven 标签的 Pod 使用 docker-in-docker 网络来运行流水线,即节点中的 /var/run/docker.sock 被挂载至该 Maven 容器。

    Maven 流水线示例

    Maven 项目准备工作

    创建凭证

    凭证 ID 类型 用途
    dockerhub-id 用户名和密码 仓库,例如 Docker Hub
    demo-kubeconfig kubeconfig 部署工作负载

    有关详细信息,请参考凭证管理

    为工作负载创建一个项目

    在本示例中,所有工作负载都部署在 kubesphere-sample-dev 项目中。您必须事先创建 kubesphere-sample-dev 项目。

    为 Maven 项目创建一个流水线

    1. 在您的 DevOps 项目中,转到流水线页面并点击创建,创建一个名为 maven 的流水线。有关更多信息,请参见使用图形编辑面板创建流水线

    2. 转到该流水线的详情页面,点击编辑 Jenkinsfile

    3. 复制粘贴以下内容至弹出窗口。您必须将 DOCKERHUB_NAMESPACE 的值替换为您自己的值,编辑完成后点击确定保存 Jenkinsfile。

      pipeline {
          agent {
              label 'maven'
          }
      
          parameters {
              string(name:'TAG_NAME',defaultValue: '',description:'')
          }
      
          environment {
              DOCKER_CREDENTIAL_ID = 'dockerhub-id'
              KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
              REGISTRY = 'docker.io'
              // 需要更改为您自己的 Docker Hub Namespace
              DOCKERHUB_NAMESPACE = 'Docker Hub Namespace'
              APP_NAME = 'devops-maven-sample'
              BRANCH_NAME = 'dev'
              PROJECT_NAME = 'kubesphere-sample-dev'
          }
      
          stages {
              stage ('checkout scm') {
                  steps {
                      // 下方所用的 GitHub 仓库仅用作体验功能的示例,请避免向该仓库提交包含测试性改动的 PR
                      git branch: 'master', url: "https://github.com/kubesphere/devops-maven-sample.git"
                  }
              }
      
              stage ('unit test') {
                  steps {
                      container ('maven') {
                          sh 'mvn clean test'
                      }
                  }
              }
      
              stage ('build & push') {
                  steps {
                      container ('maven') {
                          sh 'mvn -Dmaven.test.skip=true 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 {
                       container ('maven') {
                            withCredentials([
                                kubeconfigFile(
                                credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                                variable: 'KUBECONFIG')
                                ]) {
                                sh 'envsubst < deploy/all-in-one/devops-sample.yaml | kubectl apply -f -'
                            }
                       }
                   }
              }
          }
      }
      
    4. 您可以看到图形编辑面板上已自动创建阶段和步骤。

    运行和测试

    1. 点击运行并在弹出对话框的 TAG_NAME 中输入 v1,然后点击确定运行流水线。

    2. 待流水线成功运行,您可以前往运行记录选项卡查看其详情。

    3. kubesphere-sample-dev 项目中,已创建新的工作负载。

    4. 服务页面,查看服务 (Service) 的外部访问信息。