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
属性.
让我用下面的例子来证明它:
假设您有两个分支,并且您希望将每个分支部署到不同的服务器中。你要做的是:
创建两个上下文(例如 prod-ctx
和 dev-ctx
)并在每个上下文中定义 SERVER_URL
环境变量。您需要登录 CircleCI 仪表板并转到 "Settings" -> "Contexts".
在您的 .circleci/config.yml
中定义作业的 模板 并将其命名为 deploy
:
deploy: &deploy
steps:
- ...
- 定义工作流程:
workflows:
version: 2
deploy:
jobs:
- deploy-dev:
context: dev-ctx
filters:
branches:
only:
- develop
- deploy-prod:
context: prod-ctx
filters:
branches:
only:
- master
- 最终定义两个作业
deploy-prod
和 deploy-dev
将使用 deploy
模板:
jobs:
deploy-dev:
<<: *deploy
deploy-prod:
<<: *deploy
以上步骤创建了两个作业,并且 运行 它们取决于 filters
条件。此外,每个作业都有不同的环境变量集,但部署逻辑保持不变并且只定义一次。多亏了这一点,我们实现了不同分支的动态环境变量值。
我正在尝试根据当前 $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
属性.
让我用下面的例子来证明它:
假设您有两个分支,并且您希望将每个分支部署到不同的服务器中。你要做的是:
创建两个上下文(例如
prod-ctx
和dev-ctx
)并在每个上下文中定义SERVER_URL
环境变量。您需要登录 CircleCI 仪表板并转到 "Settings" -> "Contexts".在您的
.circleci/config.yml
中定义作业的 模板 并将其命名为deploy
:
deploy: &deploy
steps:
- ...
- 定义工作流程:
workflows:
version: 2
deploy:
jobs:
- deploy-dev:
context: dev-ctx
filters:
branches:
only:
- develop
- deploy-prod:
context: prod-ctx
filters:
branches:
only:
- master
- 最终定义两个作业
deploy-prod
和deploy-dev
将使用deploy
模板:
jobs:
deploy-dev:
<<: *deploy
deploy-prod:
<<: *deploy
以上步骤创建了两个作业,并且 运行 它们取决于 filters
条件。此外,每个作业都有不同的环境变量集,但部署逻辑保持不变并且只定义一次。多亏了这一点,我们实现了不同分支的动态环境变量值。