评论

收藏

[Linux] 使用 KubeSphere 创建DevOps工程

服务系统 服务系统 发布于:2021-08-04 13:37 | 阅读数:784 | 评论:0

说明
创建CI流水线,使用KubeSphere DevOps完成源码编译、镜像构建并推送到Harbor仓库或其他云仓库,最后以git commit方式更新yaml仓库中image字段。
CD部分我们使用Argo CD来做,Argo CD持续监测yaml仓库配置文件变动,当 CI 部分执行git push时便会触发 Argo CD 更新 yaml 文件到 k8s 集群。
准备工作
  • 安装kubesphere,启用KubeSphere DevOps系统。
  • 需要有一个Docker Hub帐户,也可以自建Harbor,我这里使用的是免费阿里云仓库。
  • 需要创建一个企业空间、一个 DevOps 工程和一个帐户 (project-regular),必须邀请该帐户至DevOps工程中并赋予operator角色。如果尚未创建,请参见创建企业空间、项目、帐户和角色。
  • 设置 CI 专用节点来运行流水线(可选)。有关更多信息,请参见为缓存依赖项设置 CI 节点
  • 配置邮件告警(可选)。请参见为 KubeSphere 流水线设置电子邮件服务器,我这里计划对接微信告警。
  • 配置 SonarQube 将代码分析纳入流水线中(可选)。有关更多信息,请参见将 SonarQube 集成到流水线。
流水线概述
DSC0000.png

备注:
  • 阶段 1:Checkout SCM:从 GitLab 仓库检出源代码。
  • 阶段 2:单元测试:待该测试通过后才会进行下一阶段。
  • 阶段 3:SonarQube 分析:配置 SonarQube 用于静态代码分析。
  • 阶段 4:构建并推送快照镜像:构建镜像并附上标签snapshot-$BUILD_NUMBER推送至 Docker Hub,其中$BUILD_NUMBER是流水线活动列表中的记录的序列号。
  • 阶段 5:制品:生成一个制品(jar 文件包或其他)并保存。
  • 阶段 6:部署至开发环境:在开发环境中创建一个部署和一个服务。该阶段需要进行审核,部署成功运行后,会发送电子邮件或微信报警通知。
KubeSphere 创建流水线

创建一个帐户
(1)登录控制台后,点击左上角的平台管理,然后选择访问控制。
DSC0001.jpeg

(2)了解内置账户角色
DSC0002.jpeg

(3)创建帐户将被分配platform-regular角色。
DSC0003.jpeg


创建一个企业空间
(1)admin账户登录控制台后,点击左上角的平台管理,然后选择访问控制。

(2)在企业空间中,可以看到仅列出了一个默认企业空间system-workspace,即系统企业空间,其中运行着与系统相关的组件和服务,无法删除该企业空间。
DSC0004.jpeg

(3)点击右侧的创建,将新企业空间命名为demo-workspace,并将用户ws-admin设置为企业空间管理员,如下图所示:
DSC0005.jpeg

完成后,点击创建。
(4)在企业空间设置中,选择企业成员,然后点击邀请成员即上面创建的java账户。
DSC0006.jpeg


创建项目
(1)以 admin 身份登录 KubeSphere,在项目管理中,点击创建。
DSC0007.jpeg

(2)输入项目名称(例如 demo-project),然后点击确定完成,可以为项目添加别名和描述。
DSC0008.jpeg

(3)设置项目配额
DSC0009.jpeg

(4)邀请成员java并授予demp-workspace-self-provisioner角色权限
DSC00010.jpeg


创建一个 DevOps 工程
(1)以java身份登录 KubeSphere,创建DevOps 工程。
DSC00011.jpeg

(2)创建相关凭证
创建git仓库和镜像仓库凭证
DSC00012.jpeg

(3)在 KubeSphere DevOps 工程下创建一条空流水线,命名为demo-java
DSC00013.jpeg

DSC00014.jpeg

进入流水线,选择编辑 Jenkinsfile,复制以下内容:
pipeline {

  environment {
    GIT_URL='http://192.168.98.221:8091/root/spring-demo.git'
    GIT_CREDENTIAL_ID = 'git-id'
    GIT_BRANCH = 'master'
    REGISTRY = 'registry.cn-shanghai.aliyuncs.com/tengfeiwu/spring-demo'
    REGISTRY_CREDENTIAL_ID = 'harbor-id'
  }

  agent {
    node {
      label 'maven'
    }
  }

  stages {

    stage('SCM Checkout') {
      steps {
        git branch: "${GIT_BRANCH}", credentialsId: "${GIT_CREDENTIAL_ID}", url: "${GIT_URL}"
      }
    }

    stage('source build') {
      steps {
        container('maven') {
          sh 'mvn clean package'

        }
      }
    }

    stage('docker build & push') {
      steps {
        script {
          env.COMMIT_ID = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
          env.TIMESTRAP = sh(returnStdout: true, script: 'date +%Y%m%d%H%M%S').trim()
          env.DOCKER_TAG = "dev_${TIMESTRAP}_${COMMIT_ID}_${BUILD_NUMBER}"
        }
        container('maven') {
          withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$REGISTRY_CREDENTIAL_ID" ,)]) {
            sh 'docker build -t $REGISTRY:$DOCKER_TAG .'
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker push $REGISTRY:$DOCKER_TAG'
          }
        }
      }
    }

    stage('update docker tag') {
      environment {
        BUILD_USER = 'tengfei.wu'
        BUILD_USER_EMAIL = 'tengfei.wu@ceshi.com'
        YAML_REPO_URL='http://${username}:${password}@192.168.98.221:8091/root/argocd-gitops.git'
      }

      steps {
        withCredentials([usernamePassword(passwordVariable : 'password' ,usernameVariable : 'username' ,credentialsId : "$GIT_CREDENTIAL_ID" ,)]) {
          sh """
            git config --global user.name "$BUILD_USER"
            git config --global user.email "$BUILD_USER_EMAIL"
            git clone ${YAML_REPO_URL} && cd argocd-gitops
            sed -i "s#$REGISTRY.*#${REGISTRY}:${DOCKER_TAG}#g" javademo/javademo-deployment.yaml
            git add -A && git commit -m "update tag: ${DOCKER_TAG}" && git push ${YAML_REPO_URL}
          """
        }
      }
    }
  }
}
说明:
注意修改相关参数,流水线中引用了 2 个凭证:
  • GIT_CREDENTIAL_ID为内网git仓库账号密码;
  • REGISTRY_CREDENTIAL_ID为镜像仓库账号密码;
(4)运行流水线
点击运行,等待流水线执行完成,查看状态为成功:
DSC00015.jpeg

查看流水线构建日志,可以看到执行了以下过程,其中最后 update docker tag 步骤,执行了 2 个关键操作,sed 命令替换镜像 tag,然后执行 git push 更新 yaml 仓库。
DSC00016.jpeg

(5)查看推送到镜像仓库的镜像
DSC00017.jpeg



关注下面的标签,发现更多相似文章