mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Fix #31657. According to the [doc](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#onschedule) of GitHub Actions, The timezone for cron should be UTC, not the local timezone. And Gitea Actions doesn't have any reasons to change this, so I think it's a bug. However, Gitea Actions has extended the syntax, as it supports descriptors like `@weekly` and `@every 5m`, and supports specifying the timezone like `TZ=UTC 0 10 * * *`. So we can make it use UTC only when the timezone is not specified, to be compatible with GitHub Actions, and also respect the user's specified. It does break the feature because the times to run tasks would be changed, and it may confuse users. So I don't think we should backport this. ## ⚠️ BREAKING ⚠️ If the server's local time zone is not UTC, a scheduled task would run at a different time after upgrading Gitea to this version.
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2024 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package actions
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| func TestActionScheduleSpec_Parse(t *testing.T) {
 | |
| 	// Mock the local timezone is not UTC
 | |
| 	local := time.Local
 | |
| 	tz, err := time.LoadLocation("Asia/Shanghai")
 | |
| 	require.NoError(t, err)
 | |
| 	defer func() {
 | |
| 		time.Local = local
 | |
| 	}()
 | |
| 	time.Local = tz
 | |
| 
 | |
| 	now, err := time.Parse(time.RFC3339, "2024-07-31T15:47:55+08:00")
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	tests := []struct {
 | |
| 		name    string
 | |
| 		spec    string
 | |
| 		want    string
 | |
| 		wantErr assert.ErrorAssertionFunc
 | |
| 	}{
 | |
| 		{
 | |
| 			name:    "regular",
 | |
| 			spec:    "0 10 * * *",
 | |
| 			want:    "2024-07-31T10:00:00Z",
 | |
| 			wantErr: assert.NoError,
 | |
| 		},
 | |
| 		{
 | |
| 			name:    "invalid",
 | |
| 			spec:    "0 10 * *",
 | |
| 			want:    "",
 | |
| 			wantErr: assert.Error,
 | |
| 		},
 | |
| 		{
 | |
| 			name:    "with timezone",
 | |
| 			spec:    "TZ=America/New_York 0 10 * * *",
 | |
| 			want:    "2024-07-31T14:00:00Z",
 | |
| 			wantErr: assert.NoError,
 | |
| 		},
 | |
| 		{
 | |
| 			name:    "timezone irrelevant",
 | |
| 			spec:    "@every 5m",
 | |
| 			want:    "2024-07-31T07:52:55Z",
 | |
| 			wantErr: assert.NoError,
 | |
| 		},
 | |
| 	}
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			s := &ActionScheduleSpec{
 | |
| 				Spec: tt.spec,
 | |
| 			}
 | |
| 			got, err := s.Parse()
 | |
| 			tt.wantErr(t, err)
 | |
| 
 | |
| 			if err == nil {
 | |
| 				assert.Equal(t, tt.want, got.Next(now).UTC().Format(time.RFC3339))
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 |