Feat: first working version
continuous-integration/drone Build is failing Details

This commit is contained in:
Dorian Zedler 2022-07-23 20:28:41 +02:00
parent a4edf211b7
commit 13e379150f
Signed by: dorian
GPG Key ID: 989DE36109AFA354
8 changed files with 159 additions and 30 deletions

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
.env
release/
test/
run.sh

View File

@ -18,8 +18,8 @@ steps:
image: itsblue.dev/plugins/codeberg-pages-deploy
pull: if-not-exists
settings:
param1: foo
param2: bar
folder: public
ssh_key: foo
```
# Building
@ -41,7 +41,7 @@ docker build -t itsblue.dev/plugins/codeberg-pages-deploy -f docker/Dockerfile .
Execute the plugin from your current working directory:
```text
docker run --rm -e PLUGIN_PARAM1=foo -e PLUGIN_PARAM2=bar \
docker run --rm -e PLUGIN_FOLDER=public -e PLUGIN_SSH_KEY=foo \
-e DRONE_COMMIT_SHA=8f51ad7884c5eb69c11d260a31da7a745e6b78e2 \
-e DRONE_COMMIT_BRANCH=master \
-e DRONE_BUILD_NUMBER=43 \

View File

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

View File

@ -1,10 +0,0 @@
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

@ -1,10 +0,0 @@
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"]

1
go.mod
View File

@ -3,6 +3,7 @@ module itsblue.dev/plugins/codeberg-pages-deploy
go 1.12
require (
github.com/appleboy/drone-git-push v0.2.1 // indirect
github.com/kelseyhightower/envconfig v1.4.0
github.com/sirupsen/logrus v1.4.2
)

13
go.sum
View File

@ -1,12 +1,25 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/appleboy/drone-git-push v0.2.1 h1:qHVGsyH+W13riH3WVWVUMDhvWuyL39YxS9W8vusyRKc=
github.com/appleboy/drone-git-push v0.2.1/go.mod h1:U8WR++X176gQ6xoWz3dfhKsHBvr0sGDfwcmT5ih5UiU=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
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=
github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
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=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

View File

@ -4,7 +4,17 @@
package plugin
import "context"
import (
"context"
"errors"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/appleboy/drone-git-push/repo"
)
// Args provides plugin execution arguments.
type Args struct {
@ -13,13 +23,136 @@ type Args struct {
// 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"`
Folder string `envconfig:"PLUGIN_FOLDER"`
SshKey string `envconfig:"PLUGIN_SSH_KEY"`
GitRemote string `envconfig:"PLUGIN_GIT_REMOTE"`
}
const BRANCH_NAME = "pages"
// Exec executes the plugin.
func Exec(ctx context.Context, args Args) error {
if err := checkArgs(args); err != nil {
return err
}
if err := repo.WriteKey(strings.ReplaceAll(args.SshKey, "\\n", "\n")); err != nil {
return err
}
if err := writeConfig(args); err != nil {
return err
}
if err := copyFiles(args); err != nil {
return err
}
if err := initRepo(args); err != nil {
return err
}
if err := doCommit(args); err != nil {
return err
}
if err := push(args); err != nil {
return err
}
// write code here
return nil
}
func checkArgs(args Args) error {
if args.Folder == "" {
return errors.New("PLUGIN_FOLDER is required!")
}
if folderInfo, err := os.Stat(args.Folder); os.IsNotExist(err) || !folderInfo.IsDir() {
return errors.New("PLUGIN_FOLDER is not a folder!")
}
if args.SshKey == "" {
return errors.New("PLUGIN_SSH_KEY is required!")
}
if args.GitRemote == "" {
return errors.New("PLUGIN_GIT_REMOTE is required!")
}
return nil
}
func writeConfig(args Args) error {
if err := repo.GlobalName("[BOT] pages deployer").Run(); err != nil {
return err
}
if err := repo.GlobalUser("noreply@pages.bot").Run(); err != nil {
return err
}
return nil
}
func copyFiles(args Args) error {
if err := os.MkdirAll("/tmp", 777); err != nil {
return err
}
folder, err := filepath.Abs(args.Folder)
if err != nil {
return err
}
cmd := exec.Command("mv", folder, "/tmp/pages")
if err := execute(cmd); err != nil {
return err
}
if err := os.Chown("/tmp/pages", os.Getuid(), os.Getgid()); err != nil {
return err
}
return os.Chdir("/tmp/pages")
}
func initRepo(args Args) error {
cmd := exec.Command(
"git",
"init", "-b", BRANCH_NAME, "/tmp/pages")
if err := execute(cmd); err != nil {
return err
}
return nil
}
func doCommit(args Args) error {
if err := execute(repo.Add()); err != nil {
return err
}
if err := execute(repo.ForceCommit("Update pages 🚀", true)); err != nil {
return err
}
return nil
}
func push(args Args) error {
return execute(repo.RemotePushNamedBranch(args.GitRemote, BRANCH_NAME, BRANCH_NAME, true, false))
}
func execute(cmd *exec.Cmd) error {
fmt.Println("+", strings.Join(cmd.Args, " "))
cmd.Env = os.Environ()
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
return cmd.Run()
}