使用 Jenkinsfile 在多集群项目中部署应用

准备工作

创建 Docker Hub 访问令牌 (Token)

  1. 登录 Docker Hub 并在右上角的菜单中选择 Account Settings

    dockerhub 设置

  2. 在左侧点击 Security,然后点击 New Access Token

    dockerhub 创建令牌

  3. 输入令牌名称,点击 Create

    dockerhub 令牌创建完成

  4. 点击 Copy and Close 并务必保存该访问令牌。

    dockerhub 复制令牌

创建凭证

您需要在 KubeSphere 中为已创建的访问令牌创建凭证,以便流水线能够向 Docker Hub 推送镜像。此外,您还需要创建 kubeconfig 凭证,用于访问 Kubernetes 集群。

  1. project-regular 身份登录 KubeSphere Web 控制台,前往您的 DevOps 工程,在凭证页面点击创建

    创建 dockerhub ID

  2. 在弹出对话框中,设置凭证 ID,稍后会用于 Jenkinsfile 中,类型选择帐户凭证用户名输入您的 Docker Hub 帐户名称,token / 密码中输入刚刚创建的访问令牌。操作完成后,点击确定

    创建 Docker 凭证

    提示

    有关如何创建凭证的更多信息,请参见凭证管理
  3. 登出 KubeSphere Web 控制台,再以 project-admin 身份登录。前往您的 DevOps 工程,在凭证页面点击创建类型选择 kubeconfig,KubeSphere 会自动填充 Content 字段,即当前帐户的 kubeconfig。设置凭证 ID,然后点击确定

    创建 kubeconfig

    备注

    在未来版本中,您可以邀请 project-regular 帐户至您的多集群项目中,并赋予必要角色,以使用此帐户创建 kubeconfig 凭证。

创建流水线

创建完上述凭证后,您可以使用 project-regular 帐户按照以下步骤使用示例 Jenkinsfile 创建流水线。

  1. 要创建流水线,请在流水线页面点击创建

    创建流水线

  2. 在弹出窗口中设置名称,然后点击下一步

    设置流水线名称

  3. 在本教程中,您可以为所有字段使用默认值。在高级设置页面,直接点击创建

    创建流水线-2

编辑 Jenkinsfile

  1. 在流水线列表中,点击该流水线进入其详情页面。点击编辑 Jenkinsfile 定义一个 Jenkinsfile,流水线会基于它来运行。

    编辑 jenkinsfile

  2. 将以下所有内容复制并粘贴到弹出窗口中,用作流水线的示例 Jenkinsfile。您必须将 DOCKERHUB_USERNAMEDOCKERHUB_CREDENTIALKUBECONFIG_CREDENTIAL_IDMULTI_CLUSTER_PROJECT_NAMEMEMBER_CLUSTER_NAME 的值替换成您自己的值。操作完成后,点击确定

    pipeline {
      agent {
        node {
          label 'maven'
        }
       
      }
         
      environment {
        REGISTRY = 'docker.io'
        // Docker Hub 用户名
        DOCKERHUB_USERNAME = 'Your Docker Hub username'
        APP_NAME = 'devops-go-sample'
        // ‘dockerhub-go’ 即您在 KubeSphere 控制台上创建的 Docker Hub 凭证 ID
        DOCKERHUB_CREDENTIAL = credentials('dockerhub-go')
        // 您在 KubeSphere 控制台上创建的 kubeconfig 凭证 ID
        KUBECONFIG_CREDENTIAL_ID = dockerhub-go-kubeconfig
        // 您企业空间中的多集群项目名称
        MULTI_CLUSTER_PROJECT_NAME = 'demo-multi-cluster'
        // 您用来部署应用的 Member 集群名称
        // 本教程中,应用部署在 Host 集群和一个 Member 集群上
        // 若需要部署在多个 Member 集群上, 请编辑 manifest/multi-cluster-deploy.yaml
        MEMBER_CLUSTER_NAME = 'Your Member Cluster name'
      }  
         
      stages {
        stage('docker login') {
          steps {
            container('maven') {
              sh 'echo $DOCKERHUB_CREDENTIAL_PSW  | docker login -u $DOCKERHUB_CREDENTIAL_USR --password-stdin'
            }
       
          }
        }
           
        stage('build & push') {
          steps {
            container('maven') {
              sh 'git clone https://github.com/yuswift/devops-go-sample.git'
              sh 'cd devops-go-sample && docker build -t $REGISTRY/$DOCKERHUB_USERNAME/$APP_NAME .'
              sh 'docker push $REGISTRY/$DOCKERHUB_USERNAME/$APP_NAME'
            }
          }
        }
           
        stage('deploy app to multi cluster') {
          steps {
            container('maven') {
              script {
                withCredentials([
                  kubeconfigFile(
                    credentialsId: 'dockerhub-go-kubeconfig',
                    variable: 'KUBECONFIG')
                  ]) {
                  sh 'envsubst < devops-go-sample/manifest/multi-cluster-deploy.yaml | kubectl apply -f -'
                  }
                }
              }
            }
          }
        }
      }
    

    备注

    如果您的流水线成功运行,将会推送镜像至 Docker Hub。如果您使用 Harbor,则无法通过 Jenkins 凭证使用环境变量将参数传送到 docker login -u。这是因为每个 Harbor Robot 帐户的用户名都包含一个 $ 字符,当用于环境变量时,Jenkins 会将其转换为 $$了解更多信息

运行流水线

保存 Jenkinsfile 后,点击运行。如果一切顺利,您会在您的多集群项目中看到部署 (Deployment) 工作负载。

Deployment


感谢您的反馈。如果您有关于如何使用 KubeSphere 的具体问题,请在 Slack 上提问。如果您想报告问题或提出改进建议,请在 GitHub 存储库中打开问题。