K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线

Jenkinsfile 是一个文本文件,它包含 Jenkins 流水线的定义,并被检入源代码控制仓库。Jenkinsfile 将整个工作流存储为代码,因此它是代码审查和流水线迭代过程的基础。有关更多信息,请参见 Jenkins 官方文档。

KubeSphere 中可以创建两种类型的流水线:一种是本教程中介绍的基于 SCM 中 Jenkinsfile 创建的流水线,另一种是通过图形编辑面板创建的流水线。Jenkinsfile in SCM 需要源代码管理 (SCM) 中有内置 Jenkinsfile,换句话说,Jenkinsfile 作为 SCM 的一部分。KubeSphere DevOps 系统会根据代码仓库的现有 Jenkinsfile 自动构建 CI/CD 流水线。您可以定义工作流,例如 stage 和 step

准备工作

  • 您需要有一个 Docker Hub 帐户和一个 GitHub 帐户。
  • 您需要启用 KubeSphere DevOps 系统。
  • 您需要创建一个企业空间、一个 DevOps 工程和一个帐户 (project-regular),需要邀请该帐户至 DevOps 工程中并赋予 operator 角色。如果尚未准备就绪,请参见创建企业空间、项目、帐户和角色。
  • 您需要设置 CI 专用节点用于运行流水线。请参考为依赖项缓存设置 CI 节点。
  • 您需要安装和配置 SonarQube。请参考将 SonarQube 集成到流水线。如果您跳过这一部分,则没有下面的 SonarQube 分析阶段。

步骤 1:创建凭证

以 project-regular 身份登录 KubeSphere 控制台。转到您的 DevOps 工程,在工程管理下的凭证页面创建以下凭证。有关如何创建凭证的更多信息,请参见凭证管理。

如果您的帐户或密码中包含任何特殊字符,例如 @ 和 $,可能会因为无法识别而在流水线运行时导致错误。在这种情况下,您需要先在一些第三方网站(例如 urlencoder)上对帐户或密码进行编码,然后将输出结果复制粘贴作为您的凭证信息。

凭证 ID 类型 用途
dockerhub-id 帐户凭证 Docker Hub
github-id 帐户凭证 GitHub
demo-kubeconfig kubeconfig Kubernetes

步骤 2:在 GitHub 仓库中修改 Jenkinsfile

  • 在线编辑Jenkinsfile文件。
条目 描述信息
DOCKER_CREDENTIAL_ID dockerhub-id 您在 KubeSphere 中为 Docker Hub 帐户设置的凭证 ID
GITHUB_CREDENTIAL_ID github-id 您在 KubeSphere 中为 GitHub 帐户设置的凭证 ID,用于将标签推送至您的 GitHub 仓库。
KUBECONFIG_CREDENTIAL_ID demo-kubeconfig 您在 KubeSphere 中为 kubeconfig 设置的凭证 ID,用于访问运行中的 Kubernetes 集群。
REGISTRY docker.io 默认为 docker.io,用作推送镜像的地址。
DOCKERHUB_NAMESPACE your-dockerhub-account 请替换为您的 Docker Hub 帐户名,也可以替换为该帐户下的 Organization 名称。
GITHUB_ACCOUNT your-github-account 请替换为您的 GitHub 帐户名。例如,如果您的 GitHub 地址是 https://github.com/kubesphere/,则您的 GitHub 帐户名为 kubesphere,也可以替换为该帐户下的 Organization 名称。
APP_NAME devops-java-sample 应用名称。
SONAR_CREDENTIAL_ID sonar-token 您在 KubeSphere 中为 SonarQube 令牌设置的凭证 ID,用于代码质量检测。

Jenkinsfile

