1. 程式人生 > >初試 Jenkins 使用 Kubernetes Plugin 完成持續構建與釋出

初試 Jenkins 使用 Kubernetes Plugin 完成持續構建與釋出

目錄

1、Jenkins CI/CD 背景介紹

持續構建與釋出是我們日常工作中必不可少的一個步驟,目前大多公司都採用 Jenkins 叢集來搭建符合需求的 CI/CD 流程,然而傳統的 Jenkins Slave 一主多從方式會存在一些痛點,比如:主 Master 發生單點故障時,整個流程都不可用了;每個 Slave 的配置環境不一樣,來完成不同語言的編譯打包等操作,但是這些差異化的配置導致管理起來非常不方便,維護起來也是比較費勁;資源分配不均衡,有的 Slave 要執行的 job 出現排隊等待,而有的 Slave 處於空閒狀態;最後資源有浪費,每臺 Slave 可能是實體機或者 VM,當 Slave 處於空閒狀態時,也不會完全釋放掉資源。

由於以上種種痛點,我們渴望一種更高效更可靠的方式來完成這個 CI/CD 流程,而 Docker 虛擬化容器技術能很好的解決這個痛點,下圖是基於 Kubernetes 搭建 Jenkins 叢集的簡單示意圖。
這裡寫圖片描述

從圖上可以看到 Jenkins Master 和 Jenkins Slave 以 Docker Container 形式執行在 Kubernetes 叢集的 Node 上,Master 執行在其中一個節點,並且將其配置資料儲存到一個 Volume 上去,Slave 執行在各個節點上,並且它不是一直處於執行狀態,它會按照需求動態的建立並自動刪除。

這種方式的工作流程大致為:當 Jenkins Master 接受到 Build 請求時,會根據配置的 Label 動態建立一個執行在 Docker Container 中的 Jenkins Slave 並註冊到 Master 上,當執行完 Job 後,這個 Slave 會被登出並且 Docker Container 也會自動刪除,恢復到最初狀態。

這種方式帶來的好處有很多:

  • 服務高可用,當 Jenkins Master 出現故障時,Kubernetes 會自動建立一個新的 Jenkins Master 容器,並且將 Volume 分配給新建立的容器,保證資料不丟失,從而達到叢集服務高可用。
  • 動態伸縮,合理使用資源,每次執行 Job 時,會自動建立一個 Jenkins Slave,Job 完成後,Slave 自動登出並刪除容器,資源自動釋放,而且 Kubernetes 會根據每個資源的使用情況,動態分配 Slave 到空閒的節點上建立,降低出現因某節點資源利用率高,還排隊等待在該節點的情況。
  • 擴充套件性好,當 Kubernetes 叢集的資源嚴重不足而導致 Job 排隊等待時,可以很容易的新增一個 Kubernetes Node 到叢集中,從而實現擴充套件。

2、環境、軟體準備

本次演示環境,我是在本機 MAC OS 以及虛擬機器 Linux Centos7 上操作,以下是安裝的軟體及版本:

  1. Docker: version 17.09.0-ce
  2. Oracle VirtualBox: version 5.1.20 r114628 (Qt5.6.2)
  3. Minikube: version v0.22.2
  4. Kuberctl:
    • Client Version: v1.8.1
    • Server Version: v1.7.5

注意:Minikube 啟動的單節點 k8s Node 例項是需要執行在本機的 VM 虛擬機器裡面,所以需要提前安裝好 VM,這裡我選擇 Oracle VirtualBox。k8s 執行底層使用 Docker 容器,所以本機需要安裝好 Docker 環境,Minikube 和 Kuberctl 的安裝過程可參考之前文章 初試 minikube 本地部署執行 kubernetes 例項

3、部署 Jenkins Server 到 Kubernetes

在執行部署之前,我們要確保 Minikube 已經正常執行,如果使用已搭建好的 Kubernetes 叢集,也要確保正常執行。接下來,我們需要準備部署 Jenkins 的 Yaml 檔案,可以參考
GitHub jenkinsci kubernetes-plugin 官網提供的 jenkins.yamlservice-account.yaml 檔案,這裡官網使用的是比較規範的 StatefulSet(有狀態叢集服務)方式進行部署,並配置了 Ingress 和 RBAC 賬戶許可權資訊。不過我本機測試的時候,發現 Volume 掛載失敗,日誌顯示沒有許可權建立目錄。所以我精簡了一下,重新寫了個以 Deployment 方式部署方式以及 Service 的配置檔案(這裡偷個懶,不使用 RBAC 認證了)。

$ cat jenkins-deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: jenkins
  labels:
    k8s-app: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: jenkins
  template:
    metadata:
      labels:
        k8s-app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: jenkins-home
          mountPath: /var/jenkins_home
        ports:
        - containerPort: 8080 
          name: web
        - containerPort: 50000
          name: agent
      volumes:
        - name: jenkins-home
          emptyDir: {}
$ cat jenkins-service.yml
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: jenkins
  name: jenkins
spec:
  type: NodePort
  ports:
    - port: 8080
      name: web
      targetPort: 8080
    - port: 50000
      name: agent
      targetPort: 50000
  selector:
    k8s-app: jenkins

說明一下:這裡 Service 我們暴漏了埠 8080 和 50000,8080 為訪問 Jenkins Server 頁面埠,50000 為建立的 Jenkins Slave 與 Master 建立連線進行通訊的預設埠,如果不暴露的話,Slave 無法跟 Master 建立連線。這裡使用 NodePort 方式暴漏埠,並未指定其埠號,由 Kubernetes 系統預設分配,當然也可以指定不重複的埠號(範圍在 30000~32767)。

接下來,通過 kubectl 命令列執行建立 Jenkins Service。

$ kubectl create namespace kubernetes-plugin
$ kubectl config set-context $(kubectl config current-context) --namespace=kubernetes-plugin
$ kubectl create -f jenkins-deployment.yaml
$ kubectl create -f jenkins-service.yml

說明一下:這裡我們建立一個新的 namespace 為 kubernetes-plugin,並且將當前 context 設定為 kubernetes-plugin namespace 這樣就會自動切換到該空間下,方便後續命令操作。

$ kubectl get service,deployment,pod
NAME      TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)                          AGE
jenkins   NodePort   10.0.0.204   <none>        8080:30645/TCP,50000:31981/TCP   1m

NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
jenkins   1         1         1            1           1m

NAME                      READY     STATUS    RESTARTS   AGE
jenkins-960997836-fff2q   1/1       Running   0          1m

此時,我們會發現 Jenkins Master 服務已經啟動起來了,並且將埠暴漏到 8080:3064550000:31981,此時可以通過瀏覽器開啟 http://<Cluster_IP>:30645 訪問 Jenkins 頁面了。當然也可以通過 minikube service ... 命令來自動開啟頁面。

$ minikube service jenkins -n kubernetes-plugin
Opening kubernetes service kubernetes-plugin/jenkins in default browser...
Opening kubernetes service kubernetes-plugin/jenkins in default browser...

在瀏覽器上完成 Jenkins 的初始化外掛安裝過程,並配置管理員賬戶資訊,這裡忽略過程,初始化完成後介面如下:
這裡寫圖片描述

注意: 初始化過程中,讓輸入 /var/jenkins_home/secret/initialAdminPassword 初始密碼時,因為我們設定的 emptyDir: {} 沒有掛載到外部路徑,可以進入到容器內部進行獲取。

$ kubectl exec -it jenkins-960997836-fff2q cat /var/jenkins_home/secrets/initialAdminPassword

4、Jenkins 配置 Kubernetes Plugin

管理員賬戶登入 Jenkins Master 頁面,點選 “系統管理” —> “管理外掛” —> “可選外掛” —> “Kubernetes plugin” 勾選安裝即可。
這裡寫圖片描述

安裝完畢後,點選 “系統管理” —> “系統設定” —> “新增一個雲” —> 選擇 “Kubernetes”,然後填寫 Kubernetes 和 Jenkins 配置資訊。
這裡寫圖片描述

說明一下:

  1. Name 處預設為 kubernetes,也可以修改為其他名稱,如果這裡修改了,下邊在執行 Job 時指定 podTemplate() 引數 cloud 為其對應名稱,否則會找不到,cloud 預設值取:kubernetes
  2. Kubernetes URL 處我填寫了 https://kubernetes.default 這裡我填寫了 Kubernetes Service 對應的 DNS 記錄,通過該 DNS 記錄可以解析成該 Service 的 Cluster IP,注意:也可以填寫 https://kubernetes.default.svc.cluster.local 完整 DNS 記錄,因為它要符合 <svc_name>.<namespace_name>.svc.cluster.local 的命名方式,或者直接填寫外部 Kubernetes 的地址 https://<ClusterIP>:<Ports>
  3. Jenkins URL 處我填寫了 http://jenkins.kubernetes-plugin:8080,跟上邊類似,也是使用 Jenkins Service 對應的 DNS 記錄,不過要指定為 8080 埠,因為我們設定暴漏 8080 埠。同時也可以用 http://<ClusterIP>:<Node_Port> 方式,例如我這裡可以填 http://192.168.99.100:30645 也是沒有問題的,這裡的 30645 就是對外暴漏的 NodePort。

