mirror of
https://code.forgejo.org/forgejo/runner.git
synced 2025-09-05 18:40:59 +00:00
fix: ensure unique container names for reusable workflows (#808)
Reviewed-on: https://code.forgejo.org/forgejo/runner/pulls/808 Reviewed-by: Gusted <gusted@noreply.code.forgejo.org>
This commit is contained in:
commit
6d9a2f6fca
5 changed files with 18 additions and 13 deletions
|
@ -6,6 +6,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
@ -54,9 +55,14 @@ func newLocalReusableWorkflowExecutor(rc *RunContext) common.Executor {
|
||||||
func newRemoteReusableWorkflowExecutor(rc *RunContext) common.Executor {
|
func newRemoteReusableWorkflowExecutor(rc *RunContext) common.Executor {
|
||||||
uses := rc.Run.Job().Uses
|
uses := rc.Run.Job().Uses
|
||||||
|
|
||||||
remoteReusableWorkflow := newRemoteReusableWorkflowWithPlat(rc.Config.GitHubInstance, uses)
|
url, err := url.Parse(uses)
|
||||||
|
if err != nil {
|
||||||
|
return common.NewErrorExecutor(fmt.Errorf("'%s' cannot be parsed as a URL: %v", uses, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteReusableWorkflow := newRemoteReusableWorkflowWithPlat(url.Host, strings.TrimPrefix(url.Path, "/"))
|
||||||
if remoteReusableWorkflow == nil {
|
if remoteReusableWorkflow == nil {
|
||||||
return common.NewErrorExecutor(fmt.Errorf("expected format {owner}/{repo}/.{git_platform}/workflows/{filename}@{ref}. Actual '%s' Input string was not in a correct format", uses))
|
return common.NewErrorExecutor(fmt.Errorf("expected format {owner}/{repo}/.{git_platform}/workflows/{filename}@{ref}. Actual '%s' Input string was not in a correct format", url.Path))
|
||||||
}
|
}
|
||||||
|
|
||||||
// uses with safe filename makes the target directory look something like this {owner}-{repo}-.github-workflows-{filename}@{ref}
|
// uses with safe filename makes the target directory look something like this {owner}-{repo}-.github-workflows-{filename}@{ref}
|
||||||
|
|
|
@ -98,7 +98,7 @@ func (rc *RunContext) GetEnv() map[string]string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rc *RunContext) jobContainerName() string {
|
func (rc *RunContext) jobContainerName() string {
|
||||||
return createSimpleContainerName(rc.Config.ContainerNamePrefix, "WORKFLOW-"+common.Sha256(rc.Run.Workflow.Name), "JOB-"+rc.Name)
|
return createSimpleContainerName(rc.Config.ContainerNamePrefix, "WORKFLOW-"+common.Sha256(rc.String()), "JOB-"+rc.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDockerDaemonSocketMountPath(daemonPath string) string {
|
func getDockerDaemonSocketMountPath(daemonPath string) string {
|
||||||
|
|
|
@ -788,7 +788,7 @@ jobs:
|
||||||
},
|
},
|
||||||
inputs: []container.NewContainerInput{
|
inputs: []container.NewContainerInput{
|
||||||
{
|
{
|
||||||
Name: "WORKFLOW-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855_JOB",
|
Name: "WORKFLOW-8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1_JOB",
|
||||||
Image: "some:image",
|
Image: "some:image",
|
||||||
Username: "containerusername",
|
Username: "containerusername",
|
||||||
Password: "containerpassword",
|
Password: "containerpassword",
|
||||||
|
@ -808,7 +808,7 @@ jobs:
|
||||||
JobOptions: "",
|
JobOptions: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "WORKFLOW-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca49599-fe7f4c0058dbd2161ebe4aafa71cd83bd96ee19d3ca8043d5e4bc477a664a80c",
|
Name: "WORKFLOW-8a5edab282632443219e051e4ade2d1d5bbc671c781051bf143789-d083efaebdcab24d231fa091b85dbb8768b47136582b340132c197d9cb5e7430",
|
||||||
Image: "service1:image",
|
Image: "service1:image",
|
||||||
Username: "service1username",
|
Username: "service1username",
|
||||||
Password: "service1password",
|
Password: "service1password",
|
||||||
|
@ -828,7 +828,7 @@ jobs:
|
||||||
JobOptions: "",
|
JobOptions: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "WORKFLOW-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca49599-c233cf913e1d0c90cc1404ee09917e625f9cb82156ca3d7cb10b729d563728ea",
|
Name: "WORKFLOW-8a5edab282632443219e051e4ade2d1d5bbc671c781051bf143789-4c44cd5731ec445ebe33780a3e39ed5e20e80f8a697a6e34c7acdd3675e631a8",
|
||||||
Image: "service2:image",
|
Image: "service2:image",
|
||||||
Username: "service2username",
|
Username: "service2username",
|
||||||
Password: "service2password",
|
Password: "service2password",
|
||||||
|
|
|
@ -256,9 +256,8 @@ func TestRunner_RunEvent(t *testing.T) {
|
||||||
{workdir, "uses-composite-check-for-input-in-if-uses", "push", "", platforms, secrets},
|
{workdir, "uses-composite-check-for-input-in-if-uses", "push", "", platforms, secrets},
|
||||||
// {workdir, "remote-action-composite-js-pre-with-defaults", "push", "", platforms, secrets},
|
// {workdir, "remote-action-composite-js-pre-with-defaults", "push", "", platforms, secrets},
|
||||||
{workdir, "remote-action-composite-action-ref", "push", "", platforms, secrets},
|
{workdir, "remote-action-composite-action-ref", "push", "", platforms, secrets},
|
||||||
// reusable workflow not fully implemented yet
|
{workdir, "uses-workflow", "push", "", platforms, map[string]string{"secret": "keep_it_private"}},
|
||||||
// {workdir, "uses-workflow", "push", "", platforms, map[string]string{"secret": "keep_it_private"}},
|
{workdir, "uses-workflow", "pull_request", "", platforms, map[string]string{"secret": "keep_it_private"}},
|
||||||
// {workdir, "uses-workflow", "pull_request", "", platforms, map[string]string{"secret": "keep_it_private"}},
|
|
||||||
{workdir, "uses-docker-url", "push", "", platforms, secrets},
|
{workdir, "uses-docker-url", "push", "", platforms, secrets},
|
||||||
{workdir, "act-composite-env-test", "push", "", platforms, secrets},
|
{workdir, "act-composite-env-test", "push", "", platforms, secrets},
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ on: pull_request
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
reusable-workflow:
|
reusable-workflow:
|
||||||
uses: ./.github/workflows/local-reusable-workflow.yml
|
uses: ./testdata/.github/workflows/local-reusable-workflow.yml
|
||||||
with:
|
with:
|
||||||
string_required: string
|
string_required: string
|
||||||
bool_required: ${{ true }}
|
bool_required: ${{ true }}
|
||||||
|
@ -12,7 +12,7 @@ jobs:
|
||||||
secret: keep_it_private
|
secret: keep_it_private
|
||||||
|
|
||||||
reusable-workflow-with-inherited-secrets:
|
reusable-workflow-with-inherited-secrets:
|
||||||
uses: ./.github/workflows/local-reusable-workflow.yml
|
uses: ./testdata/.github/workflows/local-reusable-workflow.yml
|
||||||
with:
|
with:
|
||||||
string_required: string
|
string_required: string
|
||||||
bool_required: ${{ true }}
|
bool_required: ${{ true }}
|
||||||
|
@ -20,10 +20,10 @@ jobs:
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
reusable-workflow-with-on-string-notation:
|
reusable-workflow-with-on-string-notation:
|
||||||
uses: ./.github/workflows/local-reusable-workflow-no-inputs-string.yml
|
uses: ./testdata/.github/workflows/local-reusable-workflow-no-inputs-string.yml
|
||||||
|
|
||||||
reusable-workflow-with-on-array-notation:
|
reusable-workflow-with-on-array-notation:
|
||||||
uses: ./.github/workflows/local-reusable-workflow-no-inputs-array.yml
|
uses: ./testdata/.github/workflows/local-reusable-workflow-no-inputs-array.yml
|
||||||
|
|
||||||
output-test:
|
output-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue