CircleCI - 根据分支对环境变量的不同值

CircleCI - different value to environment variable according to the branch

我正在尝试根据当前 $CIRCLE_BRANCH 为 CircleCI 上的环境变量设置不同的值。 我尝试在 CircleCI 设置上设置两个不同的值并在部署阶段相应地导出它们,但这不起作用:

deployment:
  release:
    branch: master
    commands:
      ...
      - export API_URL=$RELEASE_API_URL; npm run build
      ...
  staging:
    branch: develop
    commands:
      ...
      - export API_URL=$STAGING_API_URL; npm run build
      ...

我怎样才能做到这一点?

提前致谢。

使用 bash 脚本

在我的项目中,我使用 bash 脚本将其存档。

例如,这是我的 circle.yml :

machine:
  node:
    version: 6.9.5

dependencies:
  override:
    - yarn install

compile:
  override:
    - chmod -x compile.sh
    - bash ./compile.sh

这是我的 compile.sh

#!/bin/bash

if [ "${CIRCLE_BRANCH}" == "development" ]
then
  export NODE_ENV=development
  export MONGODB_URI=${DEVELOPMENT_DB}
  npm run build
elif [ "${CIRCLE_BRANCH}" == "staging" ]
then
  export NODE_ENV=staging
  export MONGODB_URI=${STAGING_DB}
  npm run build
elif [ "${CIRCLE_BRANCH}" == "master" ]
then
  export NODE_ENV=production
  export MONGODB_URI=${PRODUCTION_DB}
  npm run build
else
  export NODE_ENV=development
  export MONGODB_URI=${DEVELOPMENT_DB}
  npm run build
fi

echo "Sucessfull build for environment: ${NODE_ENV}"

exit 0

这个问题已经问了将近 2 年了,但最近我一直在寻找类似的解决方案,我找到了。

指的是CircleCI的特性Contexts (https://circleci.com/docs/2.0/contexts/)。 感谢 Contexts,您可以创建多组环境变量,这些变量在整个组织内都可用。然后,您可以根据工作流程动态加载其中一组 filters 属性.

让我用下面的例子来证明它:

假设您有两个分支,并且您希望将每个分支部署到不同的服务器中。你要做的是:

  1. 创建两个上下文(例如 prod-ctxdev-ctx)并在每个上下文中定义 SERVER_URL 环境变量。您需要登录 CircleCI 仪表板并转到 "Settings" -> "Contexts".

  2. 在您的 .circleci/config.yml 中定义作业的 模板 并将其命名为 deploy:

deploy: &deploy
steps:
  - ...
  1. 定义工作流程:
workflows:
  version: 2
  deploy:
    jobs:
      - deploy-dev:
          context: dev-ctx
          filters:
            branches:
              only:
                - develop
      - deploy-prod:
          context: prod-ctx
          filters:
            branches:
              only:
                - master
  1. 最终定义两个作业 deploy-proddeploy-dev 将使用 deploy 模板:
jobs:
  deploy-dev:
    <<: *deploy

  deploy-prod:
    <<: *deploy

以上步骤创建了两个作业,并且 运行 它们取决于 filters 条件。此外,每个作业都有不同的环境变量集,但部署逻辑保持不变并且只定义一次。多亏了这一点,我们实现了不同分支的动态环境变量值。