【问题标题】:.env file not in Heroku CI/CD with Gitlab.env 文件不在带有 Gitlab 的 Heroku CI/CD 中
【发布时间】:2021-04-16 00:33:48
【问题描述】:

我正在尝试通过 GitLab 管道将 Node.js 应用程序部署到 Heroku。以下是我的管道代码。我在 GitLab 项目中设置了变量。 .env 文件似乎没有上传到 Heroku 应用程序并且应用程序崩溃了。

image: node:latest

before_script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
   # - npm link @angular/cli

stages:
  #  - test
    - production


# unit-test:
   # stage: test
   # image: trion/ng-cli-karma:latest
   # script:
     #   - npm install 
    #    - ng test 
  #  only:
 #       - master

production:
    type: deploy
    stage: production
    image: ruby:latest
    script:
        - echo "ACCOUNT_SID=$ACCOUNT_SID" >> .env
        - echo "AUTH_TOKEN=$AUTH_TOKEN" >> .env
        - echo "API_KEY=$API_KEY" >> .env
        - echo "API_SECRET=$API_SECRET" >> .env
        - echo "PHONE_NUMBER=$PHONE_NUMBER" >> .env
        - echo "sengrid_api=$sengrid_api" >> .env
        - dpl --provider=heroku --app=$HEROKU_APP_PRODUCTION --api-key=$HEROKU_API_KEY --skip_cleanup
    only:
        - master

【问题讨论】:

    标签: node.js heroku gitlab environment-variables dotenv


    【解决方案1】:

    .env 文件似乎没有上传到 Heroku 应用程序

    也不应该。

    .env 文件是设置环境变量的便捷机制在开发中。在 Heroku 上,您应该使用 config vars,这是 its 设置环境变量的便捷机制,例如

    heroku config:set API_KEY=SOME_API_KEY
    

    请注意,如果值包含诸如 <| 之类的字符,这些字符对于您使用的任何 shell 都有意义,则您可能需要引用它们。

    如果您在构建时需要这些变量,您可以set environment variables as part of your GitLab configuration(已提交到您的存储库)或in group-level secrets(未提交,并且在某些方面更符合每个环境设置的概念)。

    您运行应用程序的每个环境都是不同的,并且应该有自己的环境变量。这是正常的,并且预计他们不会跟随您的申请。这是设计 Heroku 模型的 one of the fundamental principles

    【讨论】:

    • 嗯好的。我在 Gitlab 中为管道定义了变量,但我的应用程序需要这些变量才能运行。您能否更明确地解释一下如何将这些变量传递给我的应用程序?
    • @augdog97,作为配置变量(请参阅我的答案中的链接)。我通常使用命令行,例如heroku config:set FOO=bar,但在 Web 仪表板中也有一个用于执行此操作的界面。
    • 好吧,我很感激,我设置了变量,但它不起作用。我仍在研究解决方案。
    • @augdog97,我很遗憾听到这个消息。 “它不起作用”具体是什么意思?
    • 我添加了变量,但应用仍然没有使用变量。请上面编辑的 .yml 文件。我得到了要创建的 .env 文件,但仍然没有使用变量。 Nano 不适用于 Heroku CLI,所以我在 .env 文件中看不到。既然创建了 .env 文件,我应该尝试添加配置变量吗?
    【解决方案2】:

    有了这个 .yml 文件,我可以构建我的 docker 映像并同时部署到我的两个 Digital Ocean 液滴,并在它们前面使用负载平衡器。

    # ssh-keyscan gitlab.com >> authorized_keys: use this command to add gitlab ssh keys to sever. Run on server terminal
    # cat ~/.ssh/id_rsa.pub >> authorized_keys : Run this command on the sever on the terminal. 
    # Both COMMANDS ABOVE ARE necessary.
    # Have to put .env echo statments in Docker build stage because documents dont persist. Artifacts could be used.
    
    stages:
      - build
      - deploy
    
    variables:
      TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
      TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA
    
    
    build-App:
      image: docker:latest
      stage: build
      services:
        - docker:dind
      script:
        - echo   "ACCOUNT_SID=$ACCOUNT_SID" >> .env
        - echo   "AUTH_TOKEN=$AUTH_TOKEN" >> .env
        - echo   "API_KEY=$API_KEY" >> .env
        - echo   "API_SECRET=$API_SECRET" >> .env
        - echo   "PHONE_NUMBER=$PHONE_NUMBER" >> .env
        - echo   "sengrid_api=$sengrid_api" >> .env
        - cat .env
        - docker build . -t $TAG_COMMIT -t $TAG_LATEST 
        - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
        - docker push $TAG_COMMIT
        - docker push $TAG_LATEST
    
    deploy-1:
      image: ubuntu:latest
      stage: deploy
      tags:
        - deployment
      before_script:
      - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
      - eval $(ssh-agent -s)
      - mkdir -p ~/.ssh
      - chmod 700 ~/.ssh
      - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
      - echo "$SSH_PUBLIC_KEY" | tr -d '\r' > ~/.ssh/id_rsa.pub
      - chmod 600 ~/.ssh/*
      - chmod 644 ~/.ssh/*.pub
      - ssh-add
      - ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
      - chmod 644 ~/.ssh/known_hosts
      - ls -ld ~/.ssh/*
      script:
        - ssh   -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
        - ssh  -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker pull $TAG_COMMIT"
        - ssh  -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker container rm -f my-app || true"
        - ssh  -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker run -d -p 3000:3000 --name my-app $TAG_COMMIT"
      environment:
        name: production
        url: http://134.122.23.185
      only:
        - master
    
    deploy-2:
      image: ubuntu:latest
      stage: deploy
      tags:
        - deployment-backup
      before_script:
      - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client git -y )'
      - eval $(ssh-agent -s)
      - mkdir -p ~/.ssh
      - chmod 700 ~/.ssh
      - echo "$SSH_PRIVATE_KEY_BACKUP" | tr -d '\r' > ~/.ssh/id_rsa
      - echo "$SSH_PUBLIC_KEY_BACKUP" | tr -d '\r' > ~/.ssh/id_rsa.pub
      - chmod 600 ~/.ssh/*
      - chmod 644 ~/.ssh/*.pub
      - ssh-add
      - ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
      - chmod 644 ~/.ssh/known_hosts
      - ls -ld ~/.ssh/*
      script:
        - ssh   -o StrictHostKeyChecking=no $SERVER_USER_BACKUP@$SERVER_IP_BACKUP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
        - ssh  -o StrictHostKeyChecking=no $SERVER_USER_BACKUP@$SERVER_IP_BACKUP "docker pull $TAG_COMMIT"
        - ssh  -o StrictHostKeyChecking=no $SERVER_USER_BACKUP@$SERVER_IP_BACKUP "docker container rm -f my-app || true"
        - ssh  -o StrictHostKeyChecking=no $SERVER_USER_BACKUP@$SERVER_IP_BACKUP "docker run -d -p 3000:3000 --name my-app $TAG_COMMIT"
      environment:
        name: production-backup
        url: http://161.35.123.72
      only:
        - master

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 2019-10-26
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多