簡體   English   中英

Kube.netes 集群 pod 作為 Jenkins 構建代理

[英]Kubernetes cluster pods as Jenkins Build Agents

我已經在我們的 Jenkins 中安裝了Kube.netes plugin - 1.23.3 ,並且能夠在 kube.netes pod(動態 Jenkins 從站)上執行 shell 命令。 這是使用默認的jnlp & jenkins/jnlp-slave:latest

假設如果我更改下面的“名稱”和“Docker 映像”部分以使用我們的私有注冊表和映像

Manage Jenkins --> Configure System--> Cloud --> Pod Template --> Container Template

Name: sonatype
Docker image:sonatype:4546/ubuntu-16.04

它不使用我們的私有 docker 圖像,甚至不在 pod 容器上運行 shell 命令。 這個想法是在 Kube.netes 集群 pod 上使用我們自己的 docker 圖像作為動態 Jenkins 構建代理來執行build + static analysis

如何使用我們私有的 docker 注冊表映像並將它們作為 kube.netes 集群中的 Jenkins slave 執行? 我有下面的腳本管道代碼。 K8S 工作節點的第 1 階段“SCM 代碼檢出”正在運行,接下來的第 2 階段構建將從template Kube.netes Pod Template啟動 pod 代理。 但如果失敗docker: not found 它似乎試圖在 pod 中拉取我們的注冊表映像。 我們的工作節點系統的代碼需要安裝在動態的 Jenkins 從 pod 中並執行構建和下一階段。 任何實現的方向都會有所幫助。

node ("kubupods") { 
       stage('Code Compile') { 
          sh 'hostname'
        }
                
      stage('Code Analysis') {    
         sh 'hostname'
    }
    }
    
 

Jenkins 默認會從 dockerhub 拉取鏡像。 在您的情況下,圖像 sonatype:4546/ubuntu-16.04。 如果您正在管道中構建,則為了使用私有注冊表,您需要提供私有注冊表及其憑據。 您可以在 UI 上提供它,也可以通過代碼來提供它。 參考這里

之后,您還需要告訴 kube.netes YAML 以及私有注冊表。 為此,您可以在此處參考。 這基本上是兩個步驟 a) 創建一個 kube.netes 秘密 b) 使用imagepullsecret字段告訴您的部署有關秘密。

確保將圖像引用為<username or registry URL/<image_name>:<tag(maybe $BUILD_NUMBER)>

=============== 添加問題后編輯 1 =====

使用 Jenkins 配置插件以安裝包。

  1. Go 管理 Jenkins

  2. 全局工具配置

  3. Docker -> 填寫名稱(例如:Docker-latest) 在此處輸入圖像描述 檢查自動安裝,然后添加安裝程序(從此處下載)。

  4. 然后保存

如果你已經安裝在你的機器上,那么更新 Jenkins 中的 PATH 變量到 Docker 的位置。

Jenkins 文件參考

上面 Tarun 的回答假設您正在管道中構建圖像。

我在我們的管道中做了類似的事情,但我們在管道外構建了一個自定義的 jnlp-slave 圖像(加載了我們需要的 CI/CD 工具),並在 kube.netes 插件 yaml 中引用它。

構建自定義 jnlp-slave 圖像。 (下面的 Dockerfile)

FROM jenkins/jnlp-slave:latest

# Download/install tools

ENTRYPOINT ["jenkins-slave"]

將自定義 jnlp-slave 鏡像推送到您的私有注冊表

docker build -t my-private-registry/jnlp-slave:custom .
docker push my-private-registry/jnlp-slave:custom

定義您的 Jenkinsfile,以便 pod 使用您在上一步中構建的圖像。

pipeline {
    agent {
        kubernetes {
            yaml """
apiVersion: v1
kind: Pod
metadata:
  label:
    jenkins: slave
spec:
  containers:
  - name: jnlp
    image: my-private-registry/jnlp-slave:custom
}}}

stages {
  stage("Test") {
    sh("hostname")
  }
}

我們的注冊表不需要身份驗證,但如果需要,您需要向 jenkins 提供秘密(如 Tarun 所述),以讓它在您的注冊表中進行身份驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM