主頁 >  其他 > KubeSphere DevOps 流水線入門指南

KubeSphere DevOps 流水線入門指南

2022-11-02 07:42:39 其他

作者:趙海亮,浙江大學計算機專業四年級在讀博士生,研究方向為云計算、邊緣計算、分布式系統等,

雖然 KubeSphere 能夠將我們從 yaml 檔案的撰寫中解放出來,但是專案上云仍然十分繁瑣, 此外,一旦專案源代碼發生更替(如發布新功能或去除 bug 等),所有組件都需要重新經歷 “原始碼打包 --> 制作鏡像 --> 啟動容器” 這個流程, 這意味著,專案運維人員不得不從事大量重復性勞動,為了提高專案發布的效率,工業界引入了 DevOps 的概念,

本文首先將介紹 DevOps 是什么,隨后嘗試利用 KubeSphere 集成的功能來實作 DevOps,

什么是 DevOps

目前絕大多數互聯網公司將開發和系統管理劃分成不同的部門, 開發部門的驅動力通常是 “頻繁交付新特性”,而運維部門則更關注 IT 服務的可靠性和 IT 成本投入的效率, 兩者目標的不匹配,因而存在鴻溝,從而減慢了 IT 交付業務價值的速度, 為了解決這個問題,DevOps(Development 和 Operations 的組合詞)被提出, DevOps 的目的是在企業內部搭建一個自動化 “軟體交付” 和“架構變更”的流程,來使得構建、測驗、發布軟體能夠更加地快捷、頻繁和可靠,

實作 DevOps 通常需要多個軟體和工具的密切配合, 如圖 1 所示,DevOps 將軟體的交付流程依次劃分為 Plan、Code、Build、Test、Release、Deploy、Operate 以及 Monitor 這些階段, 當需求變更時,將會從 Monitor 重新平滑過渡至 Plan 階段,每個階段都有一系列的軟體和工具可供選擇, 對于任意專案,我們只需要基于這些軟體和工具 搭建一條自動化流水線 ,再設定類似于 “一旦代碼變更就自動執行” 這樣的鉤子函式,整個專案即可自動實作“持續集成 / 持續交付(CI/CD)”,這將大大減少重復勞動,

圖 1 DevOps 技術堆疊

KubeSphere DevOps 基于 Kubernetes Jenkins Agent 實作, 和傳統的 Jenkins Controller-Agent 架構不同的是,在 KubeSphere 中,Jenkins Agent 可以動態擴縮容,從而降低 CI/CD 對集群資源的盲目占用, KubeSphere 的 DevOps 用戶指南參見 https://kubesphere.io/zh/docs/devops-user-guide/, 本文將依照該指南將一個開源專案上云,

基于 DevOps 的專案部署

專案介紹

本次實驗要部署的專案叫做尚醫通,這是一個基于 Spring-Boot 實作的預約掛號統一平臺, 該專案一共包含三個子部分,分別為 yygh-parentyygh-siteyygh-admin, 在架構上,該專案依賴的資料層中間件有 mysql、redis、mongodb 以及 rabbitmq,依賴的流量治理中間件有 sentinel 和 nacos,

接下來,我們約定專案根目錄為 his,然后分別從開源地址 https://gitee.com/leifengyang/yygh-parent、https://gitee.com/leifengyang/yygh-site 和 https://gitee.com/leifengyang/yygh-admin 拉取源代碼:

(base) ?  his lsa
total 0
drwxr-xr-x   5 hliangzhao  staff   160B Nov 15 10:33 .
drwxr-xr-x@ 42 hliangzhao  staff   1.3K Nov 15 10:33 ..
drwxr-xr-x  24 hliangzhao  staff   768B Nov 15 10:33 yygh-admin
drwxr-xr-x  15 hliangzhao  staff   480B Nov 15 10:33 yygh-parent
drwxr-xr-x  24 hliangzhao  staff   768B Nov 15 10:34 yygh-site

