kubersphere创建devops流水线项目,实现自动部署

1,136 阅读4分钟

创建devops项目

创建项目-创建流水线

image-20220403134722285.png

创建流水线,

  • 如果自己工程有可以Jenkinsfile,可以直接根据Jenkinsfile创建流水线
  • 新建流水线的各个stage

我们这里先演示无Jenkinsfile的情况

参数设置--可以不修改,默认就好

image-20220404085037621.png

点击创建,可以看到我们新建的流水线

image-20220404085146313.png

点击流水线-编辑流水线-选择一个模板,我们这里选择第二个模板(不选也可以)

image-20220404085328885.png 编辑流水线第一阶段

  • 编辑名称-拉取代码
  • 代理,我们这里不需要,选择none
  • 条件-不需要条件
  • 指定容器-maven
  • 添加第一个嵌套命令-git-拉取代码-如果是私有仓库,需要新建凭证,使用凭证
  • 添加第二个嵌套名称-shell- ls-alh 查看代码是否拉下来
  • 运行流水线,查看第一个阶段,是否正确执行

image-20220404085631399.png

image-20220404090106077.png

通过查看日志,我们可以看到git仓库里的代码已经正常拉取下来了 编辑流水线第二阶段

  • 第二个阶段命名为代码编译打包
  • 不需要代理,代理类型选择none
  • 不需要条件
  • 指定容器为maven
  • 添加第一条嵌套命令shell命令 ls -alh 查看第二阶段是否能正常拿到代码
  • 添加第二条shell命令 mvn clean package -Dmaven.test.skip=true 将项目编译打包
  • 添加第三条shell命令 ls -alh ./target 查看是否正常打成jar包
  • 保存-运行流水线

image-20220404090411018.png

image-20220404090836231.png

可以看到第二阶段也执行正常,打出了相应的jar包

编辑流水线第三阶段

Dockerfile

