说明

回头我放个完整的仓库

仓库模板

注意:仓里里的 .github/workflows 里的文件很重要

# 放在 仓库/.github/workflows/deploy-prod.yml
name: Deploy to Production
 
on:
  push:
    branches:
      - prod # 只对这个分支 做出响应(代码合并到名字叫prod的分支,才会触发工作流)
 
jobs:
  deploy:
    runs-on: self-hosted
    env:
      APP_DIR: /home/ecs-user/app  # 这里似乎必须硬编码 user,否则会报错
 
      # 在这里定义环境变量,使用 secrets
      # DB_HOST: ${{ secrets.DB_HOST }}
      # DB_PORT: ${{ secrets.DB_PORT }}
      # DB_NAME: ${{ secrets.DB_NAME }}
      # DB_USER: ${{ secrets.DB_USER }}
      # DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
 
 
 
    steps:
 
      - name: Check running user and permissions
        run: |
          echo "Current user: $(whoami)"
          echo "User ID: $(id)"
          echo "Groups: $(groups)"
          echo "Home directory: $HOME"
 
      - name: Check Docker version
        run: docker --version
 
       # 1
      - name: Check Docker is running
        run: docker info
 
 
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          ref: prod
          fetch-depth: 0
          clean: true
 
      - name: Show current commit
        run: |
          echo "Current commit:"
          git log -1 --oneline
          echo "Git status:"
          git status
 
      - name: Setup deploy directory
        run: |
          mkdir -p ${{ env.APP_DIR }}
          cd ${{ env.APP_DIR }}
 
          if [ -d current ]; then
            rm -rf backup
            mv current backup
          fi
 
          mkdir -p current
 
      - name: Copy project files
        run: |
          cp -r ./* ${{ env.APP_DIR }}/current/
 
      # 先构建新镜像
      - name: 拉取基础镜像
        working-directory: ${{ env.APP_DIR }}/current
        run: |
          docker compose -f docker-compose.prod.yml pull
 
 
      - name: 构建新镜像
        working-directory: ${{ env.APP_DIR }}/current
        run: |
          docker compose -f docker-compose.prod.yml build
 
 
      - name: 停止旧容器
        working-directory: ${{ env.APP_DIR }}/current
        run: |
          docker compose -f docker-compose.prod.yml stop
 
 
      - name: 启动新容器
        working-directory: ${{ env.APP_DIR }}/current
        run: |
          docker compose -f docker-compose.prod.yml up -d
 
 
      - name: Clean up
        if: always()
        run: |
          docker system prune -f
          docker image prune -f
 
          cd ${{ env.APP_DIR }}
          ls -t | grep -v 'current\|backup' | tail -n +6 | xargs -r rm -rf
 

步骤0、在服务器创建一个普通用户,如ecs-user

adduser ecs-user

步骤1、在服务器安装docker

按照官方教程走 https://docs.docker.com/engine/install/ubuntu/

不要使用 snap 安装,因为 snap 安装的 docker似乎有些命令不兼容 (我之前被坑过好几次)

把用户加入docker组

sudo usermod -aG docker ecs-user

步骤2、 安装 github runner

注意:在服务器安装github runner的时候,不要用root账户,而是用普通用户,因为github runner不能使用root账户运行

仓库 =》 Settings =》 Actions =》 Runners =》 New self-hosted runner =》 根据步骤操作

提示: 如果遇到错误,确保自己没有选错 【Runner image】

步骤3、 让 github runner 开机启动(服务)

1、创建 github runner 服务文件

# 编辑
sudo vim /etc/systemd/system/github-runner.service

2、添加内容

[Unit]
Description=GitHub Actions Runner
After=network.target
 
[Service]
ExecStart=/home/ecs-user/actions-runner/run.sh
User=ecs-user
WorkingDirectory=/home/ecs-user/actions-runner/
Restart=always
RestartSec=5
 
[Install]
WantedBy=multi-user.target

3、启动服务

sudo systemctl daemon-reload
sudo systemctl enable github-runner.service
sudo systemctl start github-runner.service

4、查看服务状态

sudo systemctl status github-runner.service

现在就可以在github 的runner 页面 ,看看是不是上线了