Как запустить задание Single CircleCi, для которого требуется несколько основных языков?(Использование Docker Executor) - PullRequest
0 голосов
/ 04 марта 2019

Моя команда разработчиков поддерживает два отдельных веб-приложения, которые взаимодействуют через REST.

Одно приложение построено на Go, а другое на Python.

Для подтверждения правильного взаимодействия двух приложений передДля выпусков Prod мы стремились создать автоматизированное задание тестирования CircleCI Integration, которое выполняет следующие задачи:

Требования к тестированию интеграции:

  1. Ознакомьтесь с приложениями Go и Python
  2. Сборка и запуск обоих приложений на локальном хосте
  3. Запуск тестов интеграции в реальном времени, когда приложение Go вызывает приложение Python

Проблема: PreВстроенные образы Docker в CircleCi (https://circleci.com/docs/2.0/circleci-images/) поддерживают только один основной язык.

Решение: Чтобы запустить сервер Go и Python в одном задании CircleCI, мысоздал собственный образ Docker, объединяющий общедоступные образы кругов Голанга и Питона.

Чтобы помочь другим командам, которые могут столкнуться с подобной ситуацией (например, команде, которая хочет Java+ Docker-контейнер Python CircleCi), рассказывает о шагах, которые мы предприняли для решения этой проблемы.

Шаги по созданию настраиваемого образа док-станции Go + Python и его использованию в CircleCi

  1. Создайте публичный репозиторий в Docker Hub и свяжите его с существующей учетной записью Github.
  2. Вот репозиторий Docker Hub, который мы использовали для этого примера: https://hub.docker.com/r/ejparz/circleci-images/dockerfile
  3. Мы создали наш DockerFile на основе общедоступных изображений докеров CircleCi Go и Python, доступных здесь:

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

Базовое изображение общедоступного докера здесь: 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.

1 Ответ

0 голосов
/ 04 марта 2019

Создайте собственный образ 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"]
...