如何运行需要多种主要语言的Single CircleCi作业? (使用Docker执行器)

时间:2019-03-04 16:46:47

标签: docker circleci

我的开发团队维护着两个通过REST交互的独立Web应用程序。

一个应用程序是用Go构建的,另一个应用程序是用Python构建的。

为了确认两个应用在Prod版本之前是否可以正确交互,我们旨在创建一个自动的CircleCI Integration测试作业,该作业执行以下操作:

集成测试要求:

  1. 签出Go and Python App
  2. 在本地主机上构建并启动两个应用程序
  3. 在Go App调用Python应用程序的地方运行实时集成测试

问题: 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中使用的步骤

  1. 在Docker Hub中创建一个公共存储库,并将其链接到现有的Github帐户。
  2. 这是我们在此示例中使用的Docker Hub存储库:https://hub.docker.com/r/ejparz/circleci-images/dockerfile
  3. 我们基于可在此处获得的公共CircleCi Go和Python docker映像创建了DockerFile:

GO: https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/golang/images/1.11.0/Dockerfile

Python: https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/python/images/3.7.2-stretch/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"]
  1. 将我们的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语言容器。

1 个答案:

答案 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"]