Chore: initial commit

This commit is contained in:
Dorian Zedler 2022-08-08 12:24:26 +02:00
parent b4d444bb60
commit ebc6fba02b
Signed by: dorian
GPG key ID: 989DE36109AFA354
18 changed files with 562 additions and 2 deletions

22
.drone.yml Normal file
View file

@ -0,0 +1,22 @@
kind: pipeline
type: docker
name: default
steps:
- name: build
image: golang
commands:
- ./scripts/build.sh
- go test ./...
- name: publish
image: plugins/docker
settings:
registry: itsblue.dev
repo: itsblue.dev/plugins/github-workflow-controller
auto_tag: true
dockerfile: docker/Dockerfile
username:
from_secret: docker_username
password:
from_secret: docker_password

60
.drone.yml.multiarch Normal file
View file

@ -0,0 +1,60 @@
# if you want to publish a multi-architecture image, replace the
# contents of the .drone.yml file with the contents of this file
kind: pipeline
type: docker
name: default
steps:
- name: build
image: golang
commands:
- go build
- go test ./...
- name: publish
image: plugins/docker
settings:
repo: itsblue.dev/plugins/github-workflow-controller
auto_tag: true
auto_tag_suffix: linux-amd64
dockerfile: docker/Dockerfile
username:
from_secret: docker_username
password:
from_secret: docker_password
- name: publish_arm
image: plugins/docker
settings:
repo: itsblue.dev/plugins/github-workflow-controller
auto_tag: true
auto_tag_suffix: linux-arm
dockerfile: docker/Dockerfile.linux.arm
username:
from_secret: docker_username
password:
from_secret: docker_password
- name: publish_arm
image: plugins/docker
settings:
repo: itsblue.dev/plugins/github-workflow-controller
auto_tag: true
auto_tag_suffix: linux-arm64
dockerfile: docker/Dockerfile.linux.arm64
username:
from_secret: docker_username
password:
from_secret: docker_password
- name: manifest
image: plugins/manifest
settings:
spec: docker/manifest.tmpl
auto_tag: true
ignore_missing: true
password:
from_secret: docker_password
username:
from_secret: docker_username

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
.env
release/

55
LICENSE.md Normal file
View file

@ -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
<https://blueoakcouncil.org/license/1.0.0>.
## 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.***

View file

@ -1,3 +1,52 @@
# github-workflow-controller
A plugin to A simple plugin to control GitHub workflows.
A simple plugin to control GitHub workflows
# Usage
The following settings changes this plugin's behavior.
* param1 (optional) does something.
* param2 (optional) does something different.
Below is an example `.drone.yml` that uses this plugin.
```yaml
kind: pipeline
name: default
steps:
- name: run itsblue.dev/plugins/github-workflow-controller plugin
image: itsblue.dev/plugins/github-workflow-controller
pull: if-not-exists
settings:
param1: foo
param2: bar
```
# Building
Build the plugin binary:
```text
scripts/build.sh
```
Build the plugin image:
```text
docker build -t itsblue.dev/plugins/github-workflow-controller -f docker/Dockerfile .
```
# Testing
Execute the plugin from your current working directory:
```text
docker run --rm -e PLUGIN_PARAM1=foo -e PLUGIN_PARAM2=bar \
-e DRONE_COMMIT_SHA=8f51ad7884c5eb69c11d260a31da7a745e6b78e2 \
-e DRONE_COMMIT_BRANCH=master \
-e DRONE_BUILD_NUMBER=43 \
-e DRONE_BUILD_STATUS=success \
-w /drone/src \
-v $(pwd):/drone/src \
itsblue.dev/plugins/github-workflow-controller
```

10
docker/Dockerfile Normal file
View file

@ -0,0 +1,10 @@
FROM alpine:3.6 as alpine
RUN apk add -U --no-cache ca-certificates
FROM alpine:3.6
ENV GODEBUG netdns=go
COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ADD release/linux/amd64/plugin /bin/
ENTRYPOINT ["/bin/plugin"]

