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

     2023-02-19     76

关键词:

【中文标题】如何正确设置环境变量 Gitlab CI/CD 和 Docker【英文标题】:How to set environmental variables properly Gitlab CI/CD and Docker 【发布时间】:2020-01-10 03:02:15 【问题描述】:

我是 Docker 和带有 Gitlab CI/CD 的 CI/CD 的新手。我的 Django 项目的根目录中有 .env 文件,其中包含我的环境变量,例如 SECRET_KEY=198191891.env 文件包含在 .gitignore 中。我已经在 Gitlab 设置中为 CI/CD 设置了这些变量。但是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

这是我的变量设置

这是我失败的管道工作

【问题讨论】:

【参考方案1】:

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
      …

至于创建数据库,您应该将您当前在 postgres 容器中交互运行的任何内容包装在 SQL 文件或 shell 脚本中,然后将其绑定挂载到容器的初始化脚本目录中 /docker-entrypoint-initdb.d 下。有关详细信息,请参阅 postgres 图像描述的 Initialization scripts 部分。

【讨论】:

非常感谢。后来我更改了我的代码,删除了硬编码的密钥并忘记在docker-compose.yml 中访问它。这意味着如果你没有在 web 容器中声明变量,那么你不能在 .gitlab-ci.yml 中设置它? 好吧,GitLab CI 变量更多的是在跑步者的环境中设置值。您可以随心所欲地使用它。在这种情况下,将其传递给 Web 服务的环境规范。 来自我手动执行 ssh 到远程服务器的环境,执行 git pull 并创建我的.env,我如何分离开发.env 和生产.env。我使用 docker-machine 创建了一个 AWS EC2 实例。我创建了一个production.yml 并做了docker-compose -f production.yml up -d。 EC2 机器中的容器接收了我的开发 .env 这不是我想要的。【参考方案2】:

根据我的经验,将环境变量传递给容器 docker 的最佳方法是创建一个环境文件,该文件适用于开发环境和生产环境:

GitLab CI/CD variables

您必须在 GitLab CI/CD 上创建一个环境文件,按照接下来的步骤,在您的项目 GitLab 上您必须转到:

settings > CI/CD > Variables

你必须创建一个ENV_FILE

演示图片

接下来在 .gitlab-ci.yml 的构建阶段将 ENV_FILE 复制到本地进程

.gitlab-ci.yml

build:
  stage: build
  script:
    - cp $ENV_FILE .env
    - echo "Building the app"
    - docker-compose build

您的Dockerfile 应该保持正常,因此不必更改

Dockerfile

FROM python:3.8.6-slim

# Rest of setup goes here...

COPY .env .env

【讨论】:

在 GitLab CI/CD 作业中将环境变量传递给 docker run 返回无效的参考格式?

】在GitLabCI/CD作业中将环境变量传递给dockerrun返回无效的参考格式?【英文标题】:PassingenvironmentvariablestodockerruninGitLabCI/CDjobreturninginvalidreferenceformat?【发布时间】:2020-03-2105:14:28【问题描述】:我在工作日志中收到以下错误消... 查看详情

带有 gitlab CI/CD 的 Rails .env

