jojo/modules/actions/job_parser_test.go

213 lines
3.8 KiB
Go
Raw Normal View History

fix: de-duplicate Forgejo Actions job names when needed (#8864) The status of two jobs by the same name shadow each other, they need to be distinct. If two jobs by the same name are found, they are made distinct by adding a `-<occurence number>` suffix. Resolves forgejo/forgejo#8648 For a given workflow, `jobparser.Parse` will generate one "single" (as opposed to a workflow that can be interpreted to generate multiple jobs) workflow for each job and then insert them (marshalled as yaml) in the database. https://codeberg.org/forgejo/forgejo/src/commit/e3bfa5133f40c5d4819cee402b772e0bb94affa9/models/actions/run.go#L237-L260 The name associated with this single workflow is what the runner will receive and it is what will be used to associate the job status with a commit. Resolves forgejo/forgejo#8648 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [x] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [ ] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title. <!--start release-notes-assistant--> ## Release notes <!--URL:https://codeberg.org/forgejo/forgejo--> - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/8864): <!--number 8864 --><!--line 0 --><!--description ZGUtZHVwbGljYXRlIEZvcmdlam8gQWN0aW9ucyBqb2IgbmFtZXMgd2hlbiBuZWVkZWQ=-->de-duplicate Forgejo Actions job names when needed<!--description--> <!--end release-notes-assistant--> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8864 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: Earl Warren <contact@earl-warren.org> Co-committed-by: Earl Warren <contact@earl-warren.org>
2025-08-13 06:52:44 +02:00
// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package actions
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestServiceActions_jobParser(t *testing.T) {
for _, testCase := range []struct {
name string
workflow string
singleWorkflows []string
}{
{
name: "OneJobNoDuplicate",
workflow: `
jobs:
job1:
runs-on: docker
steps:
- run: echo OK
`,
singleWorkflows: []string{
`jobs:
job1:
name: job1
runs-on: docker
steps:
- run: echo OK
`,
},
},
{
name: "MatrixTwoJobsWithSameJobName",
workflow: `
name: test
jobs:
job1:
name: shadowdefaultmatrixgeneratednames
strategy:
matrix:
version: [1.17, 1.19]
runs-on: docker
steps:
- run: echo OK
`,
singleWorkflows: []string{
`name: test
jobs:
job1:
name: shadowdefaultmatrixgeneratednames
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.17
`,
`name: test
jobs:
job1:
name: shadowdefaultmatrixgeneratednames-1
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.19
`,
},
},
{
name: "MatrixTwoJobsWithMatrixGeneratedNames",
workflow: `
name: test
jobs:
job1:
strategy:
matrix:
version: [1.17, 1.19]
runs-on: docker
steps:
- run: echo OK
`,
singleWorkflows: []string{
`name: test
jobs:
job1:
name: job1 (1.17)
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.17
`,
`name: test
jobs:
job1:
name: job1 (1.19)
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.19
`,
},
},
{
name: "MatrixTwoJobsWithDistinctInterpolatedNames",
workflow: `
name: test
jobs:
job1:
name: myname-${{ matrix.version }}
strategy:
matrix:
version: [1.17, 1.19]
runs-on: docker
steps:
- run: echo OK
`,
singleWorkflows: []string{
`name: test
jobs:
job1:
name: myname-1.17
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.17
`,
`name: test
jobs:
job1:
name: myname-1.19
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.19
`,
},
},
{
name: "MatrixTwoJobsWithIdenticalInterpolatedNames",
workflow: `
name: test
jobs:
job1:
name: myname-${{ matrix.typo }}
strategy:
matrix:
version: [1.17, 1.19]
runs-on: docker
steps:
- run: echo OK
`,
singleWorkflows: []string{
`name: test
jobs:
job1:
name: myname-
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.17
`,
`name: test
jobs:
job1:
name: myname--1
runs-on: docker
steps:
- run: echo OK
strategy:
matrix:
version:
- 1.19
`,
},
},
} {
t.Run(testCase.name, func(t *testing.T) {
sw, err := JobParser([]byte(testCase.workflow))
fix: de-duplicate Forgejo Actions job names when needed (#8864) The status of two jobs by the same name shadow each other, they need to be distinct. If two jobs by the same name are found, they are made distinct by adding a `-<occurence number>` suffix. Resolves forgejo/forgejo#8648 For a given workflow, `jobparser.Parse` will generate one "single" (as opposed to a workflow that can be interpreted to generate multiple jobs) workflow for each job and then insert them (marshalled as yaml) in the database. https://codeberg.org/forgejo/forgejo/src/commit/e3bfa5133f40c5d4819cee402b772e0bb94affa9/models/actions/run.go#L237-L260 The name associated with this single workflow is what the runner will receive and it is what will be used to associate the job status with a commit. Resolves forgejo/forgejo#8648 ## Checklist The [contributor guide](https://forgejo.org/docs/next/contributor/) contains information that will be helpful to first time contributors. There also are a few [conditions for merging Pull Requests in Forgejo repositories](https://codeberg.org/forgejo/governance/src/branch/main/PullRequestsAgreement.md). You are also welcome to join the [Forgejo development chatroom](https://matrix.to/#/#forgejo-development:matrix.org). ### Tests - I added test coverage for Go changes... - [x] in their respective `*_test.go` for unit tests. - [ ] in the `tests/integration` directory if it involves interactions with a live Forgejo server. ### Documentation - [x] I created a pull request [to the documentation](https://codeberg.org/forgejo/docs) to explain to Forgejo users how to use this change. - [ ] I did not document these changes and I do not expect someone else to do it. ### Release notes - [ ] I do not want this change to show in the release notes. - [x] I want the title to show in the release notes with a link to this pull request. - [ ] I want the content of the `release-notes/<pull request number>.md` to be be used for the release notes instead of the title. <!--start release-notes-assistant--> ## Release notes <!--URL:https://codeberg.org/forgejo/forgejo--> - Bug fixes - [PR](https://codeberg.org/forgejo/forgejo/pulls/8864): <!--number 8864 --><!--line 0 --><!--description ZGUtZHVwbGljYXRlIEZvcmdlam8gQWN0aW9ucyBqb2IgbmFtZXMgd2hlbiBuZWVkZWQ=-->de-duplicate Forgejo Actions job names when needed<!--description--> <!--end release-notes-assistant--> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8864 Reviewed-by: Gusted <gusted@noreply.codeberg.org> Co-authored-by: Earl Warren <contact@earl-warren.org> Co-committed-by: Earl Warren <contact@earl-warren.org>
2025-08-13 06:52:44 +02:00
require.NoError(t, err)
for i, sw := range sw {
actual, err := sw.Marshal()
require.NoError(t, err)
assert.Equal(t, testCase.singleWorkflows[i], string(actual))
}
})
}
}