FROM openjdk:8-jdk
LABEL maintainer=cc
​
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY target/*.jar   /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
  • 提前准备好Dockerfile文件,用于构建docker镜像(不知道怎么写docker镜像的,可以直接复制我的,或者到网上搜一个自己改改)
  • 名称-构建镜像
  • 代理选择none
  • 不需要添加条件
  • 指定容器-maven
  • 添加第一条嵌套命令-shell命令-构建镜像 docker build -t test:1.0 -f Dockerfile .(注意末尾的这个.)
  • 添加第二条嵌套命令-shell命令- docker images查看镜像是否构成
  • 保存-运行流水线
  • 运行流水线如果需要输什么参数,随便输一个字符串就行

image-20220404091355885.png

image-20220404092118129.png

这里可以看到,test的docker镜像已经构成,版本号为1.0

编辑流水线第四阶段

这一步的主要功能是将镜像推送到远程镜像仓库,方便集群部署拉取镜像,我们这里选择阿里云的镜像仓库

阿里云-产品与服务-容器镜像服务-开通镜像服务个人版(免费)-创建一个命名空间(我创建的cc-abc)

这时候我们可以看一下Jenkinsfile长啥样了

pipeline {
  agent {
    node {
      label 'maven'
    }
​
  }
  stages {
    stage('拉取代码') {
      agent none
      steps {
        container('maven') {
          git(url: 'https://gitee.com/cc847417630/devops_test.git', credentialsId: 'gitee-id', branch: 'master', changelog: true, poll: false)
          sh 'ls -alh'
        }
​
      }
    }
​
    stage('代码编译打包') {
      agent none
      steps {
        container('maven') {
          sh 'ls -alh'
          sh 'mvn clean package -Dmaven.test.skip=true'
          sh 'ls -alh ./target'
        }
​
      }
    }
​
    stage('构建镜像') {
      agent none
      steps {
        container('maven') {
          sh 'docker build -t test:1.0 -f Dockerfile .'
          sh 'docker images'
        }
​
      }
    }
​
    stage('推送镜像') {
      agent none
      steps {
        container('maven') {
          withCredentials([usernamePassword(credentialsId : 'aliyun-docker1' ,passwordVariable : 'DOCKER_PASSWORD_VAR' ,usernameVariable : 'DOCKER_USER_VAR' ,)]) {
            sh 'echo "$DOCKER_PASSWORD_VAR"|docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
            sh 'docker tag test:1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
            sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
          }
​
        }
​
      }
    }
​
    stage('deploy to dev') {
      steps {
        input(id: 'deploy-to-dev', message: 'deploy to dev?')
        kubernetesDeploy(configs: 'deploy/dev-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
      }
    }
​
    stage('deploy to production') {
      steps {
        input(id: 'deploy-to-production', message: 'deploy to production?')
        kubernetesDeploy(configs: 'deploy/prod-ol/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
      }
    }
​
  }
  environment {
    DOCKER_CREDENTIAL_ID = 'dockerhub-id'
    GITHUB_CREDENTIAL_ID = 'github-id'
    KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    REGISTRY = 'registry.cn-heyuan.aliyuncs.com'
    DOCKERHUB_NAMESPACE = 'cc-abc'
    GITHUB_ACCOUNT = 'kubesphere'
    APP_NAME = 'devops-java-sample'
  }
  parameters {
    string(name: 'TAG_NAME', defaultValue: '', description: '')
  }
}

可以看到Jenkinsfile中就是我建立流水线中的相关流程

  • 每一个流水线步骤就是一个stage
  • environment中包含全局可以访问的变量

查看阿里云镜像仓库的访问凭证,将environment中的值进行替换(替换推送地址和命名空间)

image-20220404093258250.png

由于阿里云镜像仓库是私有地址,需要用户名密码进行访问,才能正确推,并将用户名和密码存储到相应的变量中,方便书写Jenkinsfile文件

image-20220404093735922.png

第四阶段的Jenkinsfile

stage('推送镜像') {
      agent none
      when {
        branch 'master'
      }
      steps {
        container('maven') {
          withCredentials([usernamePassword(credentialsId : 'aliyun-docker1' ,passwordVariable : 'DOCKER_PASSWORD_VAR' ,usernameVariable : 'DOCKER_USER_VAR' ,)]) {
            sh 'echo "$DOCKER_PASSWORD_VAR"|docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
            sh 'docker tag test:1.0 $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
            sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER'
          }
​
        }
​
      }
    }
  • 主要包含三个步骤,但是都是在密码认证中完成的
  • 第一个嵌套命令是进行阿里云登录
  • 第二个嵌套命令是将我们的本地镜像重新命令为阿里云要求的镜像格式 $BUILD_NUMBER可以取出当前是第几次构建流水线,作为版本号
  • 第三个命令为将镜像推送到阿里云远程仓库
  • 保存并运行流水线

image-20220404094424106.png

image-20220404095502823.png

image-20220404095528174.png

可以看到镜像已经成功推上阿里云仓库 编辑流水线第五步

这一步的主要作用是将服务进行部署

首先,先在企业空间下创建一个工程,我们这里叫pro-cc-abc吧

在代码中,编写一个*.yaml文件,用于部署服务(没有的可以使用我这个,可以试着阅读一下,需要替换app名称和命名空间)

使用过k8s的人应该知道,在k8s集群中创建服务可以使用 kubectl apply -f *.yaml

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dtest
  name: test        
  namespace: pro-cc-abc   #一定要写名称空间,我们这里叫pro-cc-abc
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  selector:
    matchLabels:
      app: test
  strategy:
    rollingUpdate:
      maxSurge: 50%
      maxUnavailable: 50%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: test
    spec:
      imagePullSecrets:
        - name: aliyun-docker-hub  #提前在项目下配置访问阿里云的账号密码
      containers:
        - image: $REGISTRY/$DOCKERHUB_NAMESPACE/test:$BUILD_NUMBER
          imagePullPolicy: Always
          name: app
          ports:
            - containerPort: 8080
              protocol: TCP
          resources:
            limits:
              cpu: 300m
              memory: 600Mi
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: test
  name: test
  namespace: pro1
spec:
  ports:
    - name: http
      port: 8080
      protocol: TCP
      targetPort: 8080
      nodePort: 32000 #这里可以指定一个你的服务想对外暴露的端口,原则上使用30000-32670之间
  selector:
    app: test
  sessionAffinity: None
  type: NodePort

先要提前在项目中创建一个凭证

工程管理-凭证-创建凭证

  • 凭证ID demo-kubeconfig
  • 类型 kubeconfig
  • content 默认就好

image-20220404100859601.png

保存运行

image-20220404101701933.png

可以看到项目以及部署完成

在浏览器中访问相应服务可以正常访问

实现代码提交到流水线自动运行的最后一步

配置webhooks

码云-仓库-管理-webhooks-添加

http://139.198.9.89:30880/devops_webhook/git/?url=https://gitee.com/cc847417630/devops_test.git

修改代码-提交到git仓库-自动部署

恭喜你,已经学会使用devops部署一个简单的应用了!!!