You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bitbucket AWS CodeDeploy插件部署时如何生成.env文件?

我来帮你拆解这两个问题,给你具体的实操方案:

一、Bitbucket Pipelines生成.env并关联AWS CodeDeploy插件

核心思路是:在Pipelines的构建阶段用Bitbucket环境变量生成.env文件,把它和代码一起打包成部署包,再通过AWS CodeDeploy插件上传并部署到目标服务器。

1. 配置Bitbucket环境变量

首先在Bitbucket仓库的Settings > Repository variables里添加你的环境变量(敏感变量比如数据库密码要勾选Secured,避免日志泄露)。

2. 编写bitbucket-pipelines.yml

示例配置如下:

image: atlassian/default-image:3

pipelines:
  default:
    - step:
        name: 构建并打包包含.env的部署包
        script:
          # 生成.env文件,读取Bitbucket环境变量
          - echo "DB_HOST=$DB_HOST" >> .env
          - echo "DB_USER=$DB_USER" >> .env
          - echo "DB_PASS=$DB_PASS" >> .env # 这个是Secured变量,不会暴露在日志里
          # 打包部署内容,排除无关文件
          - zip -r deploy-package.zip . -x "bitbucket-pipelines.yml" ".git/*" "node_modules/*"
        artifacts:
          - deploy-package.zip # 把打包后的文件传递到下一个步骤
    - step:
        name: 通过AWS CodeDeploy部署
        script:
          # 使用Atlassian官方的AWS CodeDeploy管道插件
          - pipe: atlassian/aws-code-deploy:1.1.0
            variables:
              AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID # 同样要设为Secured变量
              AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
              AWS_DEFAULT_REGION: $AWS_REGION
              APPLICATION_NAME: '你的CodeDeploy应用名称'
              DEPLOYMENT_GROUP_NAME: '你的部署组名称'
              S3_BUCKET: '存储部署包的S3桶名称'
              S3_KEY: 'deploy-packages/$(date +%Y%m%d%H%M%S)-deploy-package.zip' # 加时间戳避免重名
              LOCAL_PATH: 'deploy-package.zip'

关键说明:

  • 第一个步骤负责生成.env并打包,artifacts字段确保部署包能传递到部署步骤
  • AWS的密钥需要在Bitbucket里配置为Secured变量,绝对不要明文写在配置文件里
  • 部署包会被上传到指定S3桶,再由CodeDeploy部署到目标EC2实例,实例上会直接拿到包含.env的代码包
二、通过appspec.yml触发脚本生成.env(获取Bitbucket环境变量)

这里要注意:Bitbucket的环境变量只存在于Pipelines的运行环境中,无法直接传递到EC2实例。所以我们需要通过中间存储(比如AWS Secrets Manager)或者CodeDeploy部署组环境变量来中转,再在部署脚本中读取生成.env。

方案1:用AWS Secrets Manager中转变量(推荐敏感场景)

步骤1:在Pipelines中同步Bitbucket变量到Secrets Manager

在bitbucket-pipelines.yml的构建步骤添加同步命令:

# 把Bitbucket变量打包成JSON格式
- echo '{"DB_HOST":"'$DB_HOST'","DB_USER":"'$DB_USER'","DB_PASS":"'$DB_PASS'"}' > secrets.json
# 上传到AWS Secrets Manager(需要提前创建秘密ID)
- aws secretsmanager update-secret --secret-id your-app-secrets --secret-string file://secrets.json --region $AWS_REGION

注意:执行这个命令需要给Pipelines的AWS账号添加secretsmanager:UpdateSecret权限

步骤2:编写appspec.yml和部署脚本

appspec.yml示例:

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/your-app
hooks:
  AfterInstall:
    - location: scripts/generate-env.sh
      timeout: 300
      runas: root

scripts/generate-env.sh脚本内容:

#!/bin/bash
# 从Secrets Manager拉取配置并生成.env
aws secretsmanager get-secret-value --secret-id your-app-secrets --region us-east-1 | jq -r '.SecretString' > /var/www/your-app/.env
# 设置正确的文件权限
chown www-data:www-data /var/www/your-app/.env
chmod 600 /var/www/your-app/.env

注意:EC2实例的IAM角色需要添加secretsmanager:GetSecretValue权限

方案2:用CodeDeploy部署组环境变量(非敏感场景)

步骤1:在Pipelines中更新CodeDeploy部署组的环境变量

# 更新部署组的环境变量
aws deploy update-deployment-group \
  --application-name your-app-name \
  --deployment-group-name your-deployment-group \
  --region $AWS_REGION \
  --environment-variables Variables={DB_HOST=$DB_HOST,DB_USER=$DB_USER}

步骤2:在部署脚本中读取环境变量生成.env

修改generate-env.sh:

#!/bin/bash
# 读取CodeDeploy部署组的环境变量生成.env
echo "DB_HOST=$DB_HOST" >> /var/www/your-app/.env
echo "DB_USER=$DB_USER" >> /var/www/your-app/.env
# 敏感变量还是建议用Secrets Manager,不要存在部署组环境变量里

关键说明:

  • 敏感变量绝对不要用明文传递,Secrets Manager是更安全的选择
  • EC2实例必须有对应的IAM权限才能访问AWS服务
  • 生成.env后一定要设置严格的文件权限,避免被未授权用户读取

内容的提问来源于stack exchange,提问作者Yevgeniy Afanasyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:51:44