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

如何在特定日期(如周五)跳过GitHub Actions工作流部署任务?

问题

我在GitHub Actions中配置了一套CI/CD流水线,当代码推送到production分支时会触发部署操作。不过,我希望在周五自动执行Docker清理、临时文件删除以及数据库备份等维护任务,在此期间不进行部署,因此需要在周五跳过流水线中的部署任务。同时还希望每日午夜也跳过部署步骤。

当前部署步骤的GitHub Actions工作流配置如下:

deploy:
  runs-on: ubuntu-latest
  needs: [pytest] # Deploy only if tests pass
  if: github.ref_name == 'production' && github.event_name == 'push'
  steps:
    - name: Checkout Code
      uses: actions/checkout@v4

    - name: Add SSH Key
      uses: webfactory/ssh-agent@v0.5.3
      with:
        ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

    - name: Add known hosts
      run: ssh-keyscan -H ${{ secrets.VM_IP }} >> ~/.ssh/known_hosts

    - name: Deploy to Production Server
      run: |
        ssh -o StrictHostKeyChecking=no ${{ secrets.VM_USER }}@${{ secrets.VM_IP }} << 'EOF'
          cd /home/${{ secrets.VM_USER }}/client-portal
          git pull origin production
          git checkout production
          docker compose -f docker-compose.production.yml build
          docker compose -f docker-compose.production.yml down --remove-orphans
          docker compose -f docker-compose.production.yml up -d
        EOF

请问如何为该工作流添加条件,在周五或每日午夜跳过此部署步骤?我需要实现周五禁止部署、其他日期正常运行的效果,GitHub Actions中是否支持判断当前星期几并应用对应条件?


解决方案

GitHub Actions支持通过命令行工具获取当前时间和星期几,以此控制Job的执行条件。以下两种方法可实现需求:

方法一:直接在Job的if条件中添加判断

修改deploy Job的if表达式,加入排除周五(date +%u返回5)和午夜时段(date +%H返回00)的逻辑:

deploy:
  runs-on: ubuntu-latest
  needs: [pytest] # Deploy only if tests pass
  if: >
    github.ref_name == 'production' && 
    github.event_name == 'push' &&
    $(date +%u) != '5' &&
    $(date +%H) != '00'
  steps:
    - name: Checkout Code
      uses: actions/checkout@v4

    - name: Add SSH Key
      uses: webfactory/ssh-agent@v0.5.3
      with:
        ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

    - name: Add known hosts
      run: ssh-keyscan -H ${{ secrets.VM_IP }} >> ~/.ssh/known_hosts

    - name: Deploy to Production Server
      run: |
        ssh -o StrictHostKeyChecking=no ${{ secrets.VM_USER }}@${{ secrets.VM_IP }} << 'EOF'
          cd /home/${{ secrets.VM_USER }}/client-portal
          git pull origin production
          git checkout production
          docker compose -f docker-compose.production.yml build
          docker compose -f docker-compose.production.yml down --remove-orphans
          docker compose -f docker-compose.production.yml up -d
        EOF

逻辑说明

  • $(date +%u):返回当前星期几的数字(1=周一,5=周五,7=周日),判断不等于5则允许执行
  • $(date +%H):返回当前小时的24小时制数字,判断不等于00则排除午夜时段
  • 所有条件需同时满足才会触发部署

方法二:先获取时间信息再判断(更直观)

如果觉得直接在if里写命令不够清晰,可以先通过Step获取时间信息,再用输出作为判断条件:

deploy:
  runs-on: ubuntu-latest
  needs: [pytest] # Deploy only if tests pass
  if: >
    github.ref_name == 'production' && 
    github.event_name == 'push'
  steps:
    - name: Get current time info
      id: time_info
      run: |
        echo "weekday=$(date +%u)" >> $GITHUB_OUTPUT
        echo "hour=$(date +%H)" >> $GITHUB_OUTPUT

    - name: Check deployment eligibility
      if: steps.time_info.outputs.weekday == '5' || steps.time_info.outputs.hour == '00'
      run: |
        echo "Skipping deployment: today is Friday or current time is midnight"
        exit 1 # 终止后续步骤执行

    - name: Checkout Code
      uses: actions/checkout@v4

    - name: Add SSH Key
      uses: webfactory/ssh-agent@v0.5.3
      with:
        ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

    - name: Add known hosts
      run: ssh-keyscan -H ${{ secrets.VM_IP }} >> ~/.ssh/known_hosts

    - name: Deploy to Production Server
      run: |
        ssh -o StrictHostKeyChecking=no ${{ secrets.VM_USER }}@${{ secrets.VM_IP }} << 'EOF'
          cd /home/${{ secrets.VM_USER }}/client-portal
          git pull origin production
          git checkout production
          docker compose -f docker-compose.production.yml build
          docker compose -f docker-compose.production.yml down --remove-orphans
          docker compose -f docker-compose.production.yml up -d
        EOF

逻辑说明

  1. 第一步通过date命令获取当前星期几和小时,写入GITHUB_OUTPUT作为后续步骤的可用变量
  2. 第二步判断如果是周五或者午夜,直接输出提示并退出(exit 1),终止后续部署步骤
  3. 只有当不满足跳过条件时,才会执行后续的部署流程

注意事项

  • 时区问题:GitHub Actions Runner默认使用UTC时区,如果你的维护任务是基于本地时区的周五,需要先设置时区,例如在获取时间的Step前添加:
    sudo timedatectl set-timezone Asia/Shanghai
    
  • 若仅需禁止周五部署,去掉小时判断的条件即可

内容的提问来源于stack exchange,提问作者Adekojo Emmanuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:16:13