配置完畢,可以點選 “Test Connection” 按鈕測試是否能夠連線的到 Kubernetes,如果顯示 Connection test successful 則表示連線成功,配置沒有問題。

5、測試並驗證

好了,通過 Kubernetes 安裝 Jenkins Master 完畢並且已經配置好了連線,接下來,我們可以配置 Job 測試一下是否會根據配置的 Label 動態建立一個執行在 Docker Container 中的 Jenkins Slave 並註冊到 Master 上,而且執行完 Job 後,Slave 會被登出並且 Docker Container 也會自動刪除吧!

5.1、pipeline 型別支援

建立一個 Pipeline 型別 Job 並命名為 my-k8s-jenkins-pipeline,然後在 Pipeline 指令碼處填寫一個簡單的測試指令碼如下:

def label = "mypod-${UUID.randomUUID().toString()}"
podTemplate(label: label, cloud: 'kubernetes') {
    node(label) {
        stage('Run shell') {
            sh 'sleep 130s'
            sh 'echo hello world.'
        }
    }
}

執行構建,此時去構建佇列裡面,可以看到有一個構建任務,暫時還沒有執行中的構建,因為還沒有初始化好,稍等一會,就會看到 Master 和 jenkins-slave-jbs4z-xs2r8 已經建立完畢,在等一會,就會發現 jenkins-slave-jbs4z-xs2r8 已經註冊到 Master 中,並開始執行 Job,點選該 Slave 節點,我們可以看到通過標籤 mypod-b538c04c-7c19-4b98-88f6-9e5bca6fc9ba 關聯,該 Label 就是我們定義的標籤格式生成的,Job 執行完畢後,jenkins-slave 會自動登出,我們通過 kubectl 命令列,可以看到整個自動建立和刪除過程。
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

# jenkins slave 啟動前,只有 jenkins master 服務存在
$ kubectl get pods
NAME                      READY     STATUS    RESTARTS   AGE
jenkins-960997836-fff2q   1/1       Running   0          1d

# jenkins slave 自動建立完畢 
$ kubectl get pods
NAME                        READY     STATUS    RESTARTS   AGE
jenkins-960997836-fff2q     1/1       Running   0          1d
jenkins-slave-jbs4z-xs2r8   1/1       Running   0          56s

# Docker Container 啟動服務情況
$ docker ps |grep jenkins
aa5121667601        jenkins/jnlp-slave                          "jenkins-slave bd880…"   About a minute ago   Up About a minute                       k8s_jnlp_jenkins-slave-jbs4z-xs2r8_kubernetes-plugin_25a91ed9-3337-11e8-a49f-08002744a3f1_0
d64deb0eaa20        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 About a minute ago   Up About a minute                       k8s_POD_jenkins-slave-jbs4z-xs2r8_kubernetes-plugin_25a91ed9-3337-11e8-a49f-08002744a3f1_0
995c1743552a        jenkins                                     "/bin/tini -- /usr/l…"   27 hours ago         Up 26 hours                             k8s_jenkins_jenkins-960997836-fff2q_kubernetes-plugin_27b5c7b2-3256-11e8-a49f-08002744a3f1_0
024d43257e9d        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 27 hours ago         Up 26 hours                             k8s_POD_jenkins-960997836-fff2q_kubernetes-plugin_27b5c7b2-3256-11e8-a49f-08002744a3f1_0

# jenkins slave 執行完畢自動刪除
$ kubectl get pods
NAME                        READY     STATUS        RESTARTS   AGE
jenkins-960997836-fff2q     1/1       Running       0          1d
jenkins-slave-jbs4z-xs2r8   0/1       Terminating   0          2m
$ kubectl get pods
NAME                      READY     STATUS    RESTARTS   AGE
jenkins-960997836-fff2q   1/1       Running   0          1d
$ docker ps |grep jenkins
995c1743552a        jenkins                                     "/bin/tini -- /usr/l…"   27 hours ago        Up 26 hours                             k8s_jenkins_jenkins-960997836-fff2q_kubernetes-plugin_27b5c7b2-3256-11e8-a49f-08002744a3f1_0
024d43257e9d        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 27 hours ago        Up 26 hours                             k8s_POD_jenkins-960997836-fff2q_kubernetes-plugin_27b5c7b2-3256-11e8-a49f-08002744a3f1_0