依次查看三個專案的檔案布局:

(base) ?  his cd yygh-parent
(base) ?  yygh-parent git:(master) tree -L 2
.
├── common                      # 通用模塊
│   ├── common-util
│   ├── pom.xml
│   ├── rabbit-util
│   └── service-util
├── data                        # 專案演示資料
│   ├── json
│   └── sql
├── hospital-manage             # 醫院后臺
│   ├── Dockerfile
│   ├── deploy
│   ├── pom.xml
│   ├── src
├── model                       # 資料模型
│   ├── pom.xml
│   └── src
├── pom.xml
├── server-gateway              # 網關
│   ├── Dockerfile
│   ├── deploy
│   ├── pom.xml
│   └── src
├── service                     # 微服務層
│   ├── pom.xml
│   ├── service-cmn             # 公共服務
│   ├── service-hosp            # 醫院資料服務
│   ├── service-order           # 預約下單服務
│   ├── service-oss             # 物件存盤服務
│   ├── service-sms             # 短信服務
│   ├── service-statistics      # 統計服務
│   ├── service-task            # 定時服務
│   └── service-user            # 會員服務
└── service-client
    ├── pom.xml
    ├── service-cmn-client
    ├── service-hosp-client
    ├── service-order-client
    └── service-user-client

30 directories, 12 files
(base) ?  yygh-parent git:(master) cd ../yygh-admin
(base) ?  yygh-admin git:(master) tree -L 1        # 醫院掛號后臺(前端 UI)
.
├── Dockerfile
├── LICENSE
├── build
├── config
├── deploy
├── favicon.ico
├── index.html
├── package.json
├── src
└── static

5 directories, 9 files
(base) ?  yygh-site git:(master) tree -L 1        # 用戶掛號前臺(前端 UI)
.
├── Dockerfile
├── api
├── assets
├── components
├── deploy
├── layouts
├── middleware
├── nuxt.config.js
├── package-lock.json
├── package.json
├── pages
├── plugins
├── static
├── store
└── utils

11 directories, 7 files

對于本專案,我們需要部署如下內容:

yygh-parent/hospital-manage         # 醫院管理
yygh-parent/server-gateway          # 網關
# 8 個微服務
yygh-parent/service/service-cmn
yygh-parent/service/service-hosp
yygh-parent/service/service-order
yygh-parent/service/service-oss
yygh-parent/service/service-sms
yygh-parent/service/service-statistics
yygh-parent/service/service-task
yygh-parent/service/service-user
# 2 個前端
yygh-admin
yygh-site

以上 12 個待部署的子專案將以獨立 Pod 的形式在集群中部署, 每一個子專案根目錄需要具有一個 Dockerfile 檔案以及一個名為 deploy 的檔案夾, 前者是本子專案的鏡像制作檔案,后者是本子專案的資源清單檔案 *.yaml(用于在集群中部署), 以 service-cmn 為例,其檔案布局如下:

(base) ?  service-cmn git:(master) tree -L 2
.
├── Dockerfile        # 將本子專案構建為鏡像的 Dockerfile
├── deploy            # 存放用于部署本子專案的資源清單檔案
│   └── deploy.yml
├── pom.xml           # 專案依賴
├── src               # 源代碼
│   └── main
└── target            # maven 打包后自動創建

遵循上的一篇文章 使用 KubeSphere 部署 Ruoyi-Cloud · KS 實踐 02 中所述的部署流程,我們首先需要將中間件上云,然后,我們將三個專案以流水線的方式上云,

部署中間件

本專案所使用的中間件除了 Sentinel 和 MongoDB,其他均已在前文中部署, 接下里依次部署這兩個中間件,

