Протестируйте мое приложение go в контейнере, запущенном docker compose с помощью Gitlab CI - PullRequest
0 голосов
/ 31 января 2019

У меня есть приложение Golang, которое зависит от FTP-сервера.

Итак, в docker compose я создаю службу FTP и ссылаюсь на нее в своих тестах.

Итак, вмой docker-compose.yml у меня есть:

version: '3'

services:
  mygoapp:
    build:
      dockerfile: ./Dockerfile.local
      context: ./
    volumes:
      - ./volume:/go
      - ./test_files:/var/test_files

    networks:
      mygoapp_network:
    env_file:
      - test.env
    tty: true


  ftpd-server:
    container_name: ftpd-server
    image: stilliard/pure-ftpd:hardened
    environment:
      PUBLICHOST: "0.0.0.0"
      FTP_USER_NAME: "julien"
      FTP_USER_PASS: "test"
      FTP_USER_HOME: "/home/www/julien"
    restart: on-failure
    networks:
      mygoapp_network:

networks:
  mygoapp_network:
    external: true

В моем gitlab-ci.yml у меня есть

variables:
  PACKAGE_PATH: /go/src/gitlab.com/xxx
  VOLUME_PATH: /var/test_files


stages:
  - test


# A hack to make Golang-in-Gitlab happy
.anchors:
  - &inject-gopath
      mkdir -p $(dirname ${PACKAGE_PATH})
      && ln -s ${CI_PROJECT_DIR} ${PACKAGE_PATH}
      && cd ${PACKAGE_PATH}

test:
  image: docker:18
  services:
    - docker:dind
  stage: test
  #  only:
  #    - production
  before_script:
    - touch test.env
    - apk update
    - apk upgrade
    - apk add --no-cache py-pip
    - pip install docker-compose
    - docker network create mygoapp_network
    - mkdir -p volume/log

  script:
    - docker-compose -f docker-local.yaml up --build -d
    - docker exec project-0_mygoapp_1 ls /var/test_files
    - docker exec project-0_mygoapp_1 echo $VOLUME_PATH
    - docker exec project-0_mygoapp_1 go test ./... -v

Все мои службы работают

Но когда язапустить

- docker exec project-0_myapp_1 echo $VOLUME_PATH

Я вижу, что $ VOLUME_PATH равен /var/test_files

, но внутри кода, когда я делаю:

os.Getenv("VOLUME_PATH")

переменная пуста

Кроме того, локально, с помощью docker exec, переменная в порядке.

Я также пытался поместить переменные в определение test, но он все еще не работает

РЕДАКТИРОВАТЬ:Единственный способ сделать это - установить переменные окружения в docker compose, но это не так здорово

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 31 января 2019

Поведение вашего сценария предсказуемо - все переменные окружения раскрываются, когда они встречаются (если они не заключены в одинарные кавычки).Таким образом, ваша строка

docker exec project-0_myapp_1 echo $VOLUME_PATH

расширяется до выполнения , а $VOLUME_PATH берется из gitlab runner, а не из контейнера.

Единственный способ получить эту переменную среды печати скрипта из контейнера - это поместить скрипт в sh-файл и вызвать этот файл:

doit.ш

echo $VOLUME_PATH

gitlab-ci.yml

docker exec project-0_myapp_1 doit.sh
...