Skip to main content

后台自动提交代码任务

· 3 min read
xcentiot
product maintainer @ XcentIoT

后台自动提交代码功能

背景

why?

忘记打卡了,需要的凭证就是提交代码才有效,于是有了这个需求,希望自动定时每天8点50提交一份代码。

需求分析

  1. 写一个程序可以提交代码并且push
  2. 定时执行
  3. 后台启动

具体实现

auto_commit.go

package main

import (
"fmt"
"os"
"os/exec"
"time"
)

func updateReadme() error {
// 切换到 gwx_test 分支
if err := exec.Command("git", "checkout", "gwx_test").Run(); err != nil {
return fmt.Errorf("切换分支失败: %v", err)
}

// 追加内容到 hello.txt
timestamp := time.Now().Format("2006-01-02 15:04:05")
content := fmt.Sprintf("\nAuto update at %s", timestamp)
f, err := os.OpenFile("hello.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return fmt.Errorf("打开文件失败: %v", err)
}
defer f.Close()

if _, err := f.WriteString(content); err != nil {
return fmt.Errorf("写入文件失败: %v", err)
}

// 添加更改
if err := exec.Command("git", "add", ".").Run(); err != nil {
return fmt.Errorf("git add 失败: %v", err)
}

// 提交更改
if err := exec.Command("git", "commit", "-m", "Auto update time").Run(); err != nil {
return fmt.Errorf("git commit 失败: %v", err)
}

// 推送到远程
if err := exec.Command("git", "push", "upstream", "gwx_test").Run(); err != nil {
return fmt.Errorf("git push 失败: %v", err)
}

fmt.Printf("成功更新 at %s\n", timestamp)
return nil
}

func main() {
fmt.Println("自动提交任务已启动...")

// 添加 recover 机制
defer func() {
if r := recover(); r != nil {
fmt.Printf("程序发生严重错误: %v\n", r)
// 重新启动主循环
main()
}
}()

for {
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), 8, 50, 0, 0, now.Location())

if now.After(next) {
next = next.Add(24 * time.Hour)
}

timer := time.NewTimer(next.Sub(now))
fmt.Printf("等待下一次执行,将在 %s 运行\n", next.Format("2006-01-02 15:04:05"))

<-timer.C

// 使用 recover 包装任务执行
func() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("任务执行出错: %v\n", r)
}
}()

if err := updateReadme(); err != nil {
fmt.Printf("执行出错: %v\n", err)
}
}()
}
}

编译为可执行文件

go build -o auto_commit.exe auto_commit.go

后台运行

@echo off
echo 开始执行自动提交任务 %date% %time% >> auto_commit_log.txt
start /b auto_commit.exe
echo 任务已启动 %date% %time% >> auto_commit_log.txt

遇到的问题

没有使用定时触发器,导致cpu卡顿

1. 使用 time.NewTimer 创建定时器
2. 使用 <-timer.C 等待定时器触发,而不是持续循环
3. 移除了 time.Sleep

- CPU 使用率会大幅降低
- 程序仍然会在指定时间执行任务
- 定时器触发前程序会处于休眠状态
- 系统资源占用更少使用 time.Timer 来替代持续循环