View file

@ -0,0 +1,10 @@
FROM alpine:3.6 as alpine
RUN apk add -U --no-cache ca-certificates
FROM alpine:3.6
ENV GODEBUG netdns=go
COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ADD release/linux/arm/plugin /bin/
ENTRYPOINT ["/bin/plugin"]

View file

@ -0,0 +1,10 @@
FROM alpine:3.6 as alpine
RUN apk add -U --no-cache ca-certificates
FROM alpine:3.6
ENV GODEBUG netdns=go
COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ADD release/linux/arm64/plugin /bin/
ENTRYPOINT ["/bin/plugin"]

31
docker/manifest.tmpl Normal file
View file

@ -0,0 +1,31 @@
image: itsblue.dev/plugins/github-workflow-controller:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
-
image: itsblue.dev/plugins/github-workflow-controller:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64
platform:
architecture: amd64
os: linux
-
image: itsblue.dev/plugins/github-workflow-controller:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64
platform:
variant: v8
architecture: arm64
os: linux
-
image: itsblue.dev/plugins/github-workflow-controller:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm
platform:
variant: v7
architecture: arm
os: linux
-
image: itsblue.dev/plugins/github-workflow-controller:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm
platform:
variant: v6
architecture: arm
os: linux

8
go.mod Normal file
View file

@ -0,0 +1,8 @@
module itsblue.dev/plugins/github-workflow-controller
go 1.12
require (
github.com/kelseyhightower/envconfig v1.4.0
github.com/sirupsen/logrus v1.4.2
)

12
go.sum Normal file
View file

@ -0,0 +1,12 @@
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/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/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=

48
main.go Normal file
View file

@ -0,0 +1,48 @@
// Copyright 2020 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 (
"context"
"itsblue.dev/plugins/github-workflow-controller/plugin"
"github.com/kelseyhightower/envconfig"
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetFormatter(new(formatter))
var args plugin.Args
if err := envconfig.Process("", &args); err != nil {
logrus.Fatalln(err)
}
switch args.Level {
case "debug":
logrus.SetFormatter(textFormatter)
logrus.SetLevel(logrus.DebugLevel)
case "trace":
logrus.SetFormatter(textFormatter)
logrus.SetLevel(logrus.TraceLevel)
}
if err := plugin.Exec(context.Background(), args); err != nil {
logrus.Fatalln(err)
}
}
// default formatter that writes logs without including timestamp
// or level information.
type formatter struct {}
func (*formatter) Format(entry *logrus.Entry) ([]byte, error) {
return []byte(entry.Message), nil
}
// text formatter that writes logs with level information
var textFormatter = &logrus.TextFormatter{
DisableTimestamp: true,
}

149
plugin/pipeline.go Normal file
View file

@ -0,0 +1,149 @@
// Copyright 2020 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
// Pipeline provides Pipeline metadata from the environment.
type Pipeline struct {
// Build provides build metadata.
Build struct {
Branch string `envconfig:"DRONE_BUILD_BRANCH"`
Number int `envconfig:"DRONE_BUILD_NUMBER"`
Parent int `envconfig:"DRONE_BUILD_PARENT"`
Event string `envconfig:"DRONE_BUILD_EVENT"`
Action string `envconfig:"DRONE_BUILD_ACTION"`
Status string `envconfig:"DRONE_BUILD_STATUS"`
Created int64 `envconfig:"DRONE_BUILD_CREATED"`
Started int64 `envconfig:"DRONE_BUILD_STARTED"`
Finished int64 `envconfig:"DRONE_BUILD_FINISHED"`
Link string `envconfig:"DRONE_BUILD_LINK"`
}
// Calver provides the calver details parsed from the
// git tag. If the git tag is empty or is not a valid
// calver, the values will be empty.
Calver struct {
Version string `envconfig:"DRONE_CALVER"`
Short string `envconfig:"DRONE_CALVER_SHORT"`
MajorMinor string `envconfig:"DRONE_CALVER_MAJOR_MINOR"`
Major string `envconfig:"DRONE_CALVER_MAJOR"`
Minor string `envconfig:"DRONE_CALVER_MINOR"`
Micro string `envconfig:"DRONE_CALVER_MICRO"`
Modifier string `envconfig:"DRONE_CALVER_MODIFIER"`
}
// Card provides adaptive card configuration options.
Card struct {
Path string `envconfig:"DRONE_CARD_PATH"`
}
// Commit provides the commit metadata.
Commit struct {
Rev string `envconfig:"DRONE_COMMIT_SHA"`
Before string `envconfig:"DRONE_COMMIT_BEFORE"`
After string `envconfig:"DRONE_COMMIT_AFTER"`
Ref string `envconfig:"DRONE_COMMIT_REF"`
Branch string `envconfig:"DRONE_COMMIT_BRANCH"`
Source string `envconfig:"DRONE_COMMIT_SOURCE"`
Target string `envconfig:"DRONE_COMMIT_TARGET"`
Link string `envconfig:"DRONE_COMMIT_LINK"`
Message string `envconfig:"DRONE_COMMIT_MESSAGE"`
Author struct {
Username string `envconfig:"DRONE_COMMIT_AUTHOR"`
Name string `envconfig:"DRONE_COMMIT_AUTHOR_NAME"`
Email string `envconfig:"DRONE_COMMIT_AUTHOR_EMAIL"`
Avatar string `envconfig:"DRONE_COMMIT_AUTHOR_AVATAR"`
}
}
// Deploy provides the deployment metadata.
Deploy struct {
ID string `envconfig:"DRONE_DEPLOY_TO"`
Target string `envconfig:"DRONE_DEPLOY_ID"`
}
// Failed provides a list of failed steps and failed stages
// for the current pipeline.
Failed struct {
Steps []string `envconfig:"DRONE_FAILED_STEPS"`
Stages []string `envconfig:"DRONE_FAILED_STAGES"`
}
// Git provides the git repository metadata.
Git struct {
HTTPURL string `envconfig:"DRONE_GIT_HTTP_URL"`
SSHURL string `envconfig:"DRONE_GIT_SSH_URL"`
}
// PullRequest provides the pull request metadata.
PullRequest struct {
Number int `envconfig:"DRONE_PULL_REQUEST"`
}
// Repo provides the repository metadata.
Repo struct {
Branch string `envconfig:"DRONE_REPO_BRANCH"`
Link string `envconfig:"DRONE_REPO_LINK"`
Namespace string `envconfig:"DRONE_REPO_NAMESPACE"`
Name string `envconfig:"DRONE_REPO_NAME"`
Private bool `envconfig:"DRONE_REPO_PRIVATE"`
Remote string `envconfig:"DRONE_GIT_HTTP_URL"`
SCM string `envconfig:"DRONE_REPO_SCM"`
Slug string `envconfig:"DRONE_REPO"`
Visibility string `envconfig:"DRONE_REPO_VISIBILITY"`
}
// Stage provides the stage metadata.
Stage struct {
Kind string `envconfig:"DRONE_STAGE_KIND"`
Type string `envconfig:"DRONE_STAGE_TYPE"`
Name string `envconfig:"DRONE_STAGE_NAME"`
Number int `envconfig:"DRONE_STAGE_NUMBER"`
Machine string `envconfig:"DRONE_STAGE_MACHINE"`
OS string `envconfig:"DRONE_STAGE_OS"`
Arch string `envconfig:"DRONE_STAGE_ARCH"`
Variant string `envconfig:"DRONE_STAGE_VARIANT"`
Status string `envconfig:"DRONE_STAGE_STATUS"`
Started int64 `envconfig:"DRONE_STAGE_STARTED"`
Finished int64 `envconfig:"DRONE_STAGE_FINISHED"`
DependsOn []string `envconfig:"DRONE_STAGE_DEPENDS_ON"`
}
// Step provides the step metadata.
Step struct {
Number int `envconfig:"DRONE_STEP_NUMBER"`
Name string `envconfig:"DRONE_STEP_NAME"`
}
// Semver provides the semver details parsed from the
// git tag. If the git tag is empty or is not a valid
// semver, the values will be empty and the error field
// will be populated with the parsing error.
Semver struct {
Version string `envconfig:"DRONE_SEMVER"`
Short string `envconfig:"DRONE_SEMVER_SHORT"`
Major string `envconfig:"DRONE_SEMVER_MAJOR"`
Minor string `envconfig:"DRONE_SEMVER_MINOR"`
Patch string `envconfig:"DRONE_SEMVER_PATCH"`
Build string `envconfig:"DRONE_SEMVER_BUILD"`
PreRelease string `envconfig:"DRONE_SEMVER_PRERELEASE"`
Error string `envconfig:"DRONE_SEMVER_ERROR"`
}
// System provides the Drone system metadata, including
// the system version of details required to create the
// drone website address.
System struct {
Proto string `envconfig:"DRONE_SYSTEM_PROTO"`
Host string `envconfig:"DRONE_SYSTEM_HOST"`
Hostname string `envconfig:"DRONE_SYSTEM_HOSTNAME"`
Version string `envconfig:"DRONE_SYSTEM_VERSION"`
}
// Tag provides the git tag details.
Tag struct {
Name string `envconfig:"DRONE_TAG"`
}
}

25
plugin/plugin.go Normal file
View file

@ -0,0 +1,25 @@
// Copyright 2020 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"
// Args provides plugin execution arguments.
type Args struct {
Pipeline
// Level defines the plugin log level.
Level string `envconfig:"PLUGIN_LOG_LEVEL"`
// TODO replace or remove
Param1 string `envconfig:"PLUGIN_PARAM1"`
Param2 string `envconfig:"PLUGIN_PARAM2"`
}
// Exec executes the plugin.
func Exec(ctx context.Context, args Args) error {
// write code here
return nil
}

11
plugin/plugin_test.go Normal file
View file

@ -0,0 +1,11 @@
// Copyright 2020 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()
}

36
plugin/util.go Normal file
View file

@ -0,0 +1,36 @@
// Copyright 2020 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 (
"encoding/base64"
"encoding/json"
"io"
"io/ioutil"
"os"
)
func writeCard(path, schema string, card interface{}) {
data, _ := json.Marshal(map[string]interface{}{
"schema": schema,
"data": card,
})
switch {
case path == "/dev/stdout":
writeCardTo(os.Stdout, data)
case path == "/dev/stderr":
writeCardTo(os.Stderr, data)
case path != "":
ioutil.WriteFile(path, data, 0644)
}
}
func writeCardTo(out io.Writer, data []byte) {
encoded := base64.StdEncoding.EncodeToString(data)
io.WriteString(out, "\u001B]1338;")
io.WriteString(out, encoded)
io.WriteString(out, "\u001B]0m")
io.WriteString(out, "\n")
}

18
scripts/build.sh Executable file
View file

@ -0,0 +1,18 @@
#!/bin/sh
# force go modules
export GOPATH=""
# disable cgo
export CGO_ENABLED=0
set -e
set -x
# linux
GOOS=linux GOARCH=amd64 go build -o release/linux/amd64/plugin
GOOS=linux GOARCH=arm64 go build -o release/linux/arm64/plugin
GOOS=linux GOARCH=arm go build -o release/linux/arm/plugin
# windows
GOOS=windows go build -o release/windows/amd64/plugin.exe

3
scripts/upgrade.sh Executable file
View file

@ -0,0 +1,3 @@
#!/bin/sh
curl https://raw.githubusercontent.com/drone/boilr-plugin/master/template/plugin/pipeline.go --output plugin/pipeline.go