從上邊的操作日誌中,我們可以清晰的看到 Jenkins Slave 自動建立到登出刪除的過程,整個過程是自動完成的,不需要人工干預。

5.2、Container Group 型別支援

建立一個 Pipeline 型別 Job 並命名為 my-k8s-jenkins-container,然後在 Pipeline 指令碼處填寫一個簡單的測試指令碼如下:

def label = "mypod-${UUID.randomUUID().toString()}"
podTemplate(label: label, cloud: 'kubernetes', containers: [
    containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
  ]) {

    node(label) {
        stage('Get a Maven Project') {
            git 'https://github.com/jenkinsci/kubernetes-plugin.git'
            container('maven') {
                stage('Build a Maven project') {
                    sh 'mvn -B clean install'
                }
            }
        }
    }
}

注意:這裡我們使用的 containers 定義了一個 containerTemplate 模板,指定名稱為 maven 和使用的 Image,下邊在執行 Stage 時,使用 container('maven'){...} 就可以指定在該容器模板裡邊執行相關操作了。比如,該示例會在 jenkins-slave 中執行 git clone 操作,然後進入到 maven 容器內執行 mvn -B clean install 編譯操作。這種操作的好處就是,我們只需要根據程式碼型別分別製作好對應的編譯環境映象,通過指定不同的 container 來分別完成對應程式碼型別的編譯操作。模板詳細的各個引數配置可以參照 Pod and container template configuration

執行構建,跟上邊 Pipeline 類似,也會新建 jenkins-slave 並註冊到 master,不同的是,它會在 Kubernetes 中啟動我們配置的 maven 容器模板,來執行相關命令。
這裡寫圖片描述

這裡寫圖片描述

$ kubectl get pods
NAME                        READY     STATUS    RESTARTS   AGE
jenkins-960997836-fff2q     1/1       Running   0          1d
jenkins-slave-k2wwq-4l66k   2/2       Running   0          53s
$ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED              STATUS              PORTS               NAMES
8ed81ee3aad4        jenkins/jnlp-slave                          "jenkins-slave 4ae74…"   About a minute ago   Up About a minute                       k8s_jnlp_jenkins-slave-k2wwq-4l66k_kubernetes-plugin_90c2ee92-33ca-11e8-a49f-08002744a3f1_0
bd252f7e59c2        maven                                       "cat"                    About a minute ago   Up About a minute                       k8s_maven_jenkins-slave-k2wwq-4l66k_kubernetes-plugin_90c2ee92-33ca-11e8-a49f-08002744a3f1_0
fe22da050a53        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 About a minute ago   Up About a minute                       k8s_POD_jenkins-slave-k2wwq-4l66k_kubernetes-plugin_90c2ee92-33ca-11e8-a49f-08002744a3f1_0
995c1743552a        jenkins                                     "/bin/tini -- /usr/l…"   44 hours ago         Up 44 hours                             k8s_jenkins_jenkins-960997836-fff2q_kubernetes-plugin_27b5c7b2-3256-11e8-a49f-08002744a3f1_0
024d43257e9d        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 44 hours ago         Up 44 hours                             k8s_POD_jenkins-960997836-fff2q_kubernetes-plugin_27b5c7b2-3256-11e8-a49f-08002744a3f1_0

5.3、非 Pipeline 型別支援

Jenkins 中除了使用 Pipeline 方式執行 Job 外,通常我們也會使用普通型別 Job,如果也要想使用kubernetes plugin 來構建任務,那麼就需要點選 “系統管理” —> “系統設定” —> “雲” —> “Kubernetes” —> “Add Pod Template” 進行配置 “Kubernetes Pod Template” 資訊。

這裡寫圖片描述

