From 5417d3ac6742842fe01f6af00f8ef08e24971d11 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 2 Dec 2025 19:36:38 +0000 Subject: [PATCH] Interpolate `uses` for remote reusable workflows (#145) Related to #127 Reviewed-on: https://gitea.com/gitea/act/pulls/145 Reviewed-by: Lunny Xiao Reviewed-by: ChristopherHX Co-authored-by: Zettat123 Co-committed-by: Zettat123 --- pkg/runner/reusable_workflow.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pkg/runner/reusable_workflow.go b/pkg/runner/reusable_workflow.go index a7385663..c0d079e5 100644 --- a/pkg/runner/reusable_workflow.go +++ b/pkg/runner/reusable_workflow.go @@ -142,12 +142,14 @@ func cloneIfRequired(rc *RunContext, remoteReusableWorkflow remoteReusableWorkfl return notExists }, func(ctx context.Context) error { + // interpolate the cloneURL + cloneURL := rc.NewExpressionEvaluator(ctx).Interpolate(ctx, remoteReusableWorkflow.CloneURL()) // Do not change the remoteReusableWorkflow.URL, because: // 1. Gitea doesn't support specifying GithubContext.ServerURL by the GITHUB_SERVER_URL env // 2. Gitea has already full URL with rc.Config.GitHubInstance when calling newRemoteReusableWorkflowWithPlat // remoteReusableWorkflow.URL = rc.getGithubContext(ctx).ServerURL return git.NewGitCloneExecutor(git.NewGitCloneExecutorInput{ - URL: remoteReusableWorkflow.CloneURL(), + URL: cloneURL, Ref: remoteReusableWorkflow.Ref, Dir: targetDirectory, Token: token, @@ -321,23 +323,28 @@ func setReusedWorkflowCallerResult(rc *RunContext, runner Runner) common.Executo } // For Gitea -// getGitCloneToken returns GITEA_TOKEN when checkCloneURL returns true, +// getGitCloneToken returns GITEA_TOKEN when shouldCloneURLUseToken returns true, // otherwise returns an empty string func getGitCloneToken(conf *Config, cloneURL string) string { - if !checkCloneURL(conf.GitHubInstance, cloneURL) { + if !shouldCloneURLUseToken(conf.GitHubInstance, cloneURL) { return "" } return conf.GetToken() } // For Gitea -// checkCloneURL returns true when the cloneURL is from the same Gitea instance that the runner is registered to -func checkCloneURL(instanceURL, cloneURL string) bool { +// shouldCloneURLUseToken returns true when the following conditions are met: +// 1. cloneURL is from the same Gitea instance that the runner is registered to +// 2. the cloneURL does not have basic auth embedded +func shouldCloneURLUseToken(instanceURL, cloneURL string) bool { u1, err1 := url.Parse(instanceURL) u2, err2 := url.Parse(cloneURL) if err1 != nil || err2 != nil { return false } + if u2.User != nil { + return false + } return u1.Host == u2.Host }