如何通过GitHub Actions在DigitalOcean Droplet执行git pull并生成env文件
问题根因
你当前工作流的问题确实如你猜测:除了appleboy/ssh-action内的操作是在你的DigitalOcean Droplet上执行之外,其余所有步骤(包括你调用create-envfile生成文件的步骤)都运行在GitHub分配的临时Runner容器中,生成的.django文件仅存在于Runner的临时文件系统,不会同步到你的服务器上。
同时GitHub Action不支持嵌套调用,你无法在appleboy/ssh-action内部直接复用create-envfile这个Action,最直接的方案就是把所有操作都放在SSH步骤的脚本内执行。
最终实现方案
这个方案完全符合你的需求:支持workflow dispatch手动触发、直接在Droplet上拉取最新代码、基于GitHub Secrets生成.env文件,同时满足你提出的两个硬性要求:
- 所有密钥都存储在GitHub Secrets中,不会写入仓库代码
- 天然适配私有组织仓库、私有用户仓库,不需要额外适配
你需要提前在仓库的「Settings - Secrets and variables - Actions」中配置以下Secret:
SSH_HOST:Droplet的公网IPSSH_USER:SSH登录用户名SSH_KEY:SSH登录私钥DJANGO_SECRET:Django密钥- 其他你需要用到的敏感环境变量都可以在这里配置
完整工作流代码
name: digitalocean-pull-and-setup-env on: # 仅保留手动触发 workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - name: SSH到Droplet执行部署 uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} key: ${{ secrets.SSH_KEY }} # 所有部署逻辑都写在script里,全部在Droplet上执行 script: | # 进入你的项目目录 cd /home/django/all_django_projects # 拉取最新代码 git pull # 生成.env文件,直接覆盖旧文件 cat > .django << EOF DEBUG=False DEVELOPMENT_MODE=False DJANGO_SECRET_KEY=${{ secrets.DJANGO_SECRET }} # 其他需要的环境变量直接按这个格式加就行,敏感值从secrets取 EOF # 此处可以加你的服务重启命令,比如重启Django服务、uWSGI、Nginx等 # 示例:systemctl restart your-django-service
补充说明
- 这个方案没有冗余操作,所有逻辑都直接在你的服务器上执行,不需要上传整个仓库代码
- 所有写入.env的敏感值都是在GitHub Action运行时才注入,不会泄露到任何公开位置
- 不需要用到
actions/checkout或者digitalocean/action-doctl,完全满足你要的简单部署需求
内容的提问来源于stack exchange,提问作者Kim Stacks
相关产品推荐
相关产品推荐

