1
0
mirror of https://github.com/woodpecker-ci/woodpecker.git synced 2026-06-03 16:35:37 +02:00

Add commit timestamp env vars (#6670)

Co-authored-by: Akash Kumar <meakash7902@gmail.com>
This commit is contained in:
qwerty287
2026-05-31 12:23:53 +02:00
committed by GitHub
parent 5cdbb62751
commit 4df2e41150
9 changed files with 116 additions and 36 deletions
+10
View File
@@ -284,6 +284,11 @@ var flags = []cli.Flag{
Name: "commit-message",
Usage: "Set the metadata environment variable \"CI_COMMIT_MESSAGE\".",
},
&cli.Int64Flag{
Sources: cli.EnvVars("CI_COMMIT_TIMESTAMP"),
Name: "commit-timestamp",
Usage: "Set the metadata environment variable \"CI_COMMIT_TIMESTAMP\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_AUTHOR"),
Name: "commit-author-name",
@@ -387,6 +392,11 @@ var flags = []cli.Flag{
Name: "prev-commit-message",
Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_MESSAGE\".",
},
&cli.Int64Flag{
Sources: cli.EnvVars("CI_PREV_COMMIT_TIMESTAMP"),
Name: "prev-commit-message",
Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_TIMESTAMP\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR"),
Name: "prev-commit-author-name",
+2
View File
@@ -104,6 +104,7 @@ func metadataFromContext(_ context.Context, c *cli.Command, axis matrix.Axis) (*
metadataFileAndOverrideOrDefault(c, "commit-refspec", func(s string) { m.Curr.Commit.Refspec = s }, c.String)
metadataFileAndOverrideOrDefault(c, "commit-branch", func(s string) { m.Curr.Commit.Branch = s }, c.String)
metadataFileAndOverrideOrDefault(c, "commit-message", func(s string) { m.Curr.Commit.Message = s }, c.String)
metadataFileAndOverrideOrDefault(c, "commit-timestamp", func(i int64) { m.Curr.Commit.Timestamp = i }, c.Int64)
metadataFileAndOverrideOrDefault(c, "commit-author-name", func(s string) { m.Curr.Commit.Author.Name = s }, c.String)
metadataFileAndOverrideOrDefault(c, "commit-author-email", func(s string) { m.Curr.Commit.Author.Email = s }, c.String)
// TODO remove in next major
@@ -128,6 +129,7 @@ func metadataFromContext(_ context.Context, c *cli.Command, axis matrix.Axis) (*
metadataFileAndOverrideOrDefault(c, "prev-commit-refspec", func(s string) { m.Prev.Commit.Refspec = s }, c.String)
metadataFileAndOverrideOrDefault(c, "prev-commit-branch", func(s string) { m.Prev.Commit.Branch = s }, c.String)
metadataFileAndOverrideOrDefault(c, "prev-commit-message", func(s string) { m.Prev.Commit.Message = s }, c.String)
metadataFileAndOverrideOrDefault(c, "prev-commit-timestamp", func(i int64) { m.Prev.Commit.Timestamp = i }, c.Int64)
metadataFileAndOverrideOrDefault(c, "prev-commit-author-name", func(s string) { m.Prev.Commit.Author.Name = s }, c.String)
metadataFileAndOverrideOrDefault(c, "prev-commit-author-email", func(s string) { m.Prev.Commit.Author.Email = s }, c.String)
// TODO remove in next major
+3
View File
@@ -5914,6 +5914,9 @@ const docTemplate = `{
},
"sha": {
"type": "string"
},
"timestamp": {
"type": "integer"
}
}
},
+2
View File
@@ -76,6 +76,7 @@ This is the reference list of all environment variables available to your pipeli
| `CI_COMMIT_PULL_REQUEST_LABELS` | labels assigned to pull request (set only for pull request events) | `server` |
| `CI_COMMIT_PULL_REQUEST_MILESTONE` | milestone assigned to pull request (set only for `pull_request` and `pull_request_closed` events) | `summer-sprint` |
| `CI_COMMIT_MESSAGE` | commit message | `Initial commit` |
| `CI_COMMIT_TIMESTAMP` | commit UNIX timestamp | `1722617519` |
| `CI_COMMIT_AUTHOR` | commit author username | `john-doe` |
| `CI_COMMIT_AUTHOR_EMAIL` | commit author email address | `john-doe@example.com` |
| `CI_COMMIT_PRERELEASE` | release is a pre-release (empty if event is not `release`) | `false` |
@@ -112,6 +113,7 @@ This is the reference list of all environment variables available to your pipeli
| `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch (set only for pull request events) | `main` |
| `CI_PREV_COMMIT_URL` | previous commit link in forge | `https://git.example.com/john-doe/my-repo/commit/15784117e4e103f36cba75a9e29da48046eb82c4` |
| `CI_PREV_COMMIT_MESSAGE` | previous commit message | `test` |
| `CI_PREV_COMMIT_TIMESTAMP` | previous commit UNIX timestamp | `1722617519` |
| `CI_PREV_COMMIT_AUTHOR` | previous commit author username | `john-doe` |
| `CI_PREV_COMMIT_AUTHOR_EMAIL` | previous commit author email address | `john-doe@example.com` |
| | **Previous pipeline** | |
@@ -97,6 +97,7 @@ func (m *Metadata) Environ() map[string]string {
setNonEmptyEnvVar(params, "CI_COMMIT_REFSPEC", commit.Refspec)
setNonEmptyEnvVar(params, "CI_COMMIT_MESSAGE", commit.Message)
setNonEmptyEnvVar(params, "CI_COMMIT_BRANCH", commit.Branch)
setNonEmptyEnvVar(params, "CI_COMMIT_TIMESTAMP", strconv.FormatInt(commit.Timestamp, 10))
setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR", commit.Author.Name)
setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR_EMAIL", commit.Author.Email)
if p, f := strings.CutPrefix(pipeline.Commit.Ref, "refs/tags/"); f {
@@ -150,6 +151,7 @@ func (m *Metadata) Environ() map[string]string {
setNonEmptyEnvVar(params, "CI_PREV_COMMIT_REFSPEC", prevCommit.Refspec)
setNonEmptyEnvVar(params, "CI_PREV_COMMIT_MESSAGE", prevCommit.Message)
setNonEmptyEnvVar(params, "CI_PREV_COMMIT_BRANCH", prevCommit.Branch)
setNonEmptyEnvVar(params, "CI_PREV_COMMIT_TIMESTAMP", strconv.FormatInt(prevCommit.Timestamp, 10))
setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR", prevCommit.Author.Name)
setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR_EMAIL", prevCommit.Author.Email)
if prevPipeline.Event.IsPull() {
@@ -27,13 +27,15 @@ func TestEnviron(t *testing.T) {
Event: EventRelease,
Commit: Commit{
Ref: "refs/tags/v1.2.3",
Timestamp: 1722617519,
IsPrerelease: true,
},
},
Prev: Pipeline{
Event: EventPullMetadata,
Commit: Commit{
Refspec: "branch-a:branch-b",
Refspec: "branch-a:branch-b",
Timestamp: 1722610173,
},
},
}
@@ -47,6 +49,8 @@ func TestEnviron(t *testing.T) {
assert.Equal(t, "branch-b", envs["CI_PREV_COMMIT_TARGET_BRANCH"])
assert.Equal(t, "[]", envs["CI_PIPELINE_FILES"])
assert.Equal(t, "v1.2.3", envs["CI_COMMIT_TAG"])
assert.Equal(t, "1722617519", envs["CI_COMMIT_TIMESTAMP"])
assert.Equal(t, "1722610173", envs["CI_PREV_COMMIT_TIMESTAMP"])
m = Metadata{
Sys: System{Name: "wp"},
+1
View File
@@ -69,6 +69,7 @@ type (
Refspec string `json:"refspec,omitempty"`
Branch string `json:"branch,omitempty"`
Message string `json:"message,omitempty"`
Timestamp int64 `json:"timestamp,omitempty"`
Author Author `json:"author"`
ChangedFiles []string `json:"changed_files,omitempty"`
PullRequestLabels []string `json:"labels,omitempty"`
+6 -5
View File
@@ -140,11 +140,12 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b
DeployTo: pipeline.DeployTo,
DeployTask: pipeline.DeployTask,
Commit: metadata.Commit{
Sha: pipeline.Commit,
Ref: pipeline.Ref,
Refspec: pipeline.Refspec,
Branch: pipeline.Branch,
Message: pipeline.Message,
Sha: pipeline.Commit,
Ref: pipeline.Ref,
Refspec: pipeline.Refspec,
Branch: pipeline.Branch,
Message: pipeline.Message,
Timestamp: pipeline.Timestamp,
Author: metadata.Author{
Name: pipeline.Author,
Email: pipeline.Email,
+85 -30
View File
@@ -44,23 +44,38 @@ func TestGetWorkflowMetadata(t *testing.T) {
name: "Test with empty info",
expectedMetadata: metadata.Metadata{Sys: metadata.System{Name: "woodpecker"}},
expectedEnviron: map[string]string{
"CI": "woodpecker",
"CI_PIPELINE_CREATED": "0", "CI_PIPELINE_FILES": "[]", "CI_PIPELINE_NUMBER": "0",
"CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "/repos/0/pipeline/0",
"CI": "woodpecker",
"CI_PIPELINE_CREATED": "0",
"CI_PIPELINE_FILES": "[]",
"CI_PIPELINE_NUMBER": "0",
"CI_PIPELINE_PARENT": "0",
"CI_PIPELINE_STARTED": "0",
"CI_PIPELINE_URL": "/repos/0/pipeline/0",
"CI_PREV_PIPELINE_CREATED": "0",
"CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "0", "CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_URL": "/repos/0/pipeline/0",
"CI_REPO_PRIVATE": "false", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false", "CI_REPO_TRUSTED_SECURITY": "false", "CI_REPO_TRUSTED_VOLUMES": "false",
"CI_STEP_NUMBER": "0", "CI_STEP_URL": "/repos/0/pipeline/0", "CI_SYSTEM_NAME": "woodpecker",
"CI_WORKFLOW_NUMBER": "0",
"CI_COMMIT_TIMESTAMP": "0",
"CI_PREV_COMMIT_TIMESTAMP": "0",
"CI_PREV_PIPELINE_FINISHED": "0",
"CI_PREV_PIPELINE_NUMBER": "0",
"CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0",
"CI_PREV_PIPELINE_URL": "/repos/0/pipeline/0",
"CI_REPO_PRIVATE": "false",
"CI_REPO_TRUSTED": "false",
"CI_REPO_TRUSTED_NETWORK": "false",
"CI_REPO_TRUSTED_SECURITY": "false",
"CI_REPO_TRUSTED_VOLUMES": "false",
"CI_STEP_NUMBER": "0",
"CI_STEP_URL": "/repos/0/pipeline/0",
"CI_SYSTEM_NAME": "woodpecker",
"CI_WORKFLOW_NUMBER": "0",
},
},
{
name: "Test with forge",
forge: forge,
repo: &model.Repo{FullName: "testUser/testRepo", ForgeURL: "https://gitea.com/testUser/testRepo", Clone: "https://gitea.com/testUser/testRepo.git", CloneSSH: "git@gitea.com:testUser/testRepo.git", Branch: "main", IsSCMPrivate: true},
pipeline: &model.Pipeline{Number: 3, ChangedFiles: []string{"test.go", "markdown file.md"}},
prev: &model.Pipeline{Number: 2},
pipeline: &model.Pipeline{Number: 3, Timestamp: 1722617519, ChangedFiles: []string{"test.go", "markdown file.md"}},
prev: &model.Pipeline{Number: 2, Timestamp: 1722610173},
workflow: &builder.Workflow{Name: "hello"},
sysURL: "https://example.com",
expectedMetadata: metadata.Metadata{
@@ -69,23 +84,48 @@ func TestGetWorkflowMetadata(t *testing.T) {
Repo: metadata.Repo{Owner: "testUser", Name: "testRepo", ForgeURL: "https://gitea.com/testUser/testRepo", CloneURL: "https://gitea.com/testUser/testRepo.git", CloneSSHURL: "git@gitea.com:testUser/testRepo.git", Branch: "main", Private: true},
Curr: metadata.Pipeline{
Number: 3,
Commit: metadata.Commit{ChangedFiles: []string{"test.go", "markdown file.md"}},
Commit: metadata.Commit{Timestamp: 1722617519, ChangedFiles: []string{"test.go", "markdown file.md"}},
},
Prev: metadata.Pipeline{Number: 2},
Prev: metadata.Pipeline{Number: 2, Commit: metadata.Commit{Timestamp: 1722610173}},
Workflow: metadata.Workflow{Name: "hello"},
},
expectedEnviron: map[string]string{
"CI": "woodpecker",
"CI_FORGE_TYPE": "gitea", "CI_FORGE_URL": "https://gitea.com",
"CI_PIPELINE_CREATED": "0", "CI_PIPELINE_FILES": `["test.go","markdown file.md"]`,
"CI_PIPELINE_NUMBER": "3", "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "https://example.com/repos/0/pipeline/3",
"CI": "woodpecker",
"CI_FORGE_TYPE": "gitea",
"CI_FORGE_URL": "https://gitea.com",
"CI_COMMIT_TIMESTAMP": "1722617519",
"CI_PIPELINE_CREATED": "0",
"CI_PIPELINE_FILES": `["test.go","markdown file.md"]`,
"CI_PIPELINE_NUMBER": "3",
"CI_PIPELINE_PARENT": "0",
"CI_PIPELINE_STARTED": "0",
"CI_PIPELINE_URL": "https://example.com/repos/0/pipeline/3",
"CI_PREV_COMMIT_TIMESTAMP": "1722610173",
"CI_PREV_PIPELINE_CREATED": "0",
"CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "2", "CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_URL": "https://example.com/repos/0/pipeline/2", "CI_REPO": "testUser/testRepo", "CI_REPO_CLONE_URL": "https://gitea.com/testUser/testRepo.git", "CI_REPO_CLONE_SSH_URL": "git@gitea.com:testUser/testRepo.git",
"CI_REPO_DEFAULT_BRANCH": "main", "CI_REPO_NAME": "testRepo", "CI_REPO_OWNER": "testUser", "CI_REPO_PRIVATE": "true",
"CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false", "CI_REPO_TRUSTED_SECURITY": "false", "CI_REPO_TRUSTED_VOLUMES": "false",
"CI_REPO_URL": "https://gitea.com/testUser/testRepo", "CI_STEP_NUMBER": "0", "CI_STEP_URL": "https://example.com/repos/0/pipeline/3", "CI_SYSTEM_HOST": "example.com",
"CI_SYSTEM_NAME": "woodpecker", "CI_SYSTEM_URL": "https://example.com", "CI_WORKFLOW_NAME": "hello", "CI_WORKFLOW_NUMBER": "0",
"CI_PREV_PIPELINE_FINISHED": "0",
"CI_PREV_PIPELINE_NUMBER": "2",
"CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0",
"CI_PREV_PIPELINE_URL": "https://example.com/repos/0/pipeline/2",
"CI_REPO": "testUser/testRepo",
"CI_REPO_CLONE_URL": "https://gitea.com/testUser/testRepo.git",
"CI_REPO_CLONE_SSH_URL": "git@gitea.com:testUser/testRepo.git",
"CI_REPO_DEFAULT_BRANCH": "main",
"CI_REPO_NAME": "testRepo",
"CI_REPO_OWNER": "testUser",
"CI_REPO_PRIVATE": "true",
"CI_REPO_TRUSTED": "false",
"CI_REPO_TRUSTED_NETWORK": "false",
"CI_REPO_TRUSTED_SECURITY": "false",
"CI_REPO_TRUSTED_VOLUMES": "false",
"CI_REPO_URL": "https://gitea.com/testUser/testRepo",
"CI_STEP_NUMBER": "0",
"CI_STEP_URL": "https://example.com/repos/0/pipeline/3",
"CI_SYSTEM_HOST": "example.com",
"CI_SYSTEM_NAME": "woodpecker",
"CI_SYSTEM_URL": "https://example.com",
"CI_WORKFLOW_NAME": "hello",
"CI_WORKFLOW_NUMBER": "0",
},
},
{
@@ -97,16 +137,31 @@ func TestGetWorkflowMetadata(t *testing.T) {
RerunCount: 1,
}},
expectedEnviron: map[string]string{
"CI": "woodpecker",
"CI_PIPELINE_CREATED": "0", "CI_PIPELINE_FILES": "[]", "CI_PIPELINE_NUMBER": "3",
"CI_PIPELINE_PARENT": "2", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "/repos/0/pipeline/3",
"CI": "woodpecker",
"CI_PIPELINE_CREATED": "0",
"CI_PIPELINE_FILES": "[]",
"CI_PIPELINE_NUMBER": "3",
"CI_PIPELINE_PARENT": "2",
"CI_PIPELINE_STARTED": "0",
"CI_PIPELINE_URL": "/repos/0/pipeline/3",
"CI_PIPELINE_RERUNS": "1",
"CI_COMMIT_TIMESTAMP": "0",
"CI_PREV_COMMIT_TIMESTAMP": "0",
"CI_PREV_PIPELINE_CREATED": "0",
"CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "0", "CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_URL": "/repos/0/pipeline/0",
"CI_REPO_PRIVATE": "false", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false", "CI_REPO_TRUSTED_SECURITY": "false", "CI_REPO_TRUSTED_VOLUMES": "false",
"CI_STEP_NUMBER": "0", "CI_STEP_URL": "/repos/0/pipeline/3", "CI_SYSTEM_NAME": "woodpecker",
"CI_WORKFLOW_NUMBER": "0",
"CI_PREV_PIPELINE_FINISHED": "0",
"CI_PREV_PIPELINE_NUMBER": "0",
"CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0",
"CI_PREV_PIPELINE_URL": "/repos/0/pipeline/0",
"CI_REPO_PRIVATE": "false",
"CI_REPO_TRUSTED": "false",
"CI_REPO_TRUSTED_NETWORK": "false",
"CI_REPO_TRUSTED_SECURITY": "false",
"CI_REPO_TRUSTED_VOLUMES": "false",
"CI_STEP_NUMBER": "0",
"CI_STEP_URL": "/repos/0/pipeline/3",
"CI_SYSTEM_NAME": "woodpecker",
"CI_WORKFLOW_NUMBER": "0",
},
},
}