使用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
相关产品推荐
相关产品推荐

