在寫測試代碼時并蝗,我們會 mock 各種外部服務(wù)(比如測轉(zhuǎn)賬祭犯,顯然不能真的調(diào)用銀行轉(zhuǎn)賬接口),但不會 mock 基礎(chǔ)設(shè)施滚停,比如 MySQL沃粗、Redis、Elasticsearch铐刘。
而且跑測試用的 MySQL 等服務(wù)都是一次性的陪每,跑完就清空數(shù)據(jù)不再需要了,所以買臺服務(wù)器長期開著是不劃算的镰吵。最佳實踐是:測試時啟動多個 Docker 后臺服務(wù)檩禾。
在 CircleCI 中,啟動多個 Docker image 很方便疤祭,但不支持 Dockerfile盼产,導(dǎo)致 Dockerfile 和 config.yml 重復(fù),違反 DRY勺馆。
在 Jenkins 中也可以實現(xiàn)戏售,而且更強(qiáng)大(支持 Dockerfile)。
查看 Jenkins 官方文檔草穆,發(fā)現(xiàn) sidecar 只支持2個 Docker灌灾,無法支持3個(比如 MySQL、Redis 作為服務(wù)悲柱,debian 跑 tests)锋喜;而且用了 link,已被 Docker 官方淘汰:
Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link.
按照 Docker 官方推薦豌鸡,創(chuàng)建一個網(wǎng)絡(luò)即可嘿般。關(guān)鍵在于等待啟動成功,代碼如下(完整代碼):
node {
checkout scm
sh 'docker network create bridge1';
sh(script:'docker run --net bridge1 --name mysql -d -e "MYSQL_ROOT_PASSWORD=my-secret-pw" -e "MYSQL_DATABASE=test" mysql:5.7', returnStdout: true)
sh(script:'docker run --net bridge1 --name redis -d redis:5', returnStdout: true)
def testImage = docker.build("test-image:${env.BUILD_ID}", "-f Dockerfile ./")
testImage.inside('--net bridge1 -e "DB_HOST=mysql" -e "REDIS_HOST=redis" -e "DB_DATABASE=test" -e "DB_USERNAME=root" -e "DB_PASSWORD=my-secret-pw"') {
stage('prepare') {
echo 'preparing'
sh 'apt-get update && apt-get install -y librsvg2-bin'
}
stage('test') {
echo 'testing...'
sh './unit.sh'
}
}
}
已在 coding.net 持續(xù)集成(免費的 Jenkins 云服務(wù))中運行成功涯冠,截圖: