KubeSphere 的流水线创建

KubeSphere 的流水线创建

1. 创建凭证

这里我们要创建3个凭证,分别是:

1. sonarqube的token
1. gitlab的用户名密码(或者gitee的用户名密码)
1. github的用户名密码(或者阿里云容器镜像服务的用户名密码)

KubeSphere 的流水线创建_第1张图片

构建镜像时发现github和dockerhub拉取上传有问题,就改为了国内的gitee和阿里,于是最终采用了阿里云+gitee

KubeSphere 的流水线创建_第2张图片

2.创建项目

2.1 创建kubesphere-sample-dev项目

使用project-admin用户登录kubesphere,创建项目

KubeSphere 的流水线创建_第3张图片

kubesphere-sample-dev

KubeSphere 的流水线创建_第4张图片

KubeSphere 的流水线创建_第5张图片

2.2 邀请成员

KubeSphere 的流水线创建_第6张图片

KubeSphere 的流水线创建_第7张图片

3. 创建流水线

3.1 进入devops项目

使用project-regular用户登录

KubeSphere 的流水线创建_第8张图片

3.2 创建流水线

KubeSphere 的流水线创建_第9张图片

流水线名字

kubesphere-sample-dev-pipeline

KubeSphere 的流水线创建_第10张图片

3.3 添加构建参数

构建参数 作用
REGISTRY registry.cn-shanghai.aliyuncs.com 镜像仓库地址
DOCKERHUB_NAMESPACE devops-maven-sample 镜像仓库namespace
APP_NAME devops-sample 镜像名

KubeSphere 的流水线创建_第11张图片

后来发现dockerhub镜像上传时比较麻烦就把仓库改到了阿里

KubeSphere 的流水线创建_第12张图片

4. 编辑流水线

4.1 流水线编辑

KubeSphere 的流水线创建_第13张图片

KubeSphere 的流水线创建_第14张图片

KubeSphere 的流水线创建_第15张图片

4.2 Fork项目

项目来源:https://github.com/kubesphere/devops-maven-sample
将该项目同步到gitee中.(懒得重新截图了,步骤差不多)

KubeSphere 的流水线创建_第16张图片

请添加图片描述

修改Dockerfile-online的镜像

FROM openjdk:8

WORKDIR /home

COPY target/*.jar /home

ENTRYPOINT java -jar *.jar

4.3 代码克隆

git仓库地址

https://gitee.com/qqmiller/devops-maven-sample.git

KubeSphere 的流水线创建_第17张图片

KubeSphere 的流水线创建_第18张图片

4.4 单元测试

KubeSphere 的流水线创建_第19张图片

选择指定容器

KubeSphere 的流水线创建_第20张图片

添加嵌套步骤

KubeSphere 的流水线创建_第21张图片

mvn clean package

KubeSphere 的流水线创建_第22张图片

Jenkinsfile

KubeSphere 的流水线创建_第23张图片

4.5 代码分析

4.5.1 添加maven容器

Code Analysis

KubeSphere 的流水线创建_第24张图片

指定容器

KubeSphere 的流水线创建_第25张图片

4.5.2 添加SonarQube凭证

嵌套步骤

KubeSphere 的流水线创建_第26张图片

添加凭证

SONAR_TOKEN

KubeSphere 的流水线创建_第27张图片

4.5.3 添加Sonarqube配置

添加嵌套步骤

这里别选错,是在添加凭证里面添加嵌套步骤

KubeSphere 的流水线创建_第28张图片

添加sonarqube

KubeSphere 的流水线创建_第29张图片

继续添加sonarqube的嵌套步骤

KubeSphere 的流水线创建_第30张图片

添加Shell命令

mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN

KubeSphere 的流水线创建_第31张图片

4.5.4 添加SonarQube超时

第三个

KubeSphere 的流水线创建_第32张图片

添加超时

KubeSphere 的流水线创建_第33张图片

4.5.5 代码质量检查

超时中添加嵌套步骤

KubeSphere 的流水线创建_第34张图片

添加代码质量检查

KubeSphere 的流水线创建_第35张图片

这部分的步骤不叫多,截图如下

KubeSphere 的流水线创建_第36张图片

Jenkinsfile部分

KubeSphere 的流水线创建_第37张图片

4.6 构建镜像并推送至仓库

此步骤构建镜像,完成后将镜像推送至仓库

KubeSphere 的流水线创建_第38张图片

4.6.1 添加maven容器

KubeSphere 的流水线创建_第39张图片

4.6.2 添加项目构建

添加嵌套

KubeSphere 的流水线创建_第40张图片

添加shell

mvn -Dmaven.test.skip=true clean package

KubeSphere 的流水线创建_第41张图片

4.6.3 根据Dockerfile构建镜像

KubeSphere 的流水线创建_第42张图片

构建镜像命令

REGISTRY, DOCKERHUB_NAMESPACE ,APP_NAME这3个变量就是在3.3节定义的那3个传参

docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER .

KubeSphere 的流水线创建_第43张图片

4.6.4 添加Git仓库凭证

由于上传需要验证,这一步添加Git凭证

添加嵌套步骤

KubeSphere 的流水线创建_第44张图片

上面是密码,下面是用户名

DOCKER_PASSWORD
DOCKER_USERNAME

KubeSphere 的流水线创建_第45张图片

4.6.5 镜像仓库登陆

KubeSphere 的流水线创建_第46张图片

添加shell

echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --passwd-stdin

KubeSphere 的流水线创建_第47张图片

4.6.6 镜像上传

KubeSphere 的流水线创建_第48张图片

嵌套shell

docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER

KubeSphere 的流水线创建_第49张图片

这里先跑一遍流水线,发现由于github和docker.io无法正常拉取上传关系,造成流水线失败.将代码转到gitee,镜像仓库改为阿里后构建完成流水线并将代码上传至阿里镜像仓库.

KubeSphere 的流水线创建_第50张图片

sonarqube检测结果

KubeSphere 的流水线创建_第51张图片

阿里云镜像仓库也拿到了构建完成的镜像

KubeSphere 的流水线创建_第52张图片

Jenkinsfile

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('CheckOut SCM') {
      agent none
      steps {
        git(url: 'https://gitee.com/qqmiller/devops-maven-sample.git', credentialsId: 'gitee', branch: 'master', changelog: true, poll: false)
      }
    }

    stage('Unit Test') {
      agent none
      steps {
        container('maven') {
          sh 'mvn clean package'
        }

      }
    }

    stage('Code Analysis') {
      agent none
      steps {
        container('maven') {
          withCredentials([string(credentialsId : 'sonar' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh 'mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN'
            }

          }

          timeout(unit: 'MINUTES', activity: true, time: 30) {
            waitForQualityGate 'true'
          }

        }

      }
    }

    stage('Build and Push') {
      agent none
      steps {
        container('maven') {
          sh 'mvn -Dmaven.test.skip=true clean package'
          sh 'docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER .'
          withCredentials([usernamePassword(credentialsId : 'aliyun' ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER'
          }

        }

      }
    }

  }
}

4.7 生成制品

KubeSphere 的流水线创建_第53张图片

target/*.jar

KubeSphere 的流水线创建_第54张图片

4.8 应用部署

服务最终会被部署到kubesphere-sample-dev命名空间下

root@ks-master:~# kubectl get ns|grep kubesphere-sample-dev
kubesphere-sample-dev             Active   18h
root@ks-master:~# kubectl get pods -n kubesphere-sample-dev
No resources found in kubesphere-sample-dev namespace.

目前这个命名空间下是空的

4.8.1 审核

KubeSphere 的流水线创建_第55张图片

添加步骤

KubeSphere 的流水线创建_第56张图片

4.8.2 添加kubeconfig凭证

继续添加步骤

KubeSphere 的流水线创建_第57张图片

指定maven容器

KubeSphere 的流水线创建_第58张图片

添加嵌套步骤

KubeSphere 的流水线创建_第59张图片

添加凭证

KUBECONFIG_CONTENT

KubeSphere 的流水线创建_第60张图片

4.8.3 部署应用

添加嵌套步骤

KubeSphere 的流水线创建_第61张图片

mkdir ~/.kube
echo "$KUBECONFIG_CONTENT" > ~/.kube/config
envsubst < deploy/dev-ol/devops-sample.yaml | kubectl apply -f -
envsubst < deploy/dev-ol/devops-sample-svc.yaml | kubectl apply -f -

envsubst作用是变量填充

KubeSphere 的流水线创建_第62张图片

Jenkinsfile

pipeline {
  agent {
    node {
      label 'maven'
    }

  }
  stages {
    stage('CheckOut SCM') {
      agent none
      steps {
        git(url: 'https://gitee.com/qqmiller/devops-maven-sample.git', credentialsId: 'gitee', branch: 'master', changelog: true, poll: false)
      }
    }

    stage('Unit Test') {
      agent none
      steps {
        container('maven') {
          sh 'mvn clean package'
        }

      }
    }

    stage('Code Analysis') {
      agent none
      steps {
        container('maven') {
          withCredentials([string(credentialsId : 'sonar' ,variable : 'SONAR_TOKEN' ,)]) {
            withSonarQubeEnv('sonar') {
              sh 'mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN'
            }

          }

          timeout(unit: 'MINUTES', activity: true, time: 30) {
            waitForQualityGate 'true'
          }

        }

      }
    }

    stage('Build and Push') {
      agent none
      steps {
        container('maven') {
          sh 'mvn -Dmaven.test.skip=true clean package'
          sh 'docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER .'
          withCredentials([usernamePassword(credentialsId : 'aliyun' ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER'
          }

        }

      }
    }
    stage('Artifacts') {
      agent none
      steps {
        archiveArtifacts 'target/*.jar'
      }
    }
    stage('Deploy to Dev') {
      agent none
      steps {
        input(message: '''发布到开发环境
@project-admin''', submitter: 'project-admin')
        container('maven') {
          withCredentials([kubeconfigContent(credentialsId : 'kubeconfig' ,variable : 'KUBECONFIG_CONTENT' ,)]) {
            sh '''mkdir ~/.kube
echo "$KUBECONFIG_CONTENT" > ~/.kube/config
envsubst < deploy/dev-ol/devops-sample.yaml | kubectl apply -f -
envsubst < deploy/dev-ol/devops-sample-svc.yaml | kubectl apply -f -'''
          }
        }
      }
    }
  }
}

5. 运行流水线

运行测试下

运行到Deploy to Dev步骤时需要审批继续

KubeSphere 的流水线创建_第63张图片

在project-admin用户下点击proceed

KubeSphere 的流水线创建_第64张图片

任务就被继续执行

KubeSphere 的流水线创建_第65张图片

制品

KubeSphere 的流水线创建_第66张图片

查看服务端口

root@ks-master:~# kubectl get pods,svc -n kubesphere-sample-dev
NAME                                 READY   STATUS    RESTARTS   AGE
pod/ks-sample-dev-597764c9d8-lqctx   1/1     Running   0          94s

NAME                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/ks-sample-dev   NodePort   10.233.46.39   <none>        8080:30861/TCP   66m

KubeSphere 的流水线创建_第67张图片

你可能感兴趣的:(jenkins,k8s,kubesphere)