如何用GitHub Actions实现Terraform部署与Porkbun域名NS更新并行?
用GitHub Actions替代Jenkins实现Terraform部署+Porkbun域名服务器更新
需求背景
之前用Jenkins配合Terraform部署基础设施,现在要迁移到GitHub Actions。原Jenkins阶段的核心逻辑是并行执行两个任务:
- 运行Terraform部署AWS资源(包括会生成新域名服务器的托管区)
- 等待3分钟后,执行Python脚本将AWS生成的域名服务器更新到Porkbun
注:Terraform部署托管区后,必须正确指向域名服务器才能完成
apply操作
GitHub Actions实现方案
以下是完整的工作流配置,实现和Jenkins一致的并行逻辑,同时兼顾安全性和可维护性:
name: Terraform Deploy & NS Update on: [push] # 可根据需求修改触发条件,比如指定分支 jobs: deploy-infra: runs-on: ubuntu-latest steps: # 1. 准备基础环境 - name: 检出代码 uses: actions/checkout@v4 - name: 配置Python环境 uses: actions/setup-python@v5 with: python-version: '3.10' # 指定脚本兼容的Python版本 - name: 安装依赖包 run: | pip install --upgrade pip pip install boto3 requests # 安装脚本所需的boto3等依赖 # 2. 并行执行Terraform部署和NS更新任务 - name: 并行执行核心任务 parallel: - name: 部署Terraform基础设施 run: | # 若Terraform代码在独立仓库,先克隆(可选) # git clone https://github.com/assafdori/resume-app-iac.git # cd resume-app-iac # 进入Terraform目录(根据实际路径调整) cd terraform terraform init terraform apply -auto-approve env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: 更新Porkbun域名服务器 run: | # 等待Terraform生成NS记录(可优化为轮询代替固定等待) sleep 180 # 下载更新脚本 curl -o update-ns.py https://raw.githubusercontent.com/assafdori/resume-app-iac/main/update-ns.py # 执行脚本 python3 update-ns.py env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} PORKBUN_API_KEY: ${{ secrets.PORKBUN_API_KEY }} PORKBUN_SECRET_KEY: ${{ secrets.PORKBUN_SECRET_KEY }}
关键注意事项
- 密钥管理:所有敏感信息(AWS密钥、Porkbun API密钥)必须存储在GitHub仓库的「Settings → Secrets and variables → Actions」中,避免硬编码
- 路径调整:根据实际项目结构修改Terraform目录路径,若Terraform代码在独立仓库,需添加
git clone步骤 - 等待逻辑优化:固定等待3分钟不够灵活,可改为轮询AWS托管区状态,比如用
aws route53 get-hosted-zone命令检查NS记录是否生成,再执行更新脚本,减少不必要的等待时间 - 错误处理:可添加
terraform plan步骤提前验证配置,或在terraform apply后添加状态检查,确保部署成功
内容的提问来源于stack exchange,提问作者Assaf
相关产品推荐
相关产品推荐

