Jenkins 使用 DockerInDocker 建構CI

Jenkins 使用 DockerInDocker 建構CI

Jenkins 在建構持續集成(CI)環境時,經常需要模擬多種不同的環境配置。然而,在資源有限的情況下,我們通常只有一台 CI/CD 機器可用。這種情況下,Docker in Docker(DinD)技術提供了一個強大而靈活的解決方案。本文將詳細說明如何利用 Docker in Docker 來在單一 Jenkins 伺服器上建構多樣化的 CI 環境。

Docker in Docker 允許我們在 Docker 容器內部運行另一個 Docker 守護程序,這使得我們能夠在單一主機上創建隔離的、可定制的構建環境。通過這種方法,我們可以:

  1. 在單一物理機器上模擬多種不同的操作系統和環境配置
  2. 確保每次構建都在乾淨、一致的環境中進行
  3. 提高資源利用率,減少硬體成本
  4. 快速切換和部署不同的構建環境

以下,我們將逐步說明如何在 Jenkins 中設置和使用 Docker in Docker

Step 1: 安裝Jenkins 及插件和所需環境

Stpe 2: 創建測試範本&運行


Step 1: 安裝Jenkins 及插件和所需環境

Jenkins 將透過Docker 進行安裝,安裝時會安裝些依賴跟插件 可以略過 裝ansible 及 sshpass 是因為CD時會用到 可以忽略不計 。

Jenkins 詳細安裝可以參考 建置Jenkins 分散式架構( Master+Slave ) 但要注意的是 該方案需要讓容器使用root 權限,以及將docker.sock 綁入容器中,會有容器權限問題,所以盡量安裝在 slave 機器 並且該機器不對外開放。

安裝完成後 將對外開放 9000 之後可透過 localhsot:9000 訪問 Jenkins。

# jenkins/Dockerfile 
 
FROM jenkins/jenkins:lts 
USER root 
RUN apt update && \ 
    apt-get install -y \ 
    ansible \ 
    vim \ 
    sshpass \   
    && curl -fsSL https://get.docker.com | sh \ 
    && usermod -aG docker jenkins  
 
 
# USER jenkins
# docker-compose.yml 
 
version: "3.7" 
services: 
  jenkins: 
    build: 
      context: jenkins 
      dockerfile: Dockerfile 
    container_name: jenkins 
    restart: always 
    volumes: 
      # - jenkins-data:/var/jenkins_home 
      - /var/run/docker.sock:/var/run/docker.sock 
    ports: 
      - 9000:8080 
    networks: 
      - devopsNet       
 
networks: 
  devopsNet: 
 
volumes: 
  jenkins-data:

這次要安裝外掛插件 DockerDocker Pipeline

Stpe 2: 創建測試範本&運行

可以通過一個簡單的例子來展示如何在 Jenkins 中使用 Docker in Docker 來運行一個基本的 Node.js 環境檢查。

首先,在你的專案根目錄創建一個名為 Jenkinsfile 的文件。這個文件將定義 Jenkins Pipeline 的步驟。

  1. Jenkinsfile 內容:
# Jenkinsfile 
 
pipeline { 
    agent any 
     
    stages{ 
        stage('CI build'){ 
            agent { 
                docker { 
                    image 'node:16' 
                } 
            } 
            steps{ 
                script{ 
                    // sh "npm ci" 
                    // sh "npm run build" 
                    sh "node -v" 
                } 
            }       
        } 
    } 
}

運行完成後 創建一個 Jenkins 任務 指定到剛剛創建的git 中 去運行 將會獲得以下結果 。

這個簡單的例子展示了如何使用 Docker in Docker 在 Jenkins 中創建一個隔離的環境來運行特定的命令或測試。你可以根據需要擴展這個 Jenkinsfile,添加更多的階段和步驟,例如運行測試、構建應用程序等。

通過這個基本設置,可以進一步探索更複雜的 CI/CD 場景,同時充分利用 Docker in Docker 的優勢。