pipeline {
  agent {
    node {
      label 'maven'
    }
  }

  parameters {
      string(name:'TAG_NAME',defaultValue: 'latest',description:'')
  }

  environment {
      DOCKER_CREDENTIAL_ID = 'dockerhub-id'
      GITHUB_CREDENTIAL_ID = 'gitlab-id'
      KUBECONFIG_CREDENTIAL_ID = 'iot-kubeconfig'
      REGISTRY = 'www.xxx.com'
      DOCKERHUB_NAMESPACE = 'dev'
      REGISTRY_USERNAME = 'user'
      REGISTRY_PASSWORD = 'pass'
      GITHUB_ACCOUNT = 'account'
      APP_NAME = 'devops-sample'
      imageName = 'app1'
      dockerFile = 'src/app1/Dockerfile'
      ImageTag = 'latest'
      localFullImageName = 'app1:latest'
      remoteImage = 'www.xxxx.com/dev/app1'
  }

  stages {
    stage('拉代码') {
      steps {
        git(url: 'http://gitlab.xxxxx.com.cn/app1.git', credentialsId: 'gitlab-id', branch: 'develop', changelog: true, poll: false)
      }
    }
    stage('构建镜像') {
      steps {
        container ('maven') {
          sh 'docker build -f $dockerFile -t $imageName:$ImageTag ./src/'
          withCredentials([usernamePassword(passwordVariable : 'REGISTRY_PASSWORD' ,usernameVariable : 'REGISTRY_USERNAME' ,credentialsId : "$DOCKER_CREDENTIAL_ID" ,)]) {
            sh 'echo "$REGISTRY_PASSWORD" | docker login $REGISTRY -u "$REGISTRY_USERNAME" --password-stdin'
          }
          
        }
          
      }
    }
   
    stage('推送镜像') {
      steps {
        container ('maven') {
          sh 'docker tag $localFullImageName $remoteImage:latest '
          sh 'docker push $remoteImage:latest '
        }
      }
    }
    
    stage('deploy to dev') {
      when{
        branch 'develop'
      }
      steps {
        input(id: 'deploy-to-dev', message: 'deploy to dev?')
        kubernetesDeploy(configs: 'deploy/dev-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
      }
    }
  }
}

  • 编辑完成后,点击页面底部的 Commit changes。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第1张图片

步骤 3:创建项目

  • 以 project-admin 身份登录 KubeSphere。在您创建 DevOps 工程的企业空间中创建以下两个项目。请确保邀请 project-regular 帐户至这两个项目中并赋予 operator 角色。
项目名称 别名
kubesphere-sample-dev development environment
kubesphere-sample-prod

production environment

  • 项目创建后,会显示在项目列表中,如下所示:

 

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第2张图片

步骤 4:创建流水线

  • 登出 KubeSphere,然后以 project-regular 身份重新登录,转到 DevOps 工程 demo-devops,点击创建构建新流水线

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第3张图片

  • 在弹出对话框中填入基本信息,将其命名为 jenkinsfile-in-scm 并选择一个代码仓库。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第4张图片

  • 在 GitHub 选项卡,从下拉菜单中选择 github-token,然后点击确认来选择您的仓库。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第5张图片

  • 选择您的 GitHub 帐户,与该令牌相关的所有仓库将在右侧列出。选择 devops-java-sample 并点击选择此仓库,点击下一步继续。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第6张图片

  • 高级设置中,选中丢弃旧的分支旁边的方框。本教程中,您可以为保留分支的天数保留分支的最大个数使用默认值。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第7张图片

 

丢弃旧的分支意味着您将一并丢弃分支记录。分支记录包括控制台输出、已归档制品以及特定分支的其他相关元数据。更少的分支意味着您可以节省 Jenkins 正在使用的磁盘空间。KubeSphere 提供两个选项来确定何时丢弃旧分支:

  • 保留分支的天数:在一定天数之后,丢弃分支。

  • 保留分支的最大个数:分支达到一定数量后,丢弃最旧的分支。

保留分支的天数保留分支的最大个数可以同时应用于分支。只要某个分支满足其中一个字段所设置的条件,则会丢弃该分支。例如,如果您将保留天数和最大分支数分别指定为 2 和 3,待某个分支的保留天数超过 2 或者分支保留数量超过 3,则会丢弃该分支。KubeSphere 默认用 -1 预填充这两个字段,表示已删除的分支将被丢弃。

  • 行为策略中,KubeSphere 默认提供四种策略。本示例中不会使用从 Fork 仓库中发现 PR 这条策略,因此您可以删除该策略。您无需修改设置,可以直接使用默认值。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第8张图片

发现分支

  • 排除也作为 PR 提交的分支:不扫描源分支,例如源仓库的 master 分支。需要合并这些分支。
  • 只有被提交为 PR 的分支:仅扫描 PR 分支。
  • 所有分支:拉取源仓库中的所有分支。

从原仓库中发现 PR

  • PR 与目标分支合并后的源代码版本:PR 合并到目标分支后,基于源代码创建并运行流水线。
  • PR 本身的源代码版本:根据 PR 本身的源代码创建并运行流水线。
  • 发现 PR 时会创建两个流水线:KubeSphere 创建两个流水线,一个流水线使用 PR 与目标分支合并后的源代码版本,另一个使用 PR 本身的源代码版本。

您需要选择 GitHub 作为代码仓库才能启用此处的行为策略设置。

  • 向下滚动到脚本路径。该字段指定代码仓库中的 Jenkinsfile 路径。它表示仓库的根目录。如果文件位置变更,则脚本路径也需要更改。请将其更改为 Jenkinsfile-online,这是示例仓库中位于根目录下的 Jenkinsfile 的文件名。

  • 扫描 Repo Trigger 中,点击如果没有扫描触发,则定期扫描并设置时间间隔为 5 分钟。点击创建完成配置。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第9张图片

步骤 5:运行流水线

  • 流水线创建后,将显示在下图所示的列表中。点击该流水线进入其详情页面。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第10张图片

  • 您可以点击该流水线右侧的三个点,然后选择复制流水线来创建该流水线的副本。如需并发运行不包含多分支的多个流水线,您可以将这些流水线全选,然后点击运行来批量运行它们。
  • 流水线详情页显示同步状态,即 KubeSphere 和 Jenkins 的同步结果。若同步成功,您会看到成功图标中打上绿色的对号。

K8S - 基于KubeSphere的DevOps构建依赖Jenkinsfile的流水线_第11张图片

 

你可能感兴趣的:(devops,jenkins,运维)