如何在特定日期(如周五)跳过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
逻辑说明
- 第一步通过
date命令获取当前星期几和小时,写入GITHUB_OUTPUT作为后续步骤的可用变量 - 第二步判断如果是周五或者午夜,直接输出提示并退出(
exit 1),终止后续部署步骤 - 只有当不满足跳过条件时,才会执行后续的部署流程
注意事项
- 时区问题:GitHub Actions Runner默认使用UTC时区,如果你的维护任务是基于本地时区的周五,需要先设置时区,例如在获取时间的Step前添加:
sudo timedatectl set-timezone Asia/Shanghai - 若仅需禁止周五部署,去掉小时判断的条件即可
内容的提问来源于stack exchange,提问作者Adekojo Emmanuel
相关产品推荐
相关产品推荐

