我的开发团队维护着两个通过REST交互的独立Web应用程序。
一个应用程序是用Go构建的,另一个应用程序是用Python构建的。
为了确认两个应用在Prod版本之前是否可以正确交互,我们旨在创建一个自动的CircleCI Integration测试作业,该作业执行以下操作:
集成测试要求:
问题: CircleCi(https://circleci.com/docs/2.0/circleci-images/)中的预构建Docker映像仅支持一种主要语言。
解决方案: 为了在同一CircleCI作业中同时运行Go和Python服务器,我们创建了一个自定义Docker映像,该映像结合了公共circleCI Golang和Python映像。
为了帮助可能遇到类似情况的其他团队(即需要Java + Python CircleCi docker容器的团队),分享我们为解决此问题而采取的步骤。
创建自定义Go + Python docker映像并在CircleCi中使用的步骤
GO: https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/golang/images/1.11.0/Dockerfile
此处公开发布docker基本镜像: https://github.com/docker-library/golang/blob/master/1.11/stretch/Dockerfile
我们的自定义DockerFile:
FROM circleci/golang:1.11-stretch
FROM circleci/python:3.7.2-stretch
#Create regular go directory
COPY --from=0 /go /go
#Copy go binaries
COPY --from=0 /usr/local/go /usr/local/go
ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
#Use Root to set path permissions
USER root
RUN chmod -R 777 "$GOPATH"
#Add circleci user
USER circleci
#Add Shell
CMD ["/bin/sh"]
将我们的Github Dockerfile链接到Docker Hub并自动构建之后,我们能够在CircleCi文件中引用该图像
run-system-integration-tests:
docker:
- image: ejparz/circleci-images:latest
从那里,我们能够在一个端口上启动Python应用程序。
- run:
name: Start Python Django Server in background
command: |
cd ~/app
pipenv run python manage.py runserver
background: true
- run:
name: Waiting for python server to be ready
command: |
for i in `seq 1 10`;
do
nc -z localhost 8000 && echo Success && exit 0
echo -n .
sleep 1
done
echo Failed waiting for server && exit 1
然后从我们的golang应用中调用该端口。 (或出于基本测试目的而卷曲)
- run:
name: Test Port connectivity
command: |
curl http://localhost:8000
就是这样。
通过对上述DockerFile模板进行一些细微调整,其他团队/用户应该能够轻松地组成不同的CircleCi Primary语言容器。
答案 0 :(得分:1)
创建一个结合了所需主要语言的自定义Docker映像:
FROM circleci/golang:1.11-stretch
FROM circleci/python:3.7.2-stretch
#Create regular go directory
COPY --from=0 /go /go
#Copy go binaries
COPY --from=0 /usr/local/go /usr/local/go
ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
#Use Root to set path permissions
USER root
RUN chmod -R 777 "$GOPATH"
#Add circleci user
USER circleci
#Add Shell
CMD ["/bin/sh"]