注意:這裡的 Labels 名在配置非 pipeline 型別 Job 時,用來指定任務執行的節點。Containers 下的 Name 欄位的名字,這裡要注意的是,如果 Name 配置為 jnlp,那麼 Kubernetes 會用下邊指定的 Docker Image 代替預設的 jenkinsci/jnlp-slave 映象,否則,Kubernetes plugin 還是會用預設的 jenkinsci/jnlp-slave 映象與 Jenkins Server 建立連線,即使我們指定其他 Docker Image。這裡我隨便配置為 jnlp-slave,意思就是使用預設的 jenkinsci/jnlp-slave 映象來執行,因為我們暫時還沒製作可以替代預設映象的映象。

新建一個自由風格的 Job 名稱為 my-k8s-jenkins-simple,配置 “Restrict where this project can be run” 勾選,在 “Label Expression” 後邊輸出我們上邊建立模板是指定的 Labels 名稱 jnlp-agent,意思是指定該 Job 匹配 jnlp-agent 標籤的 Slave 上執行。

這裡寫圖片描述

執行構建後,跟上邊 Pipeline 一樣,符合我們的預期。

這裡寫圖片描述

這裡寫圖片描述

5.4、配置自定義 jenkins-slave 映象

通過 kubernetest plugin 預設提供的映象 jenkinsci/jnlp-slave 可以完成一些基本的操作,它是基於 openjdk:8-jdk 映象來擴充套件的,但是對於我們來說這個映象功能過於簡單,比如我們想執行 Maven 編譯或者其他命令時,就有問題了,那麼可以通過製作自己的映象來預安裝一些軟體,既能實現 jenkins-slave 功能,又可以完成自己個性化需求,那就比較不錯了。如果我們從頭開始製作映象的話,會稍微麻煩些,不過可以參考 jenkinsci/jnlp-slavejenkinsci/docker-slave 這兩個官方映象來做,注意:jenkinsci/jnlp-slave 映象是基於 jenkinsci/docker-slave 來做的。這裡我簡單演示下,基於 jenkinsci/jnlp-slave:latest 映象,在其基礎上做擴充套件,安裝 Maven 到映象內,然後執行驗證是否可行吧。

建立一個 Pipeline 型別 Job 並命名為 my-k8s-jenkins-container-custom,然後在 Pipeline 指令碼處填寫一個簡單的測試指令碼如下:

def label = "mypod-${UUID.randomUUID().toString()}"
podTemplate(label: label, cloud: 'kubernetes',containers: [
    containerTemplate(
        name: 'jnlp', 
        image: 'huwanyang168/jenkins-slave-maven:latest', 
        alwaysPullImage: false, 
        args: '${computer.jnlpmac} ${computer.name}'),
  ]) {

    node(label) {
        stage('stage1') {
            stage('Show Maven version') {
                sh 'mvn -version'
                sh 'sleep 60s'
            }
        }
    }
}

說明一下:這裡 containerTemplate 的 name 屬性必須叫 jnlp,Kubernetes 才能用自定義 images 指定的映象替換預設的 jenkinsci/jnlp-slave 映象。此外,args 引數傳遞兩個 jenkins-slave 執行需要的引數。還有一點就是這裡並不需要指定 container('jnlp'){...} 了,因為它被 Kubernetes 指定了要被執行的容器,所以直接執行 Stage 就可以了。

執行構建,看下效果如何吧!

這裡寫圖片描述

這裡寫圖片描述

$ kubectl get pods
NAME                        READY     STATUS    RESTARTS   AGE
jenkins-960997836-fff2q     1/1       Running   0          2d
jenkins-slave-9wtkt-d2ms8   1/1       Running   0          12m
bj-m-204072a:k8s-gitlab wanyang3$ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS               NAMES
b31be1de9563        huwanyang168/jenkins-slave-maven            "jenkins-slave 7cef1…"   12 minutes ago      Up About a minute                       k8s_jnlp_jenkins-slave-9wtkt-d2ms8_kubernetes-plugin_0ea4bc9d-33f3-11e8-a49f-08002744a3f1_0
b33b7ce3070e        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 12 minutes ago      Up About a minute                       k8s_POD_jenkins-slave-9wtkt-d2ms8_kubernetes-plugin_0ea4bc9d-33f3-11e8-a49f-08002744a3f1_0
995c1743552a        jenkins                                     "/bin/tini -- /usr/l…"   2 days ago          Up 2 days                               k8s_jenkins_jenkins-960997836-fff2q_kubernetes-plugin_27b5c7b2-3256-11e8-a49f-08002744a3f1_0
024d43257e9d        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 2 days ago          Up 2 days

當然,我們也可以使用非 Pipeline 型別指定執行該自定義 slave,那麼我們就需要修改 “系統管理” —> “系統設定” —> “雲” —> “Kubernetes” —> “Add Pod Template” 修改配置 “Kubernetes Pod Template” 資訊如下:

這裡寫圖片描述

然後同樣在 Job 配置頁面 “Label Expression” 後邊輸出我們上邊建立模板是指定的 Labels 名稱 jnlp-agent,就可以啦!測試妥妥沒問題的。

最後,貼一下我自定義的預安裝了 Maven 的 Jenkins-slave 映象的 Dockerfile ,當然大家可以基於此預安裝一些其他軟體,來完成日常持續構建與釋出工作吧。

FROM jenkins/jnlp-slave:latest

MAINTAINER huwanyang168@163.com

LABEL Description="This is a extend image base from jenkins/jnlp-slave which install maven in it."

# 切換到 root 賬戶進行操作
USER root

# 安裝 maven-3.3.9
RUN wget http://mirrors.sonic.net/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz && \
    tar -zxf apache-maven-3.3.9-bin.tar.gz && \
    mv apache-maven-3.3.9 /usr/local && \
    rm -f apache-maven-3.3.9-bin.tar.gz && \
    ln -s /usr/local/apache-maven-3.3.9/bin/mvn /usr/bin/mvn && \
    ln -s /usr/local/apache-maven-3.3.9 /usr/local/apache-maven

USER jenkins

參考資料

相關推薦

初試 Jenkins 使用 Kubernetes Plugin 完成持續構建釋出

目錄 1、Jenkins CI/CD 背景介紹 持續構建與釋出是我們日常工作中必不可少的一個步驟,目前大多公司都採用 Jenkins 叢集來搭建符合需求的 CI/CD 流程,然而傳統的 Jenkins Slave 一主多從方式會存在一些痛點,

使用Jenkins進行持續構建釋出應用到Kubernetes叢集中

本文已歸檔到kubernetes-handbook中的【最佳實踐—使用Jenkins進行持續構建與釋出】章節中,一切內容以kubernetes-handbook中穩準。 我們基於Jenkins的CI/

使用Wercker進行持續構建釋出

本文介紹了wercker和它的基本用法,並用我GitHub上的magpie應用作為示例,講解如何給GitHub專案增加wercker構建流程,並將生成的映象自動上傳到Docker Hub上。 CI工具 開源專案的構建離不開CI工具,你可能經常會在很多Gi

5分鐘在阿里雲Kubernetes服務上搭建jenkins環境並完成應用構建到部署的流水線作業

本文主要演示如何在阿里雲Kubernetes服務上快速搭建jenkins持續整合環境,並基於提供的示例應用快速完成應用原始碼編譯、映象構建和推送以及應用部署的流水線。 先決條件:阿里雲Kubernetes叢集。 一 快速開始 1. 部署jenkins 容器服務-Kubernetes -> 市場

【 專欄 】- DevOps系列之:持續構建整合

DevOps系列之:持續構建與整合 maven/gradle可以進行java的構建,與持續整合結合進行進一步的構建,生命期的延伸需要考慮到製品的儲存,形式的變化需要確認映象的構建與儲存。同時在此專欄中會整理Jenkins和其他工具

jenkins+Docker+maven專案持續構建及docker化

 1、安裝配置Jenkins服務和Docker服務(不贅述)   2、在Jenkins依託的宿主機上建立一個構建指令碼(/home/skyform/專案名/rollingupdate.sh) 3、編寫指令碼:    #!/usr/bin/sh    dockerHost=

【專案管理】Jenkins+Maven+Git專案持續構建之前言

         接下來的幾篇部落格,想系統的整理一下基於Jenkins+Maven+Git的專案持續構建自動部署系列。其實Jenkins、Nexus早在好幾年前就已經在使用了,這一次是想作為系統性的

想法:Github專案的持續構建釋出部署

Github上的專案可以用 travis https://travis-ci.org/ 做的持續構建。那麼,構建完的事情就是釋出和部署,是不是這個階段的工作可以用Docker來做。這樣就方便開源專案使用者更快上手,更快更安全地更新版本。 Travis剛剛做了這個事情: 不

【專案管理】Jenkins+Maven+Git專案持續構建之搭建git伺服器

gitlab和github兩者都是基於web的Git repositories(倉庫),擁有流水線型的web開發流程,它們為開發團隊儲存、分享、釋出、測試和合作web開發專案提供了中心化的、雲端儲存的場所。Git版本控制——對於多人共同開發一個project來說

