在昨天 Multibranch Pipeline 的示範中,可以發現我們為了做測試環境是非常的煞費苦心,而且為了要做出 python 的 virtualenv,我們的 Jenkins agent 也必須先安裝對應的 python 版本,
例如: 我們想要有 python3.7.11 的虛擬環境,則 agent 就必須先安裝 python3.7.11,但是當我們有要測試 python3.8 時,則必須先額外裝 python3.8 ...... 老實說不是不可以,只是很容易一個不小心把整台 jenkins agent 安裝的亂七八糟的 QQ
所以今天我們要用更加彈性的方式來做我們的測試環境 - Docker Pipeline
pipeline{
......
stage("Setup virtual env"){
steps{
sh '''#!/bin/bash
virtualenv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install pylint
pip3 install pytest
'''
}
}
stage("Lint"){
steps{
sh '''
source venv/bin/activate
export PYTHONPATH=${PWD}
pylint --fail-under=10 src
'''
}
}
stage("Test"){
steps{
sh '''
source venv/bin/activate
export PYTHONPATH=${PWD}
pytest tests
'''
}
}
......
}
在說到 Docker Pipeline 之前我們先來前情提要一下,在我們一般下的 docker 指令,其實我們是對他底層的 demaon unix:///var/run/docker.sock
進行操作,例如 docker ps => curl {{ DOCKER_HOST }}:2375/images/json
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-08-29 08:36:25 UTC; 3 weeks 0 days ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 18233 (dockerd)
Tasks: 10
Memory: 171.8M
CGroup: /system.slice/docker.service
└─18233 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
故一般我們在操作 docker 指令,就是和本地的 Daemon 去做交互行為。並且一般的 docker daemon 預設並不會公開給其他 server 使用,但是為了要讓我們實作遠端操作 docker daemon,接下來會教大家如何開啟 docker daemon 的 tcp 接口。
為了講解方便,故審略 security 的部分,故以下內容只建議在測試環境運行
sudo systemctl edit docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
sudo systemctl daemon-reload
systemctl restart docker
測試是否可以正常 requests 本地 docker daemon api。
進入 client 機 export DOCKER_HOST="tcp://{{ docker-cloud }}:4243"
,可以發現我們可以在 client 端用 docker images 正確提取遠端內容。
這裡的 Docker Host URI 我們可以想成是 export DOCKER_HOST
,所以在裡面輸入 tcp://{{ docker-cloud }}:4243
,並設定對應 docker 最新API 版本號,參考設定如下:
備註:
Use this node as much as possible
範例用 Jenkinsfile
pipeline {
agent none
stages {
stage('Build') {
agent {
docker { image 'gradle:6.7-jdk11' }
}
steps {
sh 'gradle --version'
}
}
}
}
在 Docker Pipeline 的加持之下,讓 Jenkins CI 的有了更多的可能性,明天我們將會重構 ithome-crawler 的 CI pipeline。
https://www.evanlin.com/til-docker-remote-api/
https://hackmd.io/@JYU/B1w9NDGnD