commit a79e0a4557b0bac4dba28f6e6043be0533b8403f Author: garionion Date: Sun Aug 8 10:37:18 2021 +0200 initial commit diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..d75aef4 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,20 @@ +kind: pipeline +type: docker +name: default + +steps: +- name: build + image: golang + commands: + - go build + - go test ./... + +- name: publish + image: plugins/docker + settings: + auto_tag: true + repo: garionion/drone-yaml-server + username: + from_secret: docker_username + password: + from_secret: docker_password diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d8dbc5c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM alpine:3.6 as alpine +RUN apk add -U --no-cache ca-certificates + +FROM alpine:3.6 +EXPOSE 3000 + +ENV GODEBUG netdns=go + +COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ + +ADD drone-yaml-server /bin/ +ENTRYPOINT ["/bin/drone-yaml-server"] \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..c5402b9 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,55 @@ +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** diff --git a/README.md b/README.md new file mode 100644 index 0000000..8eaac9f --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +A config extension to Server to deliver drone files for repositories where you can't put a drone file in. _Please note this project requires Drone server version 1.4 or higher._ + +## Installation + +Create a shared secret: + +```console +$ openssl rand -hex 16 +bea26a2221fd8090ea38720fc445eca6 +``` + +Download and run the extension: + +```console +$ docker run -d \ + --publish=3000:3000 \ + --env=DRONE_DEBUG=true \ + --env=DRONE_SECRET=bea26a2221fd8090ea38720fc445eca6 \ + --restart=always \ + --name=config garionion/drone-yaml-server +``` + +Update your Drone server configuration to include the extension address and the shared secret. + +```text +DRONE_YAML_ENDPOINT=http://1.2.3.4:3000 +DRONE_YAML_SECRET=bea26a2221fd8090ea38720fc445eca6 +``` + +## Testing + +Use the command line tools to test your extension. _This extension uses http-signatures to authorize client access and will reject unverified requests. You will be unable to test this extension using a simple curl command._ + +```text +export DRONE_YAML_ENDPOINT=http://1.2.3.4:3000 +export DRONE_YAML_SECRET=bea26a2221fd8090ea38720fc445eca6 + +drone plugins config get +``` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d7d27c9 --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module git.entr0py.de/garionion/drone-yaml-server + +go 1.12 + +require ( + github.com/drone/drone-go v1.0.6 + github.com/joho/godotenv v1.3.0 + github.com/kelseyhightower/envconfig v1.4.0 + github.com/sirupsen/logrus v1.4.2 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c4d356b --- /dev/null +++ b/go.sum @@ -0,0 +1,23 @@ +github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= +github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e/go.mod h1:Xa6lInWHNQnuWoF0YPSsx+INFA9qk7/7pTjwb3PInkY= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/drone/drone-go v1.0.6 h1:YbMwEwlE3HC4InN0bT21EDvzImct5dGG1I56dSdUhjI= +github.com/drone/drone-go v1.0.6/go.mod h1:GxyeGClYohaKNYJv/ZpsmVHtMJ7WhoT+uDaJNcDIrk4= +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= \ No newline at end of file diff --git a/main.go b/main.go new file mode 100644 index 0000000..e403d26 --- /dev/null +++ b/main.go @@ -0,0 +1,62 @@ +// Copyright 2019 the Drone Authors. All rights reserved. +// Use of this source code is governed by the Blue Oak Model License +// that can be found in the LICENSE file. + +package main + +import ( + "net/http" + + "git.entr0py.de/garionion/drone-yaml-server/plugin" + "github.com/drone/drone-go/plugin/config" + + _ "github.com/joho/godotenv/autoload" + "github.com/kelseyhightower/envconfig" + "github.com/sirupsen/logrus" +) + +// spec provides the plugin settings. +type spec struct { + Bind string `envconfig:"DRONE_BIND"` + Debug bool `envconfig:"DRONE_DEBUG"` + Secret string `envconfig:"DRONE_SECRET"` + + // TODO replace or remove these configuration + // parameters. They are for demo purposes only. + Param1 string `envconfig:"DRONE_PARAM_1"` + Param2 string `envconfig:"DRONE_PARAM_2"` +} + +func main() { + spec := new(spec) + err := envconfig.Process("", spec) + if err != nil { + logrus.Fatal(err) + } + + if spec.Debug { + logrus.SetLevel(logrus.DebugLevel) + } + if spec.Secret == "" { + logrus.Fatalln("missing secret key") + } + if spec.Bind == "" { + spec.Bind = ":3000" + } + + handler := config.Handler( + plugin.New( + // TODO replace or remove these configuration + // parameters. They are for demo purposes only. + spec.Param1, + spec.Param2, + ), + spec.Secret, + logrus.StandardLogger(), + ) + + logrus.Infof("server listening on address %s", spec.Bind) + + http.Handle("/", handler) + logrus.Fatal(http.ListenAndServe(spec.Bind, nil)) +} diff --git a/plugin/plugin.go b/plugin/plugin.go new file mode 100644 index 0000000..3904fc3 --- /dev/null +++ b/plugin/plugin.go @@ -0,0 +1,58 @@ +// Copyright 2019 the Drone Authors. All rights reserved. +// Use of this source code is governed by the Blue Oak Model License +// that can be found in the LICENSE file. + +package plugin + +import ( + "context" + + "github.com/drone/drone-go/drone" + "github.com/drone/drone-go/plugin/config" +) + +// TODO replace or remove +const defaultPipeline = ` +kind: pipeline +name: default + +steps: +- name: build + image: golang + commands: + - go build + - go test -v +` + +// New returns a new config plugin. +func New(param1, param2 string) config.Plugin { + return &plugin{ + // TODO replace or remove these configuration + // parameters. They are for demo purposes only. + param1: param1, + param2: param2, + } +} + +type plugin struct { + // TODO replace or remove these configuration + // parameters. They are for demo purposes only. + param1 string + param2 string +} + +func (p *plugin) Find(ctx context.Context, req *config.Request) (*drone.Config, error) { + // TODO replace or remove + // this demonstrates how we can override + // and return a custom configuration file + if req.Repo.Namespace == "some-organization" { + return &drone.Config{ + Data: defaultPipeline, + }, nil + } + + // return nil and Drone will fallback to + // the standard behavior for getting the + // configuration file. + return nil, nil +} diff --git a/plugin/plugin_test.go b/plugin/plugin_test.go new file mode 100644 index 0000000..66f56ff --- /dev/null +++ b/plugin/plugin_test.go @@ -0,0 +1,11 @@ +// Copyright 2019 the Drone Authors. All rights reserved. +// Use of this source code is governed by the Blue Oak Model License +// that can be found in the LICENSE file. + +package plugin + +import "testing" + +func TestPlugin(t *testing.T) { + t.Skip() +}