使用Jenkins進行持續整合釋出

我們基於Jenkins的CI/CD流程如下所示。 流程說明 應用構建和釋出流程說明。 使用者向Gitlab提交程式碼,程式碼中必須包含Dockerfile 將程式碼提交到遠端倉庫 使用者在釋出應用時需要填寫git倉庫地址和分支、服務型別、服務名稱、資

使用JenkinsDocker持續整合釋出NetCore專案(實操篇)

# 使用Jenkins與Docker持續整合與釋出NetCore專案(教程一) 原文地址:[https://www.cnblogs.com/Jackyye/p/12588182.html](https://www.cnblogs.com/Jackyye/p/12588182.html) ## 基本環境 該教

使用Jenkins實現CocosCreator的自動化構建釋出(5)-增加SSH遠端操作

前面文章講述瞭如何實現CocosCreator的自動化構建和釋出,不過使用次數多了會發現一個問題:就是如果我們在Creator的構建選項中選定了“MD5”,則每次構建都會生成新的檔名,那麼每一次上傳新版本到伺服器時,因為新檔案不會覆蓋舊檔案,就會導致釋出目錄下的檔案越來越多。所以我們還希

使用Jenkins實現CocosCreator的自動化構建釋出(4)-增加Git管理

上篇文章講述了Jenkins如何一鍵構建和釋出Creator專案,不過構建的都是原生代碼。本篇文章講述如何通過Jenkins中結合程式碼Git管理,使本地提交程式碼、抓取最新程式碼、推送程式碼至Git伺服器等一套流程全跑通,並自動使用Git倉庫中的最新程式碼進行CocosCreator的

使用Jenkins實現CocosCreator的自動化構建釋出(3)-第一個Jenkins任務

上篇文章介紹瞭如何編寫Creator專案構建和釋出的Windows批處理,接下來我們將要在Jenkins中部署該任務,以實現真正的自動化。步驟如下: 1、建立Creator專案 首先用Creator新建一個HelloWorld專案,並通過Creator構建面板中試著構建一遍,確認

使用Jenkins實現CocosCreator的自動化構建釋出(1)-安裝Jenkins

簡介 Jenkins是個獨立的開源軟體專案,它是基於Java開發的一種持續整合工具,可用於實現各種任務的自動化,如構建,測試和部署等。 專案的日常開發中,編譯構建是每天頻繁要做的事情,如果開發的是H5遊戲,還需要把構建後的版本上傳到Web伺服器,這都會佔用或中斷程式設計師不少寶貴的編

使用Jenkins實現CocosCreator的自動化構建釋出(2)-自動化指令碼

本質上Jenkins是個視覺化的Web管理工具,執行的各種任務其實都是通過命令完成的,我們要做什麼任務,就為這個任務提供相應的命令。例如,Windows平臺是批處理命令。 所以我們首先學會使用命令列來構建CocosCreator專案,之後才能在Jenkins中實現一鍵自動化構建和釋出

使用Jenkins實現CocosCreator的自動化構建釋出(6)-增加使用者許可權管理

隨著Jenkins的使用深入,會發現需要給不同的使用者配置不同的使用許可權,雖然Jenkins自帶使用者許可權管理,但比較簡單,不支援使用者組和專案的劃分,因此需要第三方外掛來實現更精細的許可權管理,使用比較廣泛的是Role Strategy Plugin外掛,可以滿足所有關於使用者和許

記錄一次艱辛的Python包持續整合釋出過程

緣由 為了保證程式碼質量,編寫單元測試是非常必要的,特別是在團隊開發的過程中,編寫有效的單元測試保證每人編寫的模組能夠正常工作,以免專案後期出現各種不可預知的bug,因此,在提交程式碼前執行單元測試,可以有效保證程式碼的健壯性。這種工作當然是要自動化完成,因此

Jenkins持續整合構建

jenkins環境 [[email protected] ~]# ls anaconda-ks.cfg jdk-8u171-linux-x64.tar.gz TortoiseSVNv1.9.7.27907.zip install.log

Jenkins配合GitLab進行專案持續整合構建

    1. 按照博文《Centos7下Jenkins安裝》安裝好jenkins,確保外掛Git plugin和Subversion plugin已安裝     2. 配置JDK、Maven環境                   如下所示:              3.