2023-06-04 22:15:07 +00:00
|
|
|
// Copyright 2023 Woodpecker Authors
|
2022-09-14 07:30:37 +00:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2017-03-05 07:56:08 +00:00
|
|
|
package frontend
|
|
|
|
|
2017-03-12 08:46:59 +00:00
|
|
|
import (
|
2023-06-04 22:15:07 +00:00
|
|
|
"fmt"
|
|
|
|
"net/url"
|
2017-03-12 08:46:59 +00:00
|
|
|
"strings"
|
2021-11-25 19:43:31 +00:00
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
"github.com/drone/envsubst"
|
2017-03-05 07:56:08 +00:00
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
"github.com/woodpecker-ci/woodpecker/pipeline/frontend/metadata"
|
|
|
|
"github.com/woodpecker-ci/woodpecker/server/model"
|
|
|
|
"github.com/woodpecker-ci/woodpecker/version"
|
2022-11-15 18:47:27 +00:00
|
|
|
)
|
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
func EnvVarSubst(yaml string, environ map[string]string) (string, error) {
|
|
|
|
return envsubst.Eval(yaml, func(name string) string {
|
|
|
|
env := environ[name]
|
|
|
|
if strings.Contains(env, "\n") {
|
|
|
|
env = fmt.Sprintf("%q", env)
|
|
|
|
}
|
|
|
|
return env
|
|
|
|
})
|
|
|
|
}
|
2017-03-05 07:56:08 +00:00
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
// MetadataFromStruct return the metadata from a pipeline will run with.
|
|
|
|
func MetadataFromStruct(forge metadata.ServerForge, repo *model.Repo, pipeline, last *model.Pipeline, workflow *model.Step, link string) metadata.Metadata {
|
|
|
|
host := link
|
|
|
|
uri, err := url.Parse(link)
|
|
|
|
if err == nil {
|
|
|
|
host = uri.Host
|
2017-03-05 07:56:08 +00:00
|
|
|
}
|
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
fForge := metadata.Forge{}
|
|
|
|
if forge != nil {
|
|
|
|
fForge = metadata.Forge{
|
|
|
|
Type: forge.Name(),
|
|
|
|
URL: forge.URL(),
|
|
|
|
}
|
2017-03-05 07:56:08 +00:00
|
|
|
}
|
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
fRepo := metadata.Repo{}
|
|
|
|
if repo != nil {
|
|
|
|
fRepo = metadata.Repo{
|
|
|
|
Name: repo.Name,
|
|
|
|
Owner: repo.Owner,
|
|
|
|
RemoteID: fmt.Sprint(repo.ForgeRemoteID),
|
|
|
|
Link: repo.Link,
|
|
|
|
CloneURL: repo.Clone,
|
|
|
|
Private: repo.IsSCMPrivate,
|
|
|
|
Branch: repo.Branch,
|
|
|
|
Trusted: repo.IsTrusted,
|
|
|
|
}
|
|
|
|
|
|
|
|
if idx := strings.LastIndex(repo.FullName, "/"); idx != -1 {
|
|
|
|
if fRepo.Name == "" && repo.FullName != "" {
|
|
|
|
fRepo.Name = repo.FullName[idx+1:]
|
|
|
|
}
|
|
|
|
if fRepo.Owner == "" && repo.FullName != "" {
|
|
|
|
fRepo.Owner = repo.FullName[:idx]
|
|
|
|
}
|
|
|
|
}
|
2017-03-05 07:56:08 +00:00
|
|
|
}
|
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
fWorkflow := metadata.Workflow{}
|
|
|
|
if workflow != nil {
|
|
|
|
fWorkflow = metadata.Workflow{
|
|
|
|
Name: workflow.Name,
|
|
|
|
Number: workflow.PID,
|
|
|
|
Matrix: workflow.Environ,
|
|
|
|
}
|
2023-04-08 11:15:28 +00:00
|
|
|
}
|
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
return metadata.Metadata{
|
|
|
|
Repo: fRepo,
|
|
|
|
Curr: metadataPipelineFromModelPipeline(pipeline, true),
|
|
|
|
Prev: metadataPipelineFromModelPipeline(last, false),
|
|
|
|
Workflow: fWorkflow,
|
|
|
|
Step: metadata.Step{},
|
|
|
|
Sys: metadata.System{
|
|
|
|
Name: "woodpecker",
|
|
|
|
Link: link,
|
|
|
|
Host: host,
|
|
|
|
Platform: "", // will be set by pipeline platform option or by agent
|
|
|
|
Version: version.Version,
|
|
|
|
},
|
|
|
|
Forge: fForge,
|
2017-03-12 08:46:59 +00:00
|
|
|
}
|
2023-06-04 22:15:07 +00:00
|
|
|
}
|
2017-03-12 08:46:59 +00:00
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent bool) metadata.Pipeline {
|
|
|
|
if pipeline == nil {
|
|
|
|
return metadata.Pipeline{}
|
2017-03-05 07:56:08 +00:00
|
|
|
}
|
2023-05-31 16:30:41 +00:00
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
cron := ""
|
|
|
|
if pipeline.Event == model.EventCron {
|
|
|
|
cron = pipeline.Sender
|
2023-05-31 16:30:41 +00:00
|
|
|
}
|
2021-11-25 19:43:31 +00:00
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
parent := int64(0)
|
|
|
|
if includeParent {
|
|
|
|
parent = pipeline.Parent
|
2017-04-21 15:32:33 +00:00
|
|
|
}
|
2019-10-24 09:39:14 +00:00
|
|
|
|
2023-06-04 22:15:07 +00:00
|
|
|
return metadata.Pipeline{
|
|
|
|
Number: pipeline.Number,
|
|
|
|
Parent: parent,
|
|
|
|
Created: pipeline.Created,
|
|
|
|
Started: pipeline.Started,
|
|
|
|
Finished: pipeline.Finished,
|
|
|
|
Status: string(pipeline.Status),
|
|
|
|
Event: string(pipeline.Event),
|
|
|
|
Link: pipeline.Link,
|
|
|
|
Target: pipeline.Deploy,
|
|
|
|
Commit: metadata.Commit{
|
|
|
|
Sha: pipeline.Commit,
|
|
|
|
Ref: pipeline.Ref,
|
|
|
|
Refspec: pipeline.Refspec,
|
|
|
|
Branch: pipeline.Branch,
|
|
|
|
Message: pipeline.Message,
|
|
|
|
Author: metadata.Author{
|
|
|
|
Name: pipeline.Author,
|
|
|
|
Email: pipeline.Email,
|
|
|
|
Avatar: pipeline.Avatar,
|
|
|
|
},
|
|
|
|
ChangedFiles: pipeline.ChangedFiles,
|
|
|
|
PullRequestLabels: pipeline.PullRequestLabels,
|
|
|
|
},
|
|
|
|
Cron: cron,
|
2019-10-24 09:39:14 +00:00
|
|
|
}
|
2019-06-05 13:58:27 +00:00
|
|
|
}
|