记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

kubesphere3+jenkins实现cicd部署nodejs前端项目


一,具体环境.

1,两台主机,centos7+kubesphere3.2.1+devops-jenkins,his是项目企业空间名称。

2,演示demo,是ruoyi的ui前端,地址: https://gitee.com/micoder/demo.git,已经写好实现的Jenkinsfile,Dockerfile,deploy.yaml。

3,需要配置 gitee-id,凭证为 gitee的账号密码信息。k8s-demo是kubeconfig,是部署deploy.yaml资源时使用的凭证。aliyun-id是镜像仓库的账号密码的领证,这几个都是在流水线中的凭证里面创建的。这些凭证就是jenkinsfile中用来变量替换的。

4,还需要一个 密保字典 aliyun-docker-id ,这个是给微服务YAML文件应用部署时拉取镜像需要的,如果不需要,除非你是公开镜像。

如下图:






5,关于kubesphere登陆账号: devops-yp ,注意如果只是在 '企业空间成员' 中添加了账号,并且给了最大权限,那可能会出现,流水线最后一步k8s部署YAML文件时会出错误,提示没有对应his空间资源使用权限。

可以把devops-yp账号再加入到 his '项目成员' ,如果还是提示一样的问题。可以使用admin账号登陆,到 集群管理 ----> 配置字典 ----> kubesphere-controls-system -----> 找到自己账号配置信息中,将namespace 修改成自己需要的名称空间。

具体如下图:










二,具体过程。

1,使用kubesphere WebUI建好项目与his名称空间,并添加相关成员,不再细说。

2,建立一个devops流水线,并创建好相关流程。流水线的第2步,是我在k8s内部作了一个nginx站点,放置了新版的nodej的rpm安装包,

实现使用kubesphere的base镜像安装nodejs-16.x版本。并且k8s部署使用的deploy/deploy.yaml文件,会部署容器并创建一个service,再创建

一个ingress域名访问service,已经提前在k8s中安装了ingress,并监听了80,443端口(方法可以看这里https://www.micoder.cc/blog/2553.html)。

如下图:








3,流水线可以使用参数变量来构建,主要流程- git代码 ---->  nodejs打包(建议直接使用docker中的容器打包,而不是使用kubesphere的低版本的镜像)  ----> 镜像构建,上传-------> 部署至k8s。
具体 Jenkinsfile内容如下:


pipeline {
  agent {
    node {
      label 'base'
    }


  }
  stages {
    stage('checkout') {
      agent none
      steps {
        container('base') {
          git(url: 'https://gitee.com/micoder/demo.git', branch: 'master', changelog: true, poll: false, credentialsId: 'gitee-id')
          sh 'ls -al'
        }


      }
    }


    stage('build') {
      agent none
      steps {
        container('base') {
          sh 'rpm -ivh http://nodejs-web.his/nodejs-16.rpm'
          sh 'npm -v'
          sh 'npm install --registry=https://registry.npm.taobao.org'
          sh 'npm run build:prod'
          sh 'ls -al dist'
        }


      }
    }


    stage('image-build') {
      agent none
      steps {
        container('base') {
          sh 'ls -al dist'
          sh 'docker build -t ui-web:latest -f Dockerfile .'
        }


      }
    }


    stage('image-push') {
      agent none
      steps {
        container('base') {
          sh 'docker tag ui-web:latest  $REGISTRY/$ALIYUNHUB_NAMESPACE/ui-web:SNAPSHOT-$BUILD_NUMBER'
          withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,)]) {
            sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
            sh 'docker push  $REGISTRY/$ALIYUNHUB_NAMESPACE/ui-web:SNAPSHOT-$BUILD_NUMBER'
          }


        }


      }
    }


    stage('deploy to dev') {
      agent none
      steps {
        container('base') {
          withCredentials([
                                    kubeconfigFile(
                                          credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                                          variable: 'KUBECONFIG')
                                      ]) {
                sh 'envsubst < deploy/deploy.yaml | kubectl apply -f -'
              }


            }


          }
        }


      }
      environment {
        DOCKER_CREDENTIAL_ID = 'aliyun-id'
        GITHUB_CREDENTIAL_ID = 'github-id'
        KUBECONFIG_CREDENTIAL_ID = 'k8s-demo'
        REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
        DOCKERHUB_NAMESPACE = 'ui-web'
        GITHUB_ACCOUNT = 'kubesphere'
        APP_NAME = 'ui-web'
        ALIYUNHUB_NAMESPACE = 'k8sops2021'
      }
    }


4,以上jenkinsfile中的environment中的都是参数变量,注意  KUBECONFIG_CREDENTIAL_ID = 'k8s-demo'

其中 k8s-demo是创建的kubeconfig凭证,在流水线中 显示 如下图。





5,deploy/deploy.yaml,是gitee项目中的k8s部署YAML文件。当然也可以直接使用ssh创建到k8s主机执行YAML文件,也是一样的效果。





三,最后运行流水线,提示运行成功,deployment,service,ingress都会配置完成。





转载请标明出处【kubesphere3+jenkins实现cicd部署nodejs前端项目】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论