...2021-07-2212:55:40【问题描述】:遇到Rails项目通过gitlabCI的环境变量问题。目前,我正在使用dotenvgem来存储我的项目的凭据。另外,我已经在gitlabCI环境中分配了环境变量。比如database.yml:host:<%=ENV[\'DATABASE_HOST\']%> 查看详情

GItLab CI/CD 只为开发分支添加变量

】GItLabCI/CD只为开发分支添加变量【英文标题】:GItLabCI/CDaddvariableonlyfordevelopbranch【发布时间】:2022-01-1817:17:45【问题描述】:我有一个GitLab项目,它使用管道的包含和变量,例如:include:-project:a/bfile:/file.gitlab-ci.ymlvariables:Test:te... 查看详情

如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml

】如何将gitlabci/cd变量传递给kubernetes(AKS)deployment.yaml【英文标题】:Howtopassgitlabci/cdvariablestokubernetes(AKS)deployment.yaml【发布时间】:2019-11-0410:12:56【问题描述】:我有一个node.js(express)项目已签入gitlab,它正在Kubernetes中运行。我知... 查看详情

Gitlab CI/CD - 用户和权限最佳实践

...:06【问题描述】:我正在尝试查找一些指南或文档来讨论设置gitlabCI/CD以自动部署Web服务器(nginx)/Centos或任何Linux的最佳实践。将CI/CD设置为root用户很容易,但我不喜欢在gitlab中拥有root密钥的想法。如果我 查看详情

如何为 ApolloClient 设置环境变量,该变量应该在 CI/CD 的服务器端呈现

】如何为ApolloClient设置环境变量,该变量应该在CI/CD的服务器端呈现【英文标题】:HowtosetenvironmentvariableforApolloClientthatshouldbeserversiderenderedforCI/CD【发布时间】:2021-12-3015:48:01【问题描述】:我有以下apolloClient/***InitializesanApolloCli... 查看详情

ci/cd之jenkins+gitlab(代码片段)

...身份验证令牌-在jenkins上配置触发器-在git项目的配置界面设置链接和token-对web钩子进行测试-更新gitlab中的项目代码-访问web主机(2&#x 查看详情

Flutter 集成测试和 Gitlab CI/CD

...试使用基于thistutorial的Fastlane和GitLab为我的Flutter应用程序设置CI/CD,但是我在使用Flutter驱动程序自动化Flutter集成测试时遇到了一些困难。我遇到的问题是,当所有测试都成功完成时 查看详情

如何使用gitlab和rancher构建ci/cd流水线–part2

...CI/CD流水线系列教程的第二部分。第一部分的内容介绍了如何部署、配置和确保GitLab在Rancher的运行。这一部分中,我们将介绍如何使用GitLabCIMulti-Runner构建容器,以及如何使用GitLab容器registry配置项目。除此之外,我们还将涉及... 查看详情

如何为私有 GKE 集群启用 Gitlab CI/CD?

...Ecluster?【发布时间】:2020-07-1307:08:32【问题描述】:我想设置GitlabCI/CD的AutoDevops功能,为此我正在尝试将现有的kubernetes集群设置为我的环境。但是,Gitlab需要用于访问KubernetesAPI的KubernetesMasterAPIURL。K 查看详情

Gitlab CI/CD 中设置 Python 虚拟环境的最佳实践是啥

】GitlabCI/CD中设置Python虚拟环境的最佳实践是啥【英文标题】:WhatisbestpracticeinGitlabCI/CDforsetupofaPythonvirtualenvironmentGitlabCI/CD中设置Python虚拟环境的最佳实践是什么【发布时间】:2021-10-2616:07:01【问题描述】:问题现在我正在为一... 查看详情

gitlab CI - 安装正确版本的纱线

】gitlabCI-安装正确版本的纱线【英文标题】:gitlabCI-installingcorrectversionofyarn【发布时间】:2021-04-2803:17:00【问题描述】:我正在尝试使用gitlab设置CI/CD,但我被困在特定的时刻。以下是我的.gitlab-ci.yml文件:image:"ruby:2.6"before_script... 查看详情

Gitlab CI/CD 在“清理项目目录和基于文件的变量”时失败,并显示“错误:作业失败:退出代码 1”

】GitlabCI/CD在“清理项目目录和基于文件的变量”时失败,并显示“错误:作业失败:退出代码1”【英文标题】:GitlabCI/CDfailswhile"Cleaningupprojectdirectoryandfilebasedvariables"with"ERROR:Jobfailed:exitcode1"【发布时间】:2021-11-... 查看详情

如何使用gitlab和rancher构建ci/cd流水线–part1

介绍GitLab核心是集成管理Git存储库的工具。比如你希望创建一个提供服务的平台,那么GitLab将提供强大的身份验证和授权机制、工作组、问题跟踪、wiki和片段,除此之外还有公有、内部和私有存储库。GitLab强大之处在于,它包... 查看详情

gitlab的ci/cd配置管理(代码片段)

...labCI/CD介绍二:配置gitlab的CI/CD的runner三:代码的MAVEN打包环境四:配置gitlab的CI文件五:发布项目一:gitlabCI/CD介绍1.1gitlabCI/CD概述Gitlab是常用的开源git代码管理工具之一,随着发展也推出了ci/cd解决方案.顾名思义具体来说ci/cd... 查看详情

在 Gitlab CI/CD 管道脚本中使用 shell 变量?

】在GitlabCI/CD管道脚本中使用shell变量?【英文标题】:UsingshellvariableswithinaGitlabCI/CDpipelinescript?【发布时间】:2022-01-1920:22:42【问题描述】:我有一个gitlabci/cd管道,其中包含以下内容::my_script:stage:stagescript:-cddir-ls-d*/>lines.txt-wh... 查看详情

如何在 Maven GitLab CI/CD 管道中将 JaCoCo 报告 HTML 转换为 PDF

】如何在MavenGitLabCI/CD管道中将JaCoCo报告HTML转换为PDF【英文标题】:HowdoIconvertJaCoCoreportHTMLtoPDFinMavenGitLabCI/CDpipeline【发布时间】:2021-12-2316:39:33【问题描述】:我正在尝试通过在CI/CD管道中转换为PDF格式来存储JaCoCo报告中的index.ht... 查看详情

如何使用 CI/CD 为 Gitlab 注册表推送基于 docker compose 的图像

】如何使用CI/CD为Gitlab注册表推送基于dockercompose的图像【英文标题】:HowcanIpushdockercomposebasedimagesforGitlabRegistryUsingCI/CD【发布时间】:2021-11-2509:53:15【问题描述】:我已经使用docker-compose链接了PostgresDB和API图像,它在本地工作,... 查看详情