Jenkins 使用 DockerInDocker 建構CI
Jenkins 在建構持續集成(CI)環境時,經常需要模擬多種不同的環境配置。然而,在資源有限的情況下,我們通常只有一台 CI/CD 機器可用。這種情況下,Docker in Docker(DinD)技術提供了一個強大而靈活的解決方案。本文將詳細說明如何利用 Docker in Docker 來在單一 Jenkins 伺服器上建構多樣化的 CI 環境。
Docker in Docker 允許我們在 Docker 容器內部運行另一個 Docker 守護程序,這使得我們能夠在單一主機上創建隔離的、可定制的構建環境。通過這種方法,我們可以:
- 在單一物理機器上模擬多種不同的操作系統和環境配置
- 確保每次構建都在乾淨、一致的環境中進行
- 提高資源利用率,減少硬體成本
- 快速切換和部署不同的構建環境
以下,我們將逐步說明如何在 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:
這次要安裝外掛插件 Docker
及 Docker Pipeline
。
Stpe 2: 創建測試範本&運行
可以通過一個簡單的例子來展示如何在 Jenkins 中使用 Docker in Docker 來運行一個基本的 Node.js 環境檢查。
首先,在你的專案根目錄創建一個名為 Jenkinsfile
的文件。這個文件將定義 Jenkins Pipeline 的步驟。
- 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 的優勢。