對于 Sentinel,我們直接使用雷豐陽已經制作好的鏡像 leifengyang/sentinel:1.8.2,然后暴露一個 NodePort 型別的 Service,埠號為 32636, 訪問 http://192.168.23.160:32636,以默認用戶 sentinel 和默認密碼 sentinel 登錄,可以進入 Sentinel 控制臺, 如果一切順利,應該可以看到類似的頁面:

圖 2 訪問 sentinel 暴露的 NodePort 型別的 Service

對于 MongoDB,我們直接通過應用模版部署它(不勾選登錄認證):

圖 3 Bitnami 官方鏡像倉庫提供的 MongoDB

為 MongoDB 應用暴露一個 NodePort 型別的 Service,埠號為 31801,然后在本機通過 MongoDB Compass 連接它(192.168.23.160:31801):

圖 4 使用 MongoDB Compass 連接 MongoDB 實體

如果可以連上,則一切正常,

匯入初始資料

使用 DataGrip 將位于 his/yygh-parent/data/sql 目錄下的全部演示資料(一共有 5 個 sql 檔案需要執行,會創建 5 個 yygh 打頭的資料庫)匯入集群中的 MySQL 實體:

圖 5 匯入資料至集群 MySQL 實體中

MongoDB 的演示資料將在專案啟動后匯入,

在 Nacos 中創建微服務的啟動配置

觀察每一個子專案的 Dockerfile,以 service-cmn 為例:

# service-cmn 的 Dockerfile
FROM openjdk:8-jdk
LABEL maintainer=leifengyang

# 啟動 prod 環境,以 service-cmn-prod.yml 作為啟動配置
ENV PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.server-addr=his-nacos.his:8848 --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

COPY target/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8  -Djava.security.egd=file:/dev/./urandom -jar /app.jar ${PARAMS}"]

這意味著該子專案在啟動時,會激活 prod 環境,并從 Nacos 中讀取 service-cmn-prod.yml 檔案作為啟動配置, 因此,我們首先需要在 Nacos 中創建其生產環境組態檔 service-cmn-prod.yml,然后將 子專案路徑 / src/main/resources/application-dev.yml 的內容復制進去,在其基礎上修改, 需要修改的內容主要是中間件的訪問地址, 以 service-cmn 為例,它的組態檔被命名為 service-cmn-prod.yml,其最終內容如下:

# service-cmn-prod.yml
server:
  port: 8080
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/*.xml
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0
spring:
  cloud:
    sentinel:
      transport:
        # 修改 sentinel 訪問地址
        dashboard: http://his-sentinel-nodeport.his:8080
  redis:
    # 修改 redis 訪問地址
    host: his-redis-nodeport.his
    port: 6379
    database: 0
    timeout: 1800000
    password:
    lettuce:
      pool:
        max-active: 20      # 最大連接數
        max-wait: -1        # 最大阻塞等待時間 (負數表示沒限制)
        max-idle: 5         # 最大空閑
        min-idle: 0         # 最小空閑
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    # 修改 mysql 訪問地址和連接憑證
    url: jdbc:mysql://his-mysql-nodeport.his:3306/yygh_cmn?characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456
    hikari:
      connection-test-query: SELECT 1
      connection-timeout: 60000
      idle-timeout: 500000
      max-lifetime: 540000
      maximum-pool-size: 12
      minimum-idle: 10
      pool-name: GuliHikariPool
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

如圖 6 所示,除了 hospitla-manage,其余所有 9 個 Spring-Boot 子專案均需要按照上述規則撰寫對應的組態檔, hospitla-manage 的啟動不依賴 Nacos,因此不需要,

圖 6 所有微服務的配置均已在 Nacos 中添加

創建微服務部署流水線

流水線表示應用從代碼編譯、測驗、打包和部署的程序,KubeSphere 的流水線管理使用了業界常用的 Jenkinsfile 來表述一組 CI/CD 流程, Jenkinsfile 是一個文本檔案,使用了 Jenkins 提供的 DSL(Domain-Specific Language)語法, KubeSphere 提供了可視化編輯器,用戶只需在頁面上輸入少量配置資訊,介面自動組裝完成 Jenkinsfile, 當然,也可直接編輯 Jenkinsfile,

流水線涉及如下幾個概念:

  • Stage:階段,一個 Pipeline 可以劃分為若干個 Stage,每個 Stage 代表一組操作,Stage 是一個邏輯分組的概念,可以跨多個 Node,
  • Node:節點,一個 Node 就是一個 Jenkins 節點,或者是 Master,或者是 Agent,是執行 Step 的具體運行時環境,
  • Step:步驟,Step 是最基本的操作單元,小到創建一個目錄,大到構建一個 Docker 鏡像,由各類 Jenkins Plugin 提供,

KubeSphere 默認提供的 Agent 有 base、go、maven 和 nodejs,它們分別適用于不同編程語言開發的專案的打包構建, 因為我們即將部署的 10 個子專案均是 Spring-Boot 應用,因此我們選擇 maven 作為啟動流水線的 agent,

我們可以直接撰寫流水線的 Jenkinsfile,也可以通過 KubeSphere 提供的可視化頁面編輯流水線, 通常,流水線的第一步是下載專案源代碼 4,我們在 UI 上直接添加相關命令:

圖 7 基于 UI 編輯流水線第一步:原始碼拉取

KubeSphere 會自動生成這次編輯的 Jenkinsfile 代碼片段:

stage('clone code') {
  agent none
  steps {
    // 拉取代碼并展示代碼檔案布局
    container('maven') {
      git(url: 'https://gitee.com/leifengyang/yygh-parent', branch: 'master', changelog: true, poll: false)
      sh 'ls -al'
    }
  }
}

流水線的第二個階段通常是專案的打包與編譯, 默認情況下,Maven 從官方倉庫下載專案依賴,如果想要修改默認鏡像倉庫,需要修改集群中名為 ks-devops-agent 的 ConfigMap,它擁有一個叫做 MavenSetting 的鍵:

k8s@ubuntu:~$ k get cm -A | grep devops
his-devopsqxxv7                   istio-ca-root-cert                                           1      24h
his-devopsqxxv7                   kube-root-ca.crt                                             1      24h
kubesphere-devops-system          devops-config                                                1      5d7h
kubesphere-devops-system          devops-jenkins                                               9      5d7h
kubesphere-devops-system          istio-ca-root-cert                                           1      5d7h
kubesphere-devops-system          jenkins-agent-config                                         1      5d7h
kubesphere-devops-system          jenkins-casc-config                                          2      5d7h
kubesphere-devops-system          kube-root-ca.crt                                             1      5d7h
kubesphere-devops-worker          istio-ca-root-cert                                           1      5d7h
kubesphere-devops-worker          ks-devops-agent                                              1      5d7h
kubesphere-devops-worker          kube-root-ca.crt                                             1      5d7h
k8s@ubuntu:~$ k describe cm ks-devops-agent -n kubesphere-devops-worker
Name:         ks-devops-agent
Namespace:    kubesphere-devops-worker
Labels:       app.kubernetes.io/managed-by=Helm
Annotations:  meta.helm.sh/release-name: devops
              meta.helm.sh/release-namespace: kubesphere-devops-system

Data
=https://www.cnblogs.com/kubesphere/p/===
MavenSetting:
----
<?xml version="1.0" encoding="UTF-8"?>
...
<!--
 | This is the configuration file for Maven. It can be specified at two levels:
...
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
...

我們需要修改 MavenSetting 檔案,在其中添加國內鏡像倉庫地址:

圖 8 為 Maven 添加國內鏡像倉庫地址

我們通過命令 mvn clean package -Dmaven.test.skip=true 進行專案打包編譯,由此,流水線的第二階段需要執行的命令如下:

圖 9 流水線的第二步:專案打包與編譯

相應地,在 Jenkinsfile 中也會自動生成第二步的代碼:

stage('project compilation') {
  agent none
  steps {
    container('maven') {
      sh 'mvn clean package -Dmaven.test.skip=true'
    }
  }
}

流水線的第三個階段是制作鏡像,我們在章節 2.1 說過,每個子專案的根目錄有一個 Dockerfile,并且在章節 2.4 展示過 Dockerfile 的內容, 因此,對于單體應用 hospitla-manage,它的鏡像構建命令為 docker build -t hospital-manage -f hospital-manage/Dockerfile hospital-manage/;對于網關子專案 server-gateway,它的鏡像構建命令為 docker build -t server-gateway/Dockerfile server-gateway/;其余 8 個微服務的構建命令則是 docker build -t service/service-xxx service/service-xxx/,這里的 xxx 被替換為具體的微服務名稱, 在上述構建命令中,尤其需要注意的是 Dockerfile 相對于專案根目錄 yygh-parent 所在的位置以及鏡像構建背景關系的相對位置,

因為上述 10 個鏡像的構建相互之間獨立,因此可以并行化執行,我們可以很輕易地在 KubeSphere 中做到這一點:

圖 10 流水線的第三步:并行化鏡像制作

相應地,Jenkinsfile 中增加了如下內容:

stage('default-2') {
  parallel {    // 并行構建 10 個鏡像
    stage('build hospital-manage') {
      agent none
      steps {
        container('maven') {
          sh 'docker build -t hospital-manage -f hospital-manage/Dockerfile hospital-manage/'
        }
      }
    }
    stage('build server-gateway') {
      ...
    }
    stage('build service-cmn') {
      ...
    }
    ...
  }
}

流水線的第四個階段是鏡像推送,在企業內部,構建好的鏡像通常會被推送到企業的私有倉庫中, 筆者采用阿里云給個人開發者免費提供的鏡像倉庫作為推送目標,因為目標倉庫是一個私有倉庫,因此需要提供賬戶和密碼作為憑證(credential), 如何在 KubeSphere 中為鏡像推送命令提供憑證呢? 我們可以在 DevOps 的專案設定中創建:

圖 11 在 DevOps 的專案設定中創建憑證

上圖中,筆者創建一個名為 aliyun-docker-hub 的憑證,用戶名是我的阿里云賬戶名,密碼則是申請容器鏡像服務所創建的密碼, 讀者需要替換成自己的賬戶密碼:

圖 12 為流水線創建憑證 aliyun-docker-hub

基于該憑證,我們在 Jenkinsfile 中撰寫鏡像推送的代碼如下:

steps {
  container('maven') {
    // 使用'aliyun-docker-registry'這個憑證登錄私有倉庫并將鏡像推送至其中
    withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry', passwordVariable: 'ALIYUN_REG_PWD', usernameVariable : 'ALIYUN_REG_USER' ,)]) {
      sh 'echo"$ALIYUN_REG_PWD"| docker login $REGISTRY -u"$ALIYUN_REG_USER"--password-stdin'
      sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
      sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
    }
  }
}
...
environment {
  ...
  REGISTRY = 'registry.cn-hangzhou.aliyuncs.com'
  DOCKERHUB_NAMESPACE = 'hliangzhao-private'
  ...
}

同樣地,上述程序也以并行的方式執行,最終,Jenkinsfile 中被添加了如下代碼:

stage('default-3') {
  parallel {   // 并行推送 10 個鏡像
    stage('push hospital-manage') {
      agent none
      steps {
        container('maven') {
          withCredentials([usernamePassword(credentialsId : 'aliyun-docker-registry' ,passwordVariable : 'ALIYUN_REG_PWD' ,usernameVariable : 'ALIYUN_REG_USER' ,)]) {
            sh 'echo"$ALIYUN_REG_PWD"| docker login $REGISTRY -u"$ALIYUN_REG_USER"--password-stdin'
            sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
            sh 'docker push $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
          }
        }
      }
    }
    stage('push server-gateway') {
      ...
    }
    stage('push service-cmn') {
      ...
    }
    ...
  }
}

測驗一下到目前為止的流水線,一切運行順利:

圖 13 測驗流水線

流水線的最后階段是部署到開發環境和生產環境,因為這一階段需要和 Kubernetes API Server 打交道,所以需要指定 Kubernetes 背景關系 5, KubeSphere 自動為我們創建了名為 demo-kubeconfig 的憑證,該憑證提供了形如 .kube/config 的檔案,使得我們可以根據憑證發起 kubectl apply 命令, 與此同時,我們還需要指定待部署的資源清單檔案的位置, 以子專案 hospital-manage 為例,它的資源清單檔案在 yygh-parent/hospital-manage/deploy/ 目錄下, 觀察該目錄下的 deploy.yaml 檔案,可以發現它要求集群從阿里云私有鏡像倉庫拉取鏡像,需要我們提供 imagePullSecrets 欄位:

圖 14 從阿里云私有鏡像倉庫拉取鏡像

這意味著我們需要在 his 專案中創建名為 aliyun-docker-hub 的 Secret, 注意,這里是在為 his 專案創建 Secret,而先前是在 DevOps 的專案設定中創建 Credential,二者的服務物件是不同的, 對于部署這個操作,我們可以直接在 UI 上選擇 “添加 kubernetesDeploy”:

圖 15 在流水線中添加 kubernetesDeploy 這一步驟

由此生成的 Jenkinsfile 代碼為

stage('deploy hospital-manage to dev') {
  agent none
  steps {
    container('maven') {
      kubernetesDeploy(enableConfigSubstitution: true,
        deleteResource: false,
        kubeconfigId: 'demo-kubeconfig',          // 存盤了 kubeconfig 背景關系資訊的檔案
        configs: 'hospital-manage/deploy/**'      // 資源清單檔案所在位置
      )
    }
  }
}

我們嘗試運行一下現在的流水線,詭異的事情卻發生了,在專案部署階段產生了如下錯誤:

Starting Kubernetes deployment
Loading configuration: /home/jenkins/agent/workspace/his-devopsqxxv7/yygh-parent-devops/hospital-manage/deploy/deploy.yml
ERROR: ERROR: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: Bad Request
hudson.remoting.ProxyException: java.lang.RuntimeException: io.kubernetes.client.openapi.ApiException: Bad Request
  at com.microsoft.jenkins.kubernetes.wrapper.ResourceManager.handleApiExceptionExceptNotFound(ResourceManager.java:180)
  ...
Api call failed with code 400, detailed message: {
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
  },
  "status": "Failure",
  "message": "the export parameter, deprecated since v1.14, is no longer supported",
  "reason": "BadRequest",
  "code": 400
}
Kubernetes deployment ended with HasError

觀察報錯內容,似乎是負責執行流水線的 Jenkins Agent 版本太老所導致的, 經過查閱,筆者發現 KubeSphere 的官方維護人員已經提交了相關 issue(https://github.com/kubesphere/website/issues/2096)來說明此事,根據說明,報錯的根源在于 Jenkins 的官方插件 kubernetes-cd-plugin “年久失修”,我所安裝的 Kubernetes 的 API 版本是 v1.22,而 Jenkins 的 kubernetes-cd-plugin 卻已經停擺兩年, 對于這個問題,KubeSphere 官方提供的解決方案是以 shell 命令 kubectl apply -f your-crd-file.yaml 的方式進行部署,而非在 UI 上添加 kubernetesDeploy

幸運的是,在筆者撰寫此文的 40 分鐘前,KubeSphere 官方發起了一個針對此問題的臨時解決方案:https://github.com/kubesphere/website/pull/2098, 在該 Pull request 中,貢獻者提供了一種提供 kubeconfig 驗證的寫法:

stage('deploy hospital-manage to dev') {
  agent none
  steps {
    container('maven') {
      // 如果不提供 kubeconfigFile,則 kubectl 背景關系找不到
      withCredentials([kubeconfigFile(credentialsId: env.KUBECONFIG_CREDENTIAL_ID, variable: 'KUBECONFIG')]) {
        sh 'kubectl apply -f hospital-manage/deploy/**'
      }
    }
  }
}

實驗證明,該方法有效,同樣地,10 個子專案可以并行化部署到 dev 環境,相應的 Jenkins 代碼就不再展示了, 部署到 prod 環境的操作類似,此外,還可以添加部署條件,例如,只有獲得相關管理員授權之后部署操作才會啟動,

創建前端專案部署流水線

接下來,還剩兩個前端專案 yygh-siteyygh-admin 需要部署, 前端專案的部署服從相似的步驟:首先下載原始碼,然后需要通過 Node.js 之類的工具為專案安裝依賴并構建(產生 dist 目錄),最后是鏡像構建、推送和部署, 以 yygh-site 為例,它最終的 Jenkinsfile 如下所示:

pipeline {
    agent {
        node {
            label 'nodejs'
        }
    }
    stages {
        stage('拉取代碼') {
            agent none
            steps {
                container('nodejs') {
                  git(url: 'https://gitee.com/leifengyang/yygh-site', branch: 'master', changelog: true, poll: false)
                  sh 'ls -al'
                }
            }

        }
        stage('專案編譯') {
            agent none
            steps {
                container('nodejs') {
                    sh 'ls'
                    sh 'npm install --registry=https://registry.npm.taobao.org'
                    sh 'npm run build'
                }
            }
        }
        stage('構建鏡像') {
            agent none
            steps {
                container('nodejs') {
                    sh 'ls'
                    sh 'docker build -t yygh-site:latest -f Dockerfile  .'
                }

            }
        }
        stage('推送鏡像') {
            agent none
            steps {
                container('nodejs') {
                    withCredentials([usernamePassword(credentialsId: 'aliyun-docker-registry', usernameVariable: 'DOCKER_USER_VAR', passwordVariable: 'DOCKER_PWD_VAR',)]) {
                        sh 'echo"$DOCKER_PWD_VAR"| docker login $REGISTRY -u"$DOCKER_USER_VAR"--password-stdin'
                        sh 'docker tag yygh-site:latest $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-site:SNAPSHOT-$BUILD_NUMBER'
                        sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/yygh-site:SNAPSHOT-$BUILD_NUMBER'
                    }
                }
            }
        }
        stage('部署到 dev 環境') {
            agent none
            steps {
                kubernetesDeploy(configs: 'deploy/**', enableConfigSubstitution: true, kubeconfigId: "$KUBECONFIG_CREDENTIAL_ID")
            }
        }
        // 1、配置全系統的郵件:                   全系統的監控
        // 2、修改 ks-jenkins 的配置,里面的郵件;   流水線發郵件
        stage('發送確認郵件') {
            agent none
            steps {
                mail(to: '[email protected]', subject: 'yygh-site 構建結果', body: "成功構建 $BUILD_NUMBER")
            }
        }
    }
    environment {
      ...
    }
}

此處不再展示更多細節,

總結

KubeSphere 為我們提供了 Jenkins 流水線的編輯頁面,在一定程度上可以簡化操作,

參考

本文參考了雷豐陽的視頻課程 云原生 Java 架構師的第一課 K8s+Docker+KubeSphere+DevOps, 如果想全面而深入地自主實踐,推薦觀看原視頻,

本文由博客一文多發平臺 OpenWrite 發布!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/524976.html

標籤:其他

上一篇:代碼隨想錄演算法訓練營第七天|454、四數相加Ⅱ|383、贖金信|15、三數之和|18、四數之和

下一篇:案例解讀華為隱私計算產品TICS如何實作城市跨部門資料隱私計算

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more