如何正确设置环境变量Gitlab CI / CD和Docker

时间:2019-09-07 16:19:45

标签: django docker docker-compose gitlab gitlab-ci

我是 Docker 和CI / CD和 Gitlab CI / CD 的新手。我的Django项目的根目录中有.env文件,其中包含我的环境变量,例如SECRET_KEY=198191891.env文件包含在.gitignore中。我已经在CI / CD的Gitlab设置中设置了这些变量。但是,在Gitlab CI / CD设置中设置的环境变量似乎不可用

此外,Gitlab CI / CD自动化过程应如何创建用户和数据库来连接并运行测试?在本地计算机上创建数据库和该数据库的用户时,我登录了容器docker exec -it <postgres_container_name> /bin/sh并创建了Postgres用户和数据库。

这是我的相关文件。

docker-compose.yml

version: "3"
services:
  postgres:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data/
  web:
    build: .
    command: /usr/local/bin/gunicorn writer.wsgi:application -w 2 -b :8000
    environment:
      DEBUG: ${DEBUG}
      DB_HOST: ${DB_HOST}
      DB_NAME: ${DB_NAME}
      DB_USER: ${DB_USER}
      DB_PORT: ${DB_PORT}
      DB_PASSWORD: ${DB_PASSWORD}
      SENDGRID_API_KEY: ${SENDGRID_API_KEY}
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_STORAGE_BUCKET_NAME: ${AWS_STORAGE_BUCKET_NAME}
    depends_on:
      - postgres
      - redis
    expose:
      - "8000"
    volumes:
      - .:/writer-api
  redis:
    image: "redis:alpine"
  celery:
    build: .
    command: celery -A writer worker -l info
    volumes:
      - .:/writer-api
    depends_on:
      - postgres
      - redis
  celery-beat:
    build: .
    command: celery -A writer beat -l info
    volumes:
      - .:/writer-api
    depends_on:
      - postgres
      - redis
  nginx:
    restart: always
    build: ./nginx/
    ports:
      - "80:80"
    depends_on:
      - web
volumes:
  pgdata:

.gitlab-ci.yml

image: tmaier/docker-compose:latest

services:
  - docker:dind

before_script:
  - docker info
  - docker-compose --version

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - echo "Building the app"
    - docker-compose build

test:
  stage: test
  variables:
  script:
    - echo "Testing"
    - docker-compose run web coverage run manage.py test

deploy-staging:
  stage: deploy
  only:
    - develop
  script:
    - echo "Deploying staging"
    - docker-compose up -d

deploy-production:
  stage: deploy
  only:
    - master
  script:
    - echo "Deploying production"
    - docker-compose up -d

这是我的变量设置 enter image description here

这是我失败的管道作业 enter image description here

2 个答案:

答案 0 :(得分:0)

SECRET_KEY变量将对配置的所有CI作业可用。但是,在您的Docker Compose文件中没有看到对它的任何引用以将其传递给您的一项或多项服务。为了使Web服务能够使用它,您需要将其映射为已拥有的其他变量。

  web:
    build: .
    command: /usr/local/bin/gunicorn writer.wsgi:application -w 2 -b :8000
    environment:
      SECRET_KEY: ${SECRET_KEY}
      DEBUG: ${DEBUG}
      …

关于创建数据库,您应该将当前交互运行的所有内容包装在SQL文件或Shell脚本中的postgres容器中,然后将其绑定安装到/docker-entrypoint-initdb.d下容器的初始化脚本目录中。有关更多详细信息,请参见postgres图像说明的Initialization scripts部分。

答案 1 :(得分:0)

请勿将.env文件保存在.gitignore.中,请将其保存在存在yml文件的根目录中。 完成后,yml文件将在执行时自动检测环境变量。