mirror of
https://github.com/harness/drone.git
synced 2025-05-04 14:43:15 +08:00
added build link endpoint with redirect
This commit is contained in:
parent
d7eb33b7b4
commit
aaa02ba1a0
@ -21,12 +21,13 @@ import (
|
|||||||
"github.com/drone/drone/metric/sink"
|
"github.com/drone/drone/metric/sink"
|
||||||
"github.com/drone/drone/pubsub"
|
"github.com/drone/drone/pubsub"
|
||||||
"github.com/drone/drone/service/commit"
|
"github.com/drone/drone/service/commit"
|
||||||
"github.com/drone/drone/service/content"
|
contents "github.com/drone/drone/service/content"
|
||||||
"github.com/drone/drone/service/content/cache"
|
"github.com/drone/drone/service/content/cache"
|
||||||
"github.com/drone/drone/service/hook"
|
"github.com/drone/drone/service/hook"
|
||||||
"github.com/drone/drone/service/hook/parser"
|
"github.com/drone/drone/service/hook/parser"
|
||||||
|
"github.com/drone/drone/service/linker"
|
||||||
"github.com/drone/drone/service/netrc"
|
"github.com/drone/drone/service/netrc"
|
||||||
"github.com/drone/drone/service/org"
|
orgs "github.com/drone/drone/service/org"
|
||||||
"github.com/drone/drone/service/repo"
|
"github.com/drone/drone/service/repo"
|
||||||
"github.com/drone/drone/service/status"
|
"github.com/drone/drone/service/status"
|
||||||
"github.com/drone/drone/service/syncer"
|
"github.com/drone/drone/service/syncer"
|
||||||
@ -47,6 +48,7 @@ var serviceSet = wire.NewSet(
|
|||||||
cron.New,
|
cron.New,
|
||||||
livelog.New,
|
livelog.New,
|
||||||
orgs.New,
|
orgs.New,
|
||||||
|
linker.New,
|
||||||
parser.New,
|
parser.New,
|
||||||
pubsub.New,
|
pubsub.New,
|
||||||
token.Renewer,
|
token.Renewer,
|
||||||
|
@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/drone/drone/service/commit"
|
"github.com/drone/drone/service/commit"
|
||||||
"github.com/drone/drone/service/hook/parser"
|
"github.com/drone/drone/service/hook/parser"
|
||||||
"github.com/drone/drone/service/license"
|
"github.com/drone/drone/service/license"
|
||||||
|
"github.com/drone/drone/service/linker"
|
||||||
"github.com/drone/drone/service/org"
|
"github.com/drone/drone/service/org"
|
||||||
"github.com/drone/drone/service/token"
|
"github.com/drone/drone/service/token"
|
||||||
"github.com/drone/drone/service/user"
|
"github.com/drone/drone/service/user"
|
||||||
@ -79,6 +80,7 @@ func InitializeApplication(config2 config.Config) (application, error) {
|
|||||||
runner := provideRunner(buildManager, secretService, registryService, config2)
|
runner := provideRunner(buildManager, secretService, registryService, config2)
|
||||||
hookService := provideHookService(client, renewer, config2)
|
hookService := provideHookService(client, renewer, config2)
|
||||||
licenseService := license.NewService(userStore, repositoryStore, buildStore, coreLicense)
|
licenseService := license.NewService(userStore, repositoryStore, buildStore, coreLicense)
|
||||||
|
coreLinker := linker.New(client)
|
||||||
permStore := perm.New(db)
|
permStore := perm.New(db)
|
||||||
repositoryService := provideRepositoryService(client, renewer, config2)
|
repositoryService := provideRepositoryService(client, renewer, config2)
|
||||||
session, err := provideSession(userStore, config2)
|
session, err := provideSession(userStore, config2)
|
||||||
@ -87,7 +89,7 @@ func InitializeApplication(config2 config.Config) (application, error) {
|
|||||||
}
|
}
|
||||||
batcher := batch.New(db)
|
batcher := batch.New(db)
|
||||||
syncer := provideSyncer(repositoryService, repositoryStore, userStore, batcher, config2)
|
syncer := provideSyncer(repositoryService, repositoryStore, userStore, batcher, config2)
|
||||||
server := api.New(buildStore, commitService, cronStore, corePubsub, globalSecretStore, hookService, logStore, coreLicense, licenseService, permStore, repositoryStore, repositoryService, scheduler, secretStore, stageStore, stepStore, statusService, session, logStream, syncer, system, triggerer, userStore, webhookSender)
|
server := api.New(buildStore, commitService, cronStore, corePubsub, globalSecretStore, hookService, logStore, coreLicense, licenseService, coreLinker, permStore, repositoryStore, repositoryService, scheduler, secretStore, stageStore, stepStore, statusService, session, logStream, syncer, system, triggerer, userStore, webhookSender)
|
||||||
organizationService := orgs.New(client, renewer)
|
organizationService := orgs.New(client, renewer)
|
||||||
userService := user.New(client)
|
userService := user.New(client)
|
||||||
admissionService := provideAdmissionPlugin(client, organizationService, userService, config2)
|
admissionService := provideAdmissionPlugin(client, organizationService, userService, config2)
|
||||||
|
23
core/linker.go
Normal file
23
core/linker.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright 2019 Drone IO, Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package core
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
// Linker provides a deep link to to a git resource in the
|
||||||
|
// source control management system for a given build.
|
||||||
|
type Linker interface {
|
||||||
|
Link(ctx context.Context, repo *Repository, build *Build) (string, error)
|
||||||
|
}
|
2
go.mod
2
go.mod
@ -24,7 +24,7 @@ require (
|
|||||||
github.com/drone/envsubst v1.0.1
|
github.com/drone/envsubst v1.0.1
|
||||||
github.com/drone/go-license v1.0.2
|
github.com/drone/go-license v1.0.2
|
||||||
github.com/drone/go-login v1.0.4-0.20190311170324-2a4df4f242a2
|
github.com/drone/go-login v1.0.4-0.20190311170324-2a4df4f242a2
|
||||||
github.com/drone/go-scm v1.5.1-0.20190826160521-fda52b1e0829
|
github.com/drone/go-scm v1.6.1-0.20190920225054-0d1ea63283ad
|
||||||
github.com/drone/signal v1.0.0
|
github.com/drone/signal v1.0.0
|
||||||
github.com/dustin/go-humanize v1.0.0
|
github.com/dustin/go-humanize v1.0.0
|
||||||
github.com/ghodss/yaml v1.0.0
|
github.com/ghodss/yaml v1.0.0
|
||||||
|
3
go.sum
3
go.sum
@ -148,6 +148,9 @@ github.com/drone/go-scm v1.5.1-0.20190820185953-16026ee6136f h1:9XvpwHypYIs/6G2p
|
|||||||
github.com/drone/go-scm v1.5.1-0.20190820185953-16026ee6136f/go.mod h1:YT4FxQ3U/ltdCrBJR9B0tRpJ1bYA/PM3NyaLE/rYIvw=
|
github.com/drone/go-scm v1.5.1-0.20190820185953-16026ee6136f/go.mod h1:YT4FxQ3U/ltdCrBJR9B0tRpJ1bYA/PM3NyaLE/rYIvw=
|
||||||
github.com/drone/go-scm v1.5.1-0.20190826160521-fda52b1e0829 h1:aCxLIAH07bdq1+ftSxrj743yYt9h/JBd8GV9ZSBeTaQ=
|
github.com/drone/go-scm v1.5.1-0.20190826160521-fda52b1e0829 h1:aCxLIAH07bdq1+ftSxrj743yYt9h/JBd8GV9ZSBeTaQ=
|
||||||
github.com/drone/go-scm v1.5.1-0.20190826160521-fda52b1e0829/go.mod h1:YT4FxQ3U/ltdCrBJR9B0tRpJ1bYA/PM3NyaLE/rYIvw=
|
github.com/drone/go-scm v1.5.1-0.20190826160521-fda52b1e0829/go.mod h1:YT4FxQ3U/ltdCrBJR9B0tRpJ1bYA/PM3NyaLE/rYIvw=
|
||||||
|
github.com/drone/go-scm v1.6.0 h1:PZZWLeSHHwdc6zbSQpg9n0CNoRB+8DAINzX9X/wJifY=
|
||||||
|
github.com/drone/go-scm v1.6.1-0.20190920225054-0d1ea63283ad h1:rVQW27ofuahCt6Vur7h8oV+fi7JW8yxCiw6PzQmqEFw=
|
||||||
|
github.com/drone/go-scm v1.6.1-0.20190920225054-0d1ea63283ad/go.mod h1:YT4FxQ3U/ltdCrBJR9B0tRpJ1bYA/PM3NyaLE/rYIvw=
|
||||||
github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI=
|
github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI=
|
||||||
github.com/drone/signal v1.0.0/go.mod h1:S8t92eFT0g4WUgEc/LxG+LCuiskpMNsG0ajAMGnyZpc=
|
github.com/drone/signal v1.0.0/go.mod h1:S8t92eFT0g4WUgEc/LxG+LCuiskpMNsG0ajAMGnyZpc=
|
||||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||||
|
@ -27,6 +27,7 @@ import (
|
|||||||
"github.com/drone/drone/handler/api/queue"
|
"github.com/drone/drone/handler/api/queue"
|
||||||
"github.com/drone/drone/handler/api/repos"
|
"github.com/drone/drone/handler/api/repos"
|
||||||
"github.com/drone/drone/handler/api/repos/builds"
|
"github.com/drone/drone/handler/api/repos/builds"
|
||||||
|
"github.com/drone/drone/handler/api/repos/builds/link"
|
||||||
"github.com/drone/drone/handler/api/repos/builds/logs"
|
"github.com/drone/drone/handler/api/repos/builds/logs"
|
||||||
"github.com/drone/drone/handler/api/repos/builds/stages"
|
"github.com/drone/drone/handler/api/repos/builds/stages"
|
||||||
"github.com/drone/drone/handler/api/repos/collabs"
|
"github.com/drone/drone/handler/api/repos/collabs"
|
||||||
@ -65,6 +66,7 @@ func New(
|
|||||||
logs core.LogStore,
|
logs core.LogStore,
|
||||||
license *core.License,
|
license *core.License,
|
||||||
licenses core.LicenseService,
|
licenses core.LicenseService,
|
||||||
|
linker core.Linker,
|
||||||
perms core.PermStore,
|
perms core.PermStore,
|
||||||
repos core.RepositoryStore,
|
repos core.RepositoryStore,
|
||||||
repoz core.RepositoryService,
|
repoz core.RepositoryService,
|
||||||
@ -91,6 +93,7 @@ func New(
|
|||||||
Logs: logs,
|
Logs: logs,
|
||||||
License: license,
|
License: license,
|
||||||
Licenses: licenses,
|
Licenses: licenses,
|
||||||
|
Linker: linker,
|
||||||
Perms: perms,
|
Perms: perms,
|
||||||
Repos: repos,
|
Repos: repos,
|
||||||
Repoz: repoz,
|
Repoz: repoz,
|
||||||
@ -120,6 +123,7 @@ type Server struct {
|
|||||||
Logs core.LogStore
|
Logs core.LogStore
|
||||||
License *core.License
|
License *core.License
|
||||||
Licenses core.LicenseService
|
Licenses core.LicenseService
|
||||||
|
Linker core.Linker
|
||||||
Perms core.PermStore
|
Perms core.PermStore
|
||||||
Repos core.RepositoryStore
|
Repos core.RepositoryStore
|
||||||
Repoz core.RepositoryService
|
Repoz core.RepositoryService
|
||||||
@ -175,6 +179,7 @@ func (s Server) Handler() http.Handler {
|
|||||||
|
|
||||||
r.Get("/latest", builds.HandleLast(s.Repos, s.Builds, s.Stages))
|
r.Get("/latest", builds.HandleLast(s.Repos, s.Builds, s.Stages))
|
||||||
r.Get("/{number}", builds.HandleFind(s.Repos, s.Builds, s.Stages))
|
r.Get("/{number}", builds.HandleFind(s.Repos, s.Builds, s.Stages))
|
||||||
|
r.Get("/{number}/link", link.HandleLink(s.Repos, s.Builds, s.Linker))
|
||||||
r.Get("/{number}/logs/{stage}/{step}", logs.HandleFind(s.Repos, s.Builds, s.Stages, s.Steps, s.Logs))
|
r.Get("/{number}/logs/{stage}/{step}", logs.HandleFind(s.Repos, s.Builds, s.Stages, s.Steps, s.Logs))
|
||||||
|
|
||||||
r.With(
|
r.With(
|
||||||
|
74
handler/api/repos/builds/link/link.go
Normal file
74
handler/api/repos/builds/link/link.go
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// Copyright 2019 Drone IO, Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package link
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/drone/drone/core"
|
||||||
|
"github.com/drone/drone/handler/api/render"
|
||||||
|
|
||||||
|
"github.com/go-chi/chi"
|
||||||
|
)
|
||||||
|
|
||||||
|
// payload wraps the link and returns to the
|
||||||
|
// client as a valid json object.
|
||||||
|
type payload struct {
|
||||||
|
Link string `json:"link"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleLink returns an http.HandlerFunc that redirects the
|
||||||
|
// user to the git resource in the remote source control
|
||||||
|
// management system.
|
||||||
|
func HandleLink(
|
||||||
|
repos core.RepositoryStore,
|
||||||
|
builds core.BuildStore,
|
||||||
|
linker core.Linker,
|
||||||
|
) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var (
|
||||||
|
ctx = r.Context()
|
||||||
|
namespace = chi.URLParam(r, "owner")
|
||||||
|
name = chi.URLParam(r, "name")
|
||||||
|
)
|
||||||
|
number, err := strconv.ParseInt(chi.URLParam(r, "number"), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
render.BadRequest(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
repo, err := repos.FindName(ctx, namespace, name)
|
||||||
|
if err != nil {
|
||||||
|
render.NotFound(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
build, err := builds.FindNumber(ctx, repo.ID, number)
|
||||||
|
if err != nil {
|
||||||
|
render.NotFound(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
to, err := linker.Link(ctx, repo, build)
|
||||||
|
if err != nil {
|
||||||
|
render.NotFound(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if r.FormValue("redirect") == "true" {
|
||||||
|
http.Redirect(w, r, to, http.StatusSeeOther)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
v := &payload{to}
|
||||||
|
render.JSON(w, v, http.StatusOK)
|
||||||
|
}
|
||||||
|
}
|
15
handler/api/repos/builds/link/link_test.go
Normal file
15
handler/api/repos/builds/link/link_test.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2019 Drone IO, Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package link
|
40
service/linker/linker.go
Normal file
40
service/linker/linker.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Copyright 2019 Drone IO, Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package linker
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/drone/drone/core"
|
||||||
|
"github.com/drone/go-scm/scm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// New returns a new Linker server.
|
||||||
|
func New(client *scm.Client) core.Linker {
|
||||||
|
return &service{
|
||||||
|
client: client,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type service struct {
|
||||||
|
client *scm.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Link(ctx context.Context, repo *core.Repository, build *core.Build) (string, error) {
|
||||||
|
return s.client.Linker.Resource(ctx, repo.Slug, scm.Reference{
|
||||||
|
Path: build.Ref,
|
||||||
|
Sha: build.After,
|
||||||
|
})
|
||||||
|
}
|
15
service/linker/linker_test.go
Normal file
15
service/linker/linker_test.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2019 Drone IO, Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
package linker
|
@ -208,7 +208,7 @@ func (t *triggerer) Trigger(ctx context.Context, repo *core.Repository, base *co
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logger = logger.WithError(err)
|
logger = logger.WithError(err)
|
||||||
logger.Warnln("trigger: cannot convert yaml")
|
logger.Warnln("trigger: cannot convert yaml")
|
||||||
return nil, err
|
return t.createBuildError(ctx, repo, base, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
// this code is temporarily in place to detect and convert
|
// this code is temporarily in place to detect and convert
|
||||||
@ -221,7 +221,7 @@ func (t *triggerer) Trigger(ctx context.Context, repo *core.Repository, base *co
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logger = logger.WithError(err)
|
logger = logger.WithError(err)
|
||||||
logger.Warnln("trigger: cannot convert yaml")
|
logger.Warnln("trigger: cannot convert yaml")
|
||||||
return nil, err
|
return t.createBuildError(ctx, repo, base, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
manifest, err := yaml.ParseString(raw.Data)
|
manifest, err := yaml.ParseString(raw.Data)
|
||||||
|
Loading…
Reference in New Issue
Block a user