Моя команда разработчиков поддерживает два отдельных веб-приложения, которые взаимодействуют через REST.
Одно приложение построено на Go, а другое на Python.
Для подтверждения правильного взаимодействия двух приложений передДля выпусков Prod мы стремились создать автоматизированное задание тестирования CircleCI Integration, которое выполняет следующие задачи:
Требования к тестированию интеграции:
- Ознакомьтесь с приложениями Go и Python
- Сборка и запуск обоих приложений на локальном хосте
- Запуск тестов интеграции в реальном времени, когда приложение Go вызывает приложение Python
Проблема: PreВстроенные образы Docker в CircleCi (https://circleci.com/docs/2.0/circleci-images/) поддерживают только один основной язык.
Решение: Чтобы запустить сервер Go и Python в одном задании CircleCI, мысоздал собственный образ Docker, объединяющий общедоступные образы кругов Голанга и Питона.
Чтобы помочь другим командам, которые могут столкнуться с подобной ситуацией (например, команде, которая хочет Java+ Docker-контейнер Python CircleCi), рассказывает о шагах, которые мы предприняли для решения этой проблемы.
Шаги по созданию настраиваемого образа док-станции Go + Python и его использованию в CircleCi
- Создайте публичный репозиторий в Docker Hub и свяжите его с существующей учетной записью Github.
- Вот репозиторий Docker Hub, который мы использовали для этого примера: https://hub.docker.com/r/ejparz/circleci-images/dockerfile
- Мы создали наш 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.