前幾天做以docker方式來(lái)運(yùn)行runner,現(xiàn)在想好像有點(diǎn)出入。真正應(yīng)該是通過(guò)打包一個(gè)docker鏡像立镶,在鏡像里進(jìn)行測(cè)試师逸,測(cè)試通過(guò)后提交到鏡像倉(cāng)庫(kù)司倚,接著發(fā)布到測(cè)試集群里進(jìn)行集成測(cè)試,最終發(fā)布到生產(chǎn)環(huán)境里。
現(xiàn)在完成了通過(guò)打包測(cè)試鏡像進(jìn)行測(cè)試动知,然后再生成生產(chǎn)鏡像皿伺。為了縮減生產(chǎn)鏡像的大小(golang鏡像將近700M,golang:alpine鏡像250M盒粮,而通過(guò)mutil+stage方式打包到Alpine基礎(chǔ)包鸵鸥,只有10M左右。下面有詳細(xì)的文件例子丹皱。
在一個(gè)項(xiàng)目里一般只有一個(gè)Dockerfile,滿足不了需求妒穴,發(fā)現(xiàn)可以通過(guò)-f Dockefile指定不同的文件進(jìn)行打包,但是Dockerfile.test這種帶后綴方式有問(wèn)題摊崭,應(yīng)該使用DockerfileTest這種方式讼油。參見(jiàn)Docker build
一、打包Docker鏡像
首先要安裝docker ce呢簸,參照Docker安裝
接著需要給gitlab-runner用戶賦予docker執(zhí)行權(quán)限矮台,否則在打包是會(huì)提示無(wú)權(quán)限。
sudo usermod -aG docker gitlab-runner
sudo -u gitlab-runner -H docker info
很麻煩根时,怎么先進(jìn)行測(cè)試瘦赫,測(cè)試通過(guò)后再打包?
測(cè)試是不是使用一個(gè)docker runner來(lái)做蛤迎,測(cè)試通過(guò)后再使用shell runner來(lái)打包上傳發(fā)布耸彪?
項(xiàng)目根目錄下的DockerfileTest,DockerfileProd,gitlab-ci.yml代碼如下:
# DockerfileTest
FROM golang:alpine
MAINTAINER panzulong "panzulong@gmail.com"
WORKDIR /go/src
COPY src /go/src
cmd ["go","test"]
# DockerfileProd
# build product bin
FROM golang:alpine
MAINTAINER panzulong "panzulong@gmail.com"
WORKDIR /go/src
COPY src /go/src
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
# build product image
FROM alpine:latest
WORKDIR /root/
COPY --from=0 /go/src/app .
EXPOSE 9090
ENTRYPOINT ["./app"]
gitlab-ci.yml
# This file is a template, and might need editing before it works on your project.
stages:
- go-test
- build-image
go-test:
stage: go-test
script:
- docker build -f DockerfileTest -t test-student:v0.1 . #把測(cè)試專用的dockerfile放到src目錄中
- docker run --rm test-student:v0.1 #進(jìn)行測(cè)試忘苛,如果不通過(guò)后面就不會(huì)執(zhí)行蝉娜,如果通過(guò)后面繼續(xù)執(zhí)行
after_script:
- docker rmi test-student:v0.1
tags:
- shell
build-image:
stage: build-image
before_script:
- docker login -u panzl -p **** registry.cacec.com.cn
script:
- docker build -f DockerfileProd -t registry.cacec.com.cn/ms/student:v0.1 .
- docker push registry.cacec.com.cn/ms/student:v0.1
- docker images
after_script:
- docker images|grep none|awk '{print $3}'|xargs docker rmi #為了刪除中間生成的那個(gè)鏡像文件
tags:
- shell