diff --git a/CONFIGURATION_SERVER.md b/CONFIGURATION_SERVER.md new file mode 100644 index 0000000..04d5c69 --- /dev/null +++ b/CONFIGURATION_SERVER.md @@ -0,0 +1 @@ +# Configuration server diff --git a/README.md b/README.md new file mode 100644 index 0000000..10ea947 --- /dev/null +++ b/README.md @@ -0,0 +1,249 @@ +

+ +

+

Octopush - Your cute action executor

+ +## Purpose + +The goal of this project is to easily do batch changes or queries on a host of +repositories. In large organisations using multi-repository strategies, it may +be painful to change even small things across many repositories, because there +are so many of them. Octopush aims to change that. + +**DISCLAIMER:** It is still early days, and the api is subject to change. + +## Features + +- Uses an actions repository, where you store all your pending commands or + queries to be performed across your fleet of repositories. (See \_examples) +- Actions can both execute changes, open pull-requests or in some cases commit + directly to your preferred branch + - Actions natively use either shell, go or docker files to execute changes + (see \_examples/actions) +- Actions can also be analytical, so you can query your fleet for whatever you + would like +- Works both as a client, or as a server +- Supports SSH/https for fetching repos +- Supports GPG signing +- Supports dry-run mode for easy testing when developing your actions (enabled + by default on the cli) + +## Roadmap + +Refer to [roadmap.md](roadmap.md) + +## Installation + +Octopush comes in two modes. Client or Client -> Server. Octopush can stand alone as +a client, for smaller and less secure changes. However, for organisations, it +may be useful to use Octopush in server mode, which supports more features, and +has extra security built in. + +### Client (CLI) + +Download executable from [releases](https://github.com/kjuulh/octopush/releases) + +#### Or Use docker image + +```bash +docker run --rm kasperhermansen/octopushcli:latest version +``` + +#### Or Build from source + +```bash +git clone https://github.com/kjuulh/octopush.git +cd octopush + +go build cmd/octopush/octopush.go +./octopush version +``` + +#### Or Build with cuddle + +```bash +git clone https://github.com/kjuulh/octopush.git +cd octopush + +cuddle_cli x build_cli +``` + +### Server + +We prefer to run the server directly as a docker image. + +```bash +docker pull kasperhermansen/octopushserver:latest +docker run -p 9090:80 --rm kasperhermansen/octopushserver:latest +``` + +#### Or Build from source + +```bash +git clone https://github.com/kjuulh/octopush.git +cd octopush + +go build cmd/server/server.go +./server version +``` + +#### Or Build with cuddle + +```bash +git clone https://github.com/kjuulh/octopush.git +cd octopush + +cuddle_cli x build_server +``` + +## Usage + +**DISCLAIMER:** It is still early days, and the api of the CLI is subject to +change, this provides the aim of the project, but as it is currently in flux, +there may not be as much handholding in the actual usage. + +I will focus on the client here, as the server provides the same features, +though available through the cli, but instead as configuration options (see +[CONFIGURATION_SERVER.md](CONFIGURATION_SERVER.md)) + +Octopush ships with autocomplete built in (courtesy of spf13/cobra). To add: + +- Bash: `echo 'source <(octopush completion bash)' >> ~/.bashrc` +- Zsh: `echo 'source <(octopush completion zsh)' >> ~/.zshrc` + +### Creating a new action + +Creating a new action + +```bash +git init my-actions # should only be done once +cd my-actions +octopush tmpl init write-a-readme --command +cat write-a-readme/octopush.yml + +# Output +# apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 +# name: write-a-readme +# select: +# repositories: [] +# actions: +# - type: shell +# entry: "main.sh" +``` + +Octopush also ships with yaml schema, which should help write the yaml +configuration. + +#### Add upstream repositories (victims) + +Now add a preferred repository + +``` +cat << EOF > write-a-readme/octopush.yml +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 +name: write-a-readme +select: + providers: # new + - gitea: https://git.front.kjuulh.io # new + organisation: "kjuulh" # new +actions: + - type: shell + entry: "main.sh" +EOF +``` + +This will take all your repositories under an organisation and run the script +on. + +Another could be to use + +```bash +cat << EOF > write-a-readme/octopush.yml +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 +name: write-a-readme +select: + repositories: #new + - git@git.front.kjuulh.io:kjuulh/octopush.git #new + - git@git.front.kjuulh.io:kjuulh/octopush-test.git #new +actions: + - type: shell + entry: "main.sh" +EOF +``` + +This will just apply to those repositories instead. Both can also be combined +for a shared effect. + +### Execute action + +To run the script use + +```bash +octopush process --path "write-a-readme" +``` + +This will cause the octopush process to automatically apply the action on the repo +and open a pr. + +### Query repositories + +Octopush can also be used to query. + +```bash +cat << EOF > write-a-readme/octopush.yml +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 +name: write-a-readme +select: + repositories: + - git@git.front.kjuulh.io:kjuulh/octopush.git + - git@git.front.kjuulh.io:kjuulh/octopush-test.git +queries: + - type: grep + query: "# README" +EOF +``` + +Using the same command as above, will return the lines on each repo with those +criteria. Everything is run in docker, even locally, so no need to install fancy +tools. + +Do note: All actions will be run as dry-run unless `--apply` is added. This is +to help test locally, as well as not cause serious issues. The server +configuration is pretty much the same, except the command would look like so: +`octopush server process --path "write-a-readme" --apply`. Octopush will try to +infer as much as possible, but it may be needed to apply some extra flags to +specify upstream repositories and such. Octopush will also help you setup keys and +such on the first run, using `octopush setup` or `octopush server setup`. + +## Contributing + +It is still early days, and as such things are moving fast, I may not be able to +implement features, because I am focusing my energy on the API. That said PRs +are welcome, though they are at your own risk. + +### Bugs & features requests + +Please use [issues](https://github.com/kjuulh/octopush/issues) + +### Development + +We use [cuddle](https://git.front.kjuulh.io/kjuulh/cuddle) to improve ease of +use, it is however, not a requirement, and probably won't need to be used +outside core maintainers. + +Simply: + +```bash +go run cmd/octopush/octopush.go # CLI +go run cmd/server/server.go # Server +``` + +We follow the `gofmt` formatting, along with optionally but recommend `golines` + +If using cuddle + +``` +cuddle_cli x run # Run both server and client, will do a quick test sweep on the cli +cuddle_cli x watch_run # Automatically refresh both +cuddle_cli x fmt # will format the current code +``` diff --git a/_examples/actions/add_releaserc/go.mod b/_examples/actions/add_releaserc/go.mod new file mode 100644 index 0000000..248ba10 --- /dev/null +++ b/_examples/actions/add_releaserc/go.mod @@ -0,0 +1,11 @@ +module write_a_readme + +go 1.19 + +require github.com/bitfield/script v0.20.2 + +require ( + bitbucket.org/creachadair/shell v0.0.7 // indirect + github.com/itchyny/gojq v0.12.7 // indirect + github.com/itchyny/timefmt-go v0.1.3 // indirect +) diff --git a/_examples/actions/add_releaserc/go.sum b/_examples/actions/add_releaserc/go.sum new file mode 100644 index 0000000..234eb1e --- /dev/null +++ b/_examples/actions/add_releaserc/go.sum @@ -0,0 +1,20 @@ +bitbucket.org/creachadair/shell v0.0.7 h1:Z96pB6DkSb7F3Y3BBnJeOZH2gazyMTWlvecSD4vDqfk= +bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U= +github.com/bitfield/script v0.20.2 h1:4DexsRtBILVMEn3EZwHbtJdDqdk43sXI8gM3F04JXgs= +github.com/bitfield/script v0.20.2/go.mod h1:l3AZPVAtKQrL03bwh7nlNTUtgrgSWurpJSbtqspYrOA= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/itchyny/gojq v0.12.7 h1:hYPTpeWfrJ1OT+2j6cvBScbhl0TkdwGM4bc66onUSOQ= +github.com/itchyny/gojq v0.12.7/go.mod h1:ZdvNHVlzPgUf8pgjnuDTmGfHA/21KoutQUJ3An/xNuw= +github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU= +github.com/itchyny/timefmt-go v0.1.3/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/_examples/actions/add_releaserc/main.go b/_examples/actions/add_releaserc/main.go new file mode 100644 index 0000000..9ff20ba --- /dev/null +++ b/_examples/actions/add_releaserc/main.go @@ -0,0 +1,25 @@ +package main + +import "github.com/bitfield/script" + +func main() { + + releaseRc := ` + branches: + - "main" + - "v0.x" + + plugins: + - "@semantic-release/commit-analyzer" + - "@semantic-release/release-notes-generator" + - "@semantic-release/changelog" + - "@semantic-release/git" + ` + + _, err := script. + Echo(releaseRc). + WriteFile(".releaserc.yml") + if err != nil { + panic(err) + } +} diff --git a/_examples/actions/add_releaserc/octopush.yml b/_examples/actions/add_releaserc/octopush.yml new file mode 100644 index 0000000..d90c930 --- /dev/null +++ b/_examples/actions/add_releaserc/octopush.yml @@ -0,0 +1,12 @@ +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 +name: write-a-readme +select: + repositories: + - git@git.front.kjuulh.io:kjuulh/octopush-test.git + #- git@git.front.kjuulh.io:kjuulh/octopush.git + # providers: + # - gitea: https://git.front.kjuulh.io + # organisation: "cibus" +actions: + - type: go + entry: "main.go" diff --git a/_examples/actions/docker_action/Dockerfile b/_examples/actions/docker_action/Dockerfile index 572de73..61980fa 100644 --- a/_examples/actions/docker_action/Dockerfile +++ b/_examples/actions/docker_action/Dockerfile @@ -1,6 +1,6 @@ FROM debian:bullseye-slim -# Kraken relies on this path being the specified path +# Octopush relies on this path being the specified path WORKDIR /src/work/ COPY entry.sh /src/script.sh diff --git a/_examples/actions/docker_action/kraken.yml b/_examples/actions/docker_action/octopush.yml similarity index 62% rename from _examples/actions/docker_action/kraken.yml rename to _examples/actions/docker_action/octopush.yml index f2c8dba..4279c59 100644 --- a/_examples/actions/docker_action/kraken.yml +++ b/_examples/actions/docker_action/octopush.yml @@ -1,8 +1,8 @@ -apiVersion: git.front.kjuulh.io/kjuulh/kraken/blob/main/schema/v1 +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 name: write-a-readme select: repositories: - - git@git.front.kjuulh.io:kjuulh/kraken-test.git + - git@git.front.kjuulh.io:kjuulh/octopush-test.git # providers: # - gitea: https://git.front.kjuulh.io # organisation: "cibus" diff --git a/_examples/actions/write_a_readme/kraken.yml b/_examples/actions/write_a_readme/octopush.yml similarity index 60% rename from _examples/actions/write_a_readme/kraken.yml rename to _examples/actions/write_a_readme/octopush.yml index 0e5c44e..a4bf81e 100644 --- a/_examples/actions/write_a_readme/kraken.yml +++ b/_examples/actions/write_a_readme/octopush.yml @@ -1,8 +1,8 @@ -apiVersion: git.front.kjuulh.io/kjuulh/kraken/blob/main/schema/v1 +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 name: write-a-readme select: repositories: - - git@git.front.kjuulh.io:kjuulh/kraken-test.git + - git@git.front.kjuulh.io:kjuulh/octopush-test.git # providers: # - gitea: https://git.front.kjuulh.io # organisation: "cibus" diff --git a/_examples/queries/find_semantic/octopush.yml b/_examples/queries/find_semantic/octopush.yml new file mode 100644 index 0000000..6952292 --- /dev/null +++ b/_examples/queries/find_semantic/octopush.yml @@ -0,0 +1,9 @@ +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 +name: write-a-readme +select: + providers: + - gitea: https://git.front.kjuulh.io + organisation: "cibus" +queries: + - type: grep + query: "releaser" diff --git a/_examples/queries/scrape_readme/kraken.yml b/_examples/queries/scrape_readme/octopush.yml similarity index 61% rename from _examples/queries/scrape_readme/kraken.yml rename to _examples/queries/scrape_readme/octopush.yml index 35aa3a3..f1fe9ff 100644 --- a/_examples/queries/scrape_readme/kraken.yml +++ b/_examples/queries/scrape_readme/octopush.yml @@ -1,8 +1,8 @@ -apiVersion: git.front.kjuulh.io/kjuulh/kraken/blob/main/schema/v1 +apiVersion: git.front.kjuulh.io/kjuulh/octopush/blob/main/schema/v1 name: write-a-readme select: repositories: - - git@git.front.kjuulh.io:kjuulh/kraken-test.git + - git@git.front.kjuulh.io:kjuulh/octopush-test.git # providers: # - gitea: https://git.front.kjuulh.io # organisation: "cibus" diff --git a/assets/octopush.png b/assets/octopush.png new file mode 100644 index 0000000..9d1c499 Binary files /dev/null and b/assets/octopush.png differ diff --git a/assets/octopush.svg b/assets/octopush.svg new file mode 100644 index 0000000..8812c64 --- /dev/null +++ b/assets/octopush.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/cmd/kraken/commands/root.go b/cmd/kraken/commands/root.go deleted file mode 100644 index 5fc73bd..0000000 --- a/cmd/kraken/commands/root.go +++ /dev/null @@ -1,14 +0,0 @@ -package commands - -import "github.com/spf13/cobra" - -func CreateKrakenCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "kraken", - // Run: func(cmd *cobra.Command, args []string) { }, - } - - cmd.AddCommand(CreateKrakenProcessCmd()) - - return cmd -} diff --git a/cmd/kraken/kraken.go b/cmd/kraken/kraken.go deleted file mode 100644 index 0da4212..0000000 --- a/cmd/kraken/kraken.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - "os" - - "git.front.kjuulh.io/kjuulh/kraken/cmd/kraken/commands" -) - -func main() { - Execute() -} - -func Execute() { - err := commands.CreateKrakenCmd().Execute() - if err != nil { - os.Exit(1) - } -} diff --git a/cmd/octopush/commands/process.go b/cmd/octopush/commands/process.go new file mode 100644 index 0000000..dcfa8ba --- /dev/null +++ b/cmd/octopush/commands/process.go @@ -0,0 +1,61 @@ +package commands + +import ( + "context" + "time" + + "git.front.kjuulh.io/kjuulh/octopush/internal/cli" + "git.front.kjuulh.io/kjuulh/octopush/internal/commands" + "github.com/spf13/cobra" + "go.uber.org/zap" +) + +func CreateOctopushProcessCmd(logger *zap.Logger) *cobra.Command { + + var ( + actionsRepo string + branch string + path string + ) + cmd := &cobra.Command{ + Use: "process", + RunE: func(cmd *cobra.Command, args []string) error { + if err := cmd.ParseFlags(args); err != nil { + return err + } + + ctx := cmd.Context() + + deps, cleanupFunc, err := cli.Start(ctx, logger) + if err != nil { + return err + } + + defer func() { + ctx, _ = context.WithTimeout(ctx, time.Second*5) + if err := cleanupFunc(ctx); err != nil { + panic(err) + } + }() + + err = commands. + NewProcessRepos(logger, deps). + Process(ctx, actionsRepo, branch, path) + if err != nil { + return err + } + + return nil + }, + } + + pf := cmd.PersistentFlags() + + pf.StringVar(&actionsRepo, "actions-repo", "", "actions repo is the location of your actions, not where to apply the actions themselves, that should be self contained") + cmd.MarkPersistentFlagRequired("actions-repo") + pf.StringVar(&branch, "branch", "main", "which branch to look for actions in, will default to main") + pf.StringVar(&path, "path", "", "the location of the path inside the repository") + cmd.MarkPersistentFlagRequired("path") + + return cmd +} diff --git a/cmd/octopush/commands/root.go b/cmd/octopush/commands/root.go new file mode 100644 index 0000000..3a6654f --- /dev/null +++ b/cmd/octopush/commands/root.go @@ -0,0 +1,18 @@ +package commands + +import ( + "git.front.kjuulh.io/kjuulh/octopush/cmd/octopush/commands/server" + "github.com/spf13/cobra" + "go.uber.org/zap" +) + +func CreateOctopushCmd(logger *zap.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "octopush", + } + + cmd.AddCommand(CreateOctopushProcessCmd(logger)) + cmd.AddCommand(server.CreateOctopushServerCmd(logger)) + + return cmd +} diff --git a/cmd/kraken/commands/process.go b/cmd/octopush/commands/server/process.go similarity index 95% rename from cmd/kraken/commands/process.go rename to cmd/octopush/commands/server/process.go index 89434a9..04f2041 100644 --- a/cmd/kraken/commands/process.go +++ b/cmd/octopush/commands/server/process.go @@ -1,4 +1,4 @@ -package commands +package server import ( "bytes" @@ -8,7 +8,7 @@ import ( "github.com/spf13/cobra" ) -func CreateKrakenProcessCmd() *cobra.Command { +func CreateOctopushProcessCmd() *cobra.Command { var ( actionsRepo string diff --git a/cmd/octopush/commands/server/server.go b/cmd/octopush/commands/server/server.go new file mode 100644 index 0000000..90287a6 --- /dev/null +++ b/cmd/octopush/commands/server/server.go @@ -0,0 +1,16 @@ +package server + +import ( + "github.com/spf13/cobra" + "go.uber.org/zap" +) + +func CreateOctopushServerCmd(logger *zap.Logger) *cobra.Command { + cmd := &cobra.Command{ + Use: "server", + } + + cmd.AddCommand(CreateOctopushProcessCmd()) + + return cmd +} diff --git a/cmd/octopush/octopush.go b/cmd/octopush/octopush.go new file mode 100644 index 0000000..f75223c --- /dev/null +++ b/cmd/octopush/octopush.go @@ -0,0 +1,28 @@ +package main + +import ( + "os" + + "git.front.kjuulh.io/kjuulh/octopush/cmd/octopush/commands" + "git.front.kjuulh.io/kjuulh/octopush/internal/logger" + "go.uber.org/zap" +) + +func main() { + logger, err := logger.New() + if err != nil { + panic(err) + } + _ = logger.Sync() + + zap.ReplaceGlobals(logger) + + Execute(logger) +} + +func Execute(logger *zap.Logger) { + err := commands.CreateOctopushCmd(logger).Execute() + if err != nil { + os.Exit(1) + } +} diff --git a/cmd/server/commands/root.go b/cmd/server/commands/root.go index 19c0575..379f24e 100644 --- a/cmd/server/commands/root.go +++ b/cmd/server/commands/root.go @@ -7,7 +7,7 @@ import ( func CreateServerCmd(logger *zap.Logger) *cobra.Command { cmd := &cobra.Command{ - Use: "krakenserver", + Use: "octopushserver", } cmd.AddCommand(NewStartServerCommand(logger)) diff --git a/cmd/server/commands/start.go b/cmd/server/commands/start.go index 468f133..7849f57 100644 --- a/cmd/server/commands/start.go +++ b/cmd/server/commands/start.go @@ -1,7 +1,7 @@ package commands import ( - "git.front.kjuulh.io/kjuulh/kraken/internal/server" + "git.front.kjuulh.io/kjuulh/octopush/internal/server" "github.com/spf13/cobra" "go.uber.org/zap" ) @@ -9,7 +9,7 @@ import ( func NewStartServerCommand(logger *zap.Logger) *cobra.Command { cmd := &cobra.Command{ Use: "start", - Short: "Start the kraken server", + Short: "Start the octopush server", RunE: func(cmd *cobra.Command, args []string) error { return server.Start(logger) }, diff --git a/cmd/server/server.go b/cmd/server/server.go index 5c835ec..f050505 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -3,8 +3,8 @@ package main import ( "os" - "git.front.kjuulh.io/kjuulh/kraken/cmd/server/commands" - "git.front.kjuulh.io/kjuulh/kraken/internal/logger" + "git.front.kjuulh.io/kjuulh/octopush/cmd/server/commands" + "git.front.kjuulh.io/kjuulh/octopush/internal/logger" "go.uber.org/zap" ) diff --git a/cuddle.yaml b/cuddle.yaml index 87fafac..0bd3198 100644 --- a/cuddle.yaml +++ b/cuddle.yaml @@ -3,7 +3,7 @@ base: "git@git.front.kjuulh.io:kjuulh/cuddle-go-plan.git" vars: - service: "kraken" + service: "octopush" deployments: "git@git.front.kjuulh.io:kjuulh/deployments.git" scripts: diff --git a/go.mod b/go.mod index 2fab6ad..42aca25 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,25 @@ -module git.front.kjuulh.io/kjuulh/kraken +module git.front.kjuulh.io/kjuulh/octopush go 1.19 require ( - git.front.kjuulh.io/kjuulh/curre v1.2.2 + code.gitea.io/sdk/gitea v0.15.1 + git.front.kjuulh.io/kjuulh/curre v1.3.5 github.com/ProtonMail/go-crypto v0.0.0-20220822140716-1678d6eb0cbe - github.com/ProtonMail/gopenpgp/v2 v2.4.10 github.com/gin-contrib/zap v0.0.2 github.com/gin-gonic/gin v1.8.1 github.com/go-git/go-git/v5 v5.4.2 github.com/google/uuid v1.3.0 github.com/spf13/cobra v1.5.0 github.com/stretchr/testify v1.8.0 + github.com/whilp/git-urls v1.0.0 go.uber.org/zap v1.23.0 golang.org/x/net v0.0.0-20220909164309-bea034e7d591 + gopkg.in/yaml.v3 v3.0.1 ) require ( - code.gitea.io/sdk/gitea v0.15.1 // indirect github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/ProtonMail/go-mime v0.0.0-20220302105931-303f85f7fe0f // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/cloudflare/circl v1.1.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -43,13 +43,10 @@ require ( github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.1 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sergi/go-diff v1.2.0 // indirect - github.com/sirupsen/logrus v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/ugorji/go/codec v1.2.7 // indirect - github.com/whilp/git-urls v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.2 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.8.0 // indirect @@ -59,5 +56,4 @@ require ( google.golang.org/protobuf v1.28.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5f09503..d326efc 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,8 @@ code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE= code.gitea.io/sdk/gitea v0.15.1 h1:WJreC7YYuxbn0UDaPuWIe/mtiNKTvLN8MLkaw71yx/M= code.gitea.io/sdk/gitea v0.15.1/go.mod h1:klY2LVI3s3NChzIk/MzMn7G1FHrfU7qd63iSMVoHRBA= -git.front.kjuulh.io/kjuulh/curre v1.2.2 h1:0OwWIfekrMykdQg9bdmG80I+Mjc2k4i+sy903phuDWs= -git.front.kjuulh.io/kjuulh/curre v1.2.2/go.mod h1:m7WpSehONLqPh/XF3F0BI0UOpLOfGuDmDEFI1XsM6fE= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +git.front.kjuulh.io/kjuulh/curre v1.3.5 h1:oKYh5Z0vInjViLnS4ppzK0G2Mnj7vXq8mA5i/rsWId4= +git.front.kjuulh.io/kjuulh/curre v1.3.5/go.mod h1:m7WpSehONLqPh/XF3F0BI0UOpLOfGuDmDEFI1XsM6fE= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= @@ -11,10 +10,6 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= github.com/ProtonMail/go-crypto v0.0.0-20220822140716-1678d6eb0cbe h1:R2HeCk7SG/XpoYZlEeI1v7sId7w2AMWwzOaVqXn45FE= github.com/ProtonMail/go-crypto v0.0.0-20220822140716-1678d6eb0cbe/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8= -github.com/ProtonMail/go-mime v0.0.0-20220302105931-303f85f7fe0f h1:CGq7OieOz3wyQJ1fO8S0eO9TCW1JyvLrf8fhzz1i8ko= -github.com/ProtonMail/go-mime v0.0.0-20220302105931-303f85f7fe0f/go.mod h1:NYt+V3/4rEeDuaev/zw1zCq8uqVEuPHzDPo3OZrlGJ4= -github.com/ProtonMail/gopenpgp/v2 v2.4.10 h1:EYgkxzwmQvsa6kxxkgP1AwzkFqKHscF2UINxaSn6rdI= -github.com/ProtonMail/gopenpgp/v2 v2.4.10/go.mod h1:CTRA7/toc/4DxDy5Du4hPDnIZnJvXSeQ8LsRTOUJoyc= github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= @@ -130,8 +125,6 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= @@ -173,7 +166,6 @@ go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= @@ -183,15 +175,7 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -210,7 +194,6 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -241,9 +224,7 @@ golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/integration_test/main_test.go b/integration_test/main_test.go index df419b6..d6132b5 100644 --- a/integration_test/main_test.go +++ b/integration_test/main_test.go @@ -7,7 +7,7 @@ import ( "os" "testing" - "git.front.kjuulh.io/kjuulh/kraken/internal/server" + "git.front.kjuulh.io/kjuulh/octopush/internal/server" "go.uber.org/zap" ) diff --git a/integration_test/storage_test.go b/integration_test/storage_test.go index 40a7956..b77e6b1 100644 --- a/integration_test/storage_test.go +++ b/integration_test/storage_test.go @@ -9,7 +9,7 @@ import ( "path" "testing" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/storage" "github.com/stretchr/testify/require" ) diff --git a/internal/actions/action.go b/internal/actions/action.go index b36155d..07b4245 100644 --- a/internal/actions/action.go +++ b/internal/actions/action.go @@ -4,15 +4,15 @@ import ( "context" "errors" - "git.front.kjuulh.io/kjuulh/kraken/internal/actions/builders" - "git.front.kjuulh.io/kjuulh/kraken/internal/actions/querier" - "git.front.kjuulh.io/kjuulh/kraken/internal/schema" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" + "git.front.kjuulh.io/kjuulh/octopush/internal/actions/builders" + "git.front.kjuulh.io/kjuulh/octopush/internal/actions/querier" + "git.front.kjuulh.io/kjuulh/octopush/internal/schema" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/storage" "go.uber.org/zap" ) type Action struct { - Schema *schema.KrakenSchema + Schema *schema.OctopushSchema SchemaPath string } diff --git a/internal/actions/action_creator.go b/internal/actions/action_creator.go index b731519..7fe4ef0 100644 --- a/internal/actions/action_creator.go +++ b/internal/actions/action_creator.go @@ -7,9 +7,9 @@ import ( "path" "time" - "git.front.kjuulh.io/kjuulh/kraken/internal/schema" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/providers" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" + "git.front.kjuulh.io/kjuulh/octopush/internal/schema" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/providers" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/storage" "go.uber.org/zap" ) @@ -23,12 +23,12 @@ type ( ActionCreator struct { logger *zap.Logger storage *storage.Service - git *providers.Git + git *providers.GoGit } ActionCreatorDeps interface { GetStorageService() *storage.Service - GetGitProvider() *providers.Git + GetGitProvider() *providers.GoGit } ) @@ -59,19 +59,19 @@ func (ac *ActionCreator) Prepare(ctx context.Context, ops *ActionCreatorOps) (*A return nil, fmt.Errorf("path is invalid: %s", ops.Path) } - contents, err := os.ReadFile(path.Join(executorUrl, "kraken.yml")) + contents, err := os.ReadFile(path.Join(executorUrl, "octopush.yml")) if err != nil { return nil, err } - krakenSchema, err := schema.Unmarshal(string(contents)) + octopushSchema, err := schema.Unmarshal(string(contents)) if err != nil { return nil, err } ac.logger.Debug("Action creator done") return &Action{ - Schema: krakenSchema, + Schema: octopushSchema, SchemaPath: executorUrl, }, nil } diff --git a/internal/actions/builders/docker.go b/internal/actions/builders/docker.go index 4120229..ae11be7 100644 --- a/internal/actions/builders/docker.go +++ b/internal/actions/builders/docker.go @@ -36,7 +36,7 @@ func (g *DockerBuild) Build(ctx context.Context, modulePath, entryPath string) ( return nil, err } tag := hex.EncodeToString(b) - buildDockerCmd := fmt.Sprintf("(cd %s; docker build -f %s --tag kraken/%s .)", modulePath, entryPath, tag) + buildDockerCmd := fmt.Sprintf("(cd %s; docker build -f %s --tag octopush/%s .)", modulePath, entryPath, tag) g.logger.Debug("Running command", zap.String("command", buildDockerCmd)) cmd := exec.CommandContext( @@ -73,7 +73,7 @@ func (g *DockerBuild) Build(ctx context.Context, modulePath, entryPath string) ( ctx, "/bin/bash", "-c", - fmt.Sprintf("docker run --rm -v %s/:/src/work/ kraken/%s", victimPath, tag), + fmt.Sprintf("docker run --rm -v %s/:/src/work/ octopush/%s", victimPath, tag), ) runDockerWriter := &zapio.Writer{ diff --git a/internal/api/process_command.go b/internal/api/process_command.go index 2e852b5..b067615 100644 --- a/internal/api/process_command.go +++ b/internal/api/process_command.go @@ -4,9 +4,9 @@ import ( "context" "net/http" - "git.front.kjuulh.io/kjuulh/kraken/internal/commands" - "git.front.kjuulh.io/kjuulh/kraken/internal/serverdeps" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/jobs" + "git.front.kjuulh.io/kjuulh/octopush/internal/commands" + "git.front.kjuulh.io/kjuulh/octopush/internal/serverdeps" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/jobs" "github.com/gin-gonic/gin" "github.com/google/uuid" "go.uber.org/zap" diff --git a/internal/api/root.go b/internal/api/root.go index 7f814ac..c4f36a4 100644 --- a/internal/api/root.go +++ b/internal/api/root.go @@ -1,7 +1,7 @@ package api import ( - "git.front.kjuulh.io/kjuulh/kraken/internal/serverdeps" + "git.front.kjuulh.io/kjuulh/octopush/internal/serverdeps" "github.com/gin-gonic/gin" "go.uber.org/zap" ) diff --git a/internal/cli/cli.go b/internal/cli/cli.go new file mode 100644 index 0000000..d128ad9 --- /dev/null +++ b/internal/cli/cli.go @@ -0,0 +1,30 @@ +package cli + +import ( + "context" + + "git.front.kjuulh.io/kjuulh/curre" + "git.front.kjuulh.io/kjuulh/octopush/internal/server" + "git.front.kjuulh.io/kjuulh/octopush/internal/serverdeps" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/signer" + "go.uber.org/zap" +) + +func Start(ctx context.Context, logger *zap.Logger) (*serverdeps.ServerDeps, curre.CleanupFunc, error) { + deps := serverdeps.NewServerDeps(logger) + + readyChan := make(chan curre.ComponentsAreReady, 1) + + cleanupFunc, err := curre.NewManager(). + Register( + server.NewStorageServer(logger.With(zap.Namespace("storage")), deps), + ). + Register( + signer.NewOpenPGPApp(deps.GetOpenPGP()), + ). + RunNonBlocking(ctx, readyChan) + + <-readyChan + + return deps, cleanupFunc, err +} diff --git a/internal/commands/process_repos.go b/internal/commands/process_repos.go index 02c7c27..316298e 100644 --- a/internal/commands/process_repos.go +++ b/internal/commands/process_repos.go @@ -7,11 +7,11 @@ import ( "sync" "time" - "git.front.kjuulh.io/kjuulh/kraken/internal/actions" - "git.front.kjuulh.io/kjuulh/kraken/internal/gitproviders" - "git.front.kjuulh.io/kjuulh/kraken/internal/schema" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/providers" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" + "git.front.kjuulh.io/kjuulh/octopush/internal/actions" + "git.front.kjuulh.io/kjuulh/octopush/internal/gitproviders" + "git.front.kjuulh.io/kjuulh/octopush/internal/schema" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/providers" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/storage" giturls "github.com/whilp/git-urls" "go.uber.org/zap" ) @@ -20,14 +20,14 @@ type ( ProcessRepos struct { logger *zap.Logger storage *storage.Service - git *providers.Git + git *providers.GoGit actionCreator *actions.ActionCreator gitea *gitproviders.Gitea } ProcessReposDeps interface { GetStorageService() *storage.Service - GetGitProvider() *providers.Git + GetGitProvider() *providers.GoGit GetActionCreator() *actions.ActionCreator GetGitea() *gitproviders.Gitea } @@ -79,7 +79,7 @@ func (pr *ProcessRepos) Process(ctx context.Context, repository string, branch s return nil } -func (pr *ProcessRepos) getRepoUrls(ctx context.Context, schema *schema.KrakenSchema) ([]string, error) { +func (pr *ProcessRepos) getRepoUrls(ctx context.Context, schema *schema.OctopushSchema) ([]string, error) { repoUrls := make([]string, 0) repoUrls = append(repoUrls, schema.Select.Repositories...) @@ -161,7 +161,7 @@ func (pr *ProcessRepos) prepareAction( return cleanupfunc, area, nil } -func (pr *ProcessRepos) clone(ctx context.Context, area *storage.Area, repoUrl string) (*providers.GitRepo, error) { +func (pr *ProcessRepos) clone(ctx context.Context, area *storage.Area, repoUrl string) (*providers.GoGitRepo, error) { pr.logger.Debug("Cloning repo", zap.String("path", area.Path), zap.String("repoUrl", repoUrl)) cloneCtx, _ := context.WithTimeout(ctx, time.Second*5) repo, err := pr.git.Clone(cloneCtx, area, repoUrl) @@ -177,7 +177,7 @@ func (pr *ProcessRepos) clone(ctx context.Context, area *storage.Area, repoUrl s return repo, nil } -func (pr *ProcessRepos) commit(ctx context.Context, area *storage.Area, repo *providers.GitRepo, repoUrl string) error { +func (pr *ProcessRepos) commit(ctx context.Context, area *storage.Area, repo *providers.GoGitRepo, repoUrl string) error { wt, err := pr.git.Add(ctx, area, repo) if err != nil { return fmt.Errorf("could not add file: %w", err) @@ -189,8 +189,9 @@ func (pr *ProcessRepos) commit(ctx context.Context, area *storage.Area, repo *pr } if status.IsClean() { + // TODO: check for pr pr.logger.Info("Returning early, as no modifications are detected") - return nil + //return nil } err = pr.git.Commit(ctx, repo) @@ -231,7 +232,7 @@ func (pr *ProcessRepos) commit(ctx context.Context, area *storage.Area, repo *pr return err } - err = pr.gitea.CreatePr(ctx, fmt.Sprintf("%s://%s", "https", url.Host), org, semanticName, head, originHead, "kraken-apply") + err = pr.gitea.CreatePr(ctx, fmt.Sprintf("%s://%s", "https", url.Host), org, semanticName, head, originHead, "octopush-apply") if err != nil { return err } diff --git a/internal/logger/zap.go b/internal/logger/zap.go index b6e7dce..b3b10c9 100644 --- a/internal/logger/zap.go +++ b/internal/logger/zap.go @@ -12,7 +12,7 @@ func New() (*zap.Logger, error) { return lvl >= zapcore.ErrorLevel }) lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { - return lvl < zapcore.ErrorLevel + return lvl < zapcore.ErrorLevel // && lvl > zapcore.DebugLevel }) config := zap.NewDevelopmentEncoderConfig() @@ -28,5 +28,6 @@ func New() (*zap.Logger, error) { ) logger := zap.New(core) + return logger, nil } diff --git a/internal/schema/kraken.go b/internal/schema/kraken.go index b1c76f5..afa6f2d 100644 --- a/internal/schema/kraken.go +++ b/internal/schema/kraken.go @@ -2,7 +2,7 @@ package schema import "gopkg.in/yaml.v3" -type KrakenSchema struct { +type OctopushSchema struct { ApiVersion string `yaml:"apiVersion"` Name string `yaml:"name"` Select struct { @@ -22,8 +22,8 @@ type KrakenSchema struct { } `yaml:"queries"` } -func Unmarshal(raw string) (*KrakenSchema, error) { - k := &KrakenSchema{} +func Unmarshal(raw string) (*OctopushSchema, error) { + k := &OctopushSchema{} err := yaml.Unmarshal([]byte(raw), k) if err != nil { return nil, err diff --git a/internal/server/http_server.go b/internal/server/http_server.go index 3daa290..b367049 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -7,8 +7,8 @@ import ( "time" "git.front.kjuulh.io/kjuulh/curre" - "git.front.kjuulh.io/kjuulh/kraken/internal/api" - "git.front.kjuulh.io/kjuulh/kraken/internal/serverdeps" + "git.front.kjuulh.io/kjuulh/octopush/internal/api" + "git.front.kjuulh.io/kjuulh/octopush/internal/serverdeps" ginzap "github.com/gin-contrib/zap" "github.com/gin-gonic/gin" "go.uber.org/zap" diff --git a/internal/server/server.go b/internal/server/server.go index a71cbd7..cc946eb 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -4,8 +4,8 @@ import ( "context" "git.front.kjuulh.io/kjuulh/curre" - "git.front.kjuulh.io/kjuulh/kraken/internal/serverdeps" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/signer" + "git.front.kjuulh.io/kjuulh/octopush/internal/serverdeps" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/signer" "go.uber.org/zap" ) diff --git a/internal/server/storage_server.go b/internal/server/storage_server.go index 5be0a36..9a18493 100644 --- a/internal/server/storage_server.go +++ b/internal/server/storage_server.go @@ -5,7 +5,7 @@ import ( "time" "git.front.kjuulh.io/kjuulh/curre" - "git.front.kjuulh.io/kjuulh/kraken/internal/serverdeps" + "git.front.kjuulh.io/kjuulh/octopush/internal/serverdeps" "go.uber.org/zap" ) diff --git a/internal/serverdeps/server_deps.go b/internal/serverdeps/server_deps.go index da9c333..f52a88c 100644 --- a/internal/serverdeps/server_deps.go +++ b/internal/serverdeps/server_deps.go @@ -1,12 +1,12 @@ package serverdeps import ( - actionc "git.front.kjuulh.io/kjuulh/kraken/internal/actions" - "git.front.kjuulh.io/kjuulh/kraken/internal/gitproviders" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/actions" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/providers" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/signer" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" + actionc "git.front.kjuulh.io/kjuulh/octopush/internal/actions" + "git.front.kjuulh.io/kjuulh/octopush/internal/gitproviders" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/actions" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/providers" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/signer" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/storage" "go.uber.org/zap" ) @@ -53,7 +53,7 @@ func (deps *ServerDeps) GetStorageService() *storage.Service { return storage.NewService(deps.logger.With(zap.Namespace("storage")), deps.storageConfig) } -func (deps *ServerDeps) GetGitProvider() *providers.Git { +func (deps *ServerDeps) GetGitProvider() *providers.GoGit { return providers.NewGit(deps.logger.With(zap.Namespace("gitProvider")), deps.gitCfg, deps.openPGP) } diff --git a/internal/services/actions/action.go b/internal/services/actions/action.go index 5262569..c711b47 100644 --- a/internal/services/actions/action.go +++ b/internal/services/actions/action.go @@ -3,7 +3,7 @@ package actions import ( "context" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/storage" "go.uber.org/zap" ) diff --git a/internal/services/providers/git.go b/internal/services/providers/git.go index 32cc1a7..cf2a3ba 100644 --- a/internal/services/providers/git.go +++ b/internal/services/providers/git.go @@ -1,339 +1 @@ package providers - -import ( - "context" - "errors" - "fmt" - "time" - - "git.front.kjuulh.io/kjuulh/kraken/internal/services/signer" - "git.front.kjuulh.io/kjuulh/kraken/internal/services/storage" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/config" - "github.com/go-git/go-git/v5/plumbing" - "github.com/go-git/go-git/v5/plumbing/object" - "github.com/go-git/go-git/v5/plumbing/transport" - "github.com/go-git/go-git/v5/plumbing/transport/http" - "github.com/go-git/go-git/v5/plumbing/transport/ssh" - "go.uber.org/zap" - "go.uber.org/zap/zapio" -) - -// Git is a native git provider, it can clone, pull -// , push and as in abstraction on native git operations -type Git struct { - logger *zap.Logger - gitConfig *GitConfig - openPGP *signer.OpenPGP -} - -type GitRepo struct { - repo *git.Repository -} - -func (gr *GitRepo) GetHEAD() (string, error) { - head, err := gr.repo.Head() - if err != nil { - return "", err - } - - return head.Name().Short(), nil -} - -type GitAuth string - -const ( - GIT_AUTH_SSH GitAuth = "ssh" - GIT_AUTH_USERNAME_PASSWORD GitAuth = "username_password" - GIT_AUTH_ACCESS_TOKEN GitAuth = "access_token" - GIT_AUTH_ANONYMOUS GitAuth = "anonymous" - GIT_AUTH_SSH_AGENT GitAuth = "ssh_agent" -) - -type GitConfig struct { - AuthOption GitAuth - User string - Password string - AccessToken string - SshPublicKeyFilePath string - SshPrivateKeyPassword string -} - -func NewGit(logger *zap.Logger, gitConfig *GitConfig, openPGP *signer.OpenPGP) *Git { - return &Git{logger: logger, gitConfig: gitConfig, openPGP: openPGP} -} - -func (g *Git) GetOriginHEADForRepo(ctx context.Context, gitRepo *GitRepo) (string, error) { - auth, err := g.GetAuth() - if err != nil { - return "", err - } - - remote, err := gitRepo.repo.Remote("origin") - if err != nil { - return "", err - } - - refs, err := remote.ListContext(ctx, &git.ListOptions{ - Auth: auth, - }) - if err != nil { - return "", err - } - - headRef := "" - for _, ref := range refs { - //g.logger.Debug(ref.String()) - if !ref.Name().IsBranch() { - headRef = ref.Target().Short() - } - } - - if headRef == "" { - return "", errors.New("no upstream HEAD branch could be found") - } - - return headRef, nil -} - -func (g *Git) CloneBranch(ctx context.Context, storageArea *storage.Area, repoUrl string, branch string) (*GitRepo, error) { - g.logger.Debug( - "cloning repository", - zap.String("repoUrl", repoUrl), - zap.String("path", storageArea.Path), - ) - - auth, err := g.GetAuth() - if err != nil { - return nil, err - } - - cloneOptions := git.CloneOptions{ - URL: repoUrl, - Auth: auth, - RemoteName: "origin", - ReferenceName: plumbing.NewBranchReferenceName(branch), - SingleBranch: false, - NoCheckout: false, - Depth: 1, - RecurseSubmodules: 1, - Progress: g.getProgressWriter(), - Tags: 0, - InsecureSkipTLS: false, - CABundle: []byte{}, - } - - repo, err := git.PlainCloneContext(ctx, storageArea.Path, false, &cloneOptions) - if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) { - return nil, err - } - - g.logger.Debug("done cloning repo") - - return &GitRepo{repo: repo}, nil -} - -func (g *Git) Clone(ctx context.Context, storageArea *storage.Area, repoUrl string) (*GitRepo, error) { - g.logger.Debug( - "cloning repository", - zap.String("repoUrl", repoUrl), - zap.String("path", storageArea.Path), - ) - - auth, err := g.GetAuth() - if err != nil { - return nil, err - } - - cloneOptions := git.CloneOptions{ - URL: repoUrl, - Auth: auth, - RemoteName: "origin", - ReferenceName: "refs/heads/main", - SingleBranch: false, - NoCheckout: false, - Depth: 1, - RecurseSubmodules: 1, - Progress: g.getProgressWriter(), - Tags: 0, - InsecureSkipTLS: false, - CABundle: []byte{}, - } - - repo, err := git.PlainCloneContext(ctx, storageArea.Path, false, &cloneOptions) - if err != nil { - return nil, err - } - - g.logger.Debug("done cloning repo") - - return &GitRepo{repo: repo}, nil -} - -func (g *Git) getProgressWriter() *zapio.Writer { - return &zapio.Writer{ - Log: g.logger.With(zap.String("process", "go-git")), - Level: zap.DebugLevel, - } -} - -func (g *Git) Add(ctx context.Context, storageArea *storage.Area, gitRepo *GitRepo) (*git.Worktree, error) { - worktree, err := gitRepo.repo.Worktree() - if err != nil { - return nil, err - } - - err = worktree.AddWithOptions(&git.AddOptions{ - All: true, - }) - if err != nil { - return nil, err - } - - status, err := worktree.Status() - if err != nil { - return nil, err - } - - g.logger.Debug("git status", zap.String("status", status.String())) - - return worktree, nil -} - -func (g *Git) CreateBranch(ctx context.Context, gitRepo *GitRepo) error { - worktree, err := gitRepo.repo.Worktree() - if err != nil { - return err - } - - refSpec := plumbing.NewBranchReferenceName("kraken-apply") - err = gitRepo.repo.CreateBranch(&config.Branch{ - Name: "kraken-apply", - Remote: "origin", - Merge: refSpec, - Rebase: "", - }) - if err != nil { - return fmt.Errorf("could not create branch: %w", err) - } - - err = worktree.Checkout(&git.CheckoutOptions{ - Branch: plumbing.ReferenceName(refSpec.String()), - Create: true, - Force: false, - Keep: false, - }) - if err != nil { - return fmt.Errorf("could not checkout branch: %w", err) - } - - remoteRef := plumbing.NewRemoteReferenceName("origin", "kraken-apply") - ref := plumbing.NewSymbolicReference(refSpec, remoteRef) - err = gitRepo.repo.Storer.SetReference(ref) - if err != nil { - return fmt.Errorf("could not set reference: %w", err) - } - - auth, err := g.GetAuth() - if err != nil { - return err - } - - err = worktree.PullContext(ctx, &git.PullOptions{ - RemoteName: "origin", - ReferenceName: "refs/heads/main", - SingleBranch: false, - Depth: 1, - Auth: auth, - RecurseSubmodules: 1, - Progress: g.getProgressWriter(), - Force: true, - InsecureSkipTLS: false, - CABundle: []byte{}, - }) - if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) { - return fmt.Errorf("could not pull from origin: %w", err) - } - - g.logger.Debug("done creating branches") - - return nil -} - -func (g *Git) Commit(ctx context.Context, gitRepo *GitRepo) error { - worktree, err := gitRepo.repo.Worktree() - if err != nil { - return err - } - - _, err = worktree.Commit("some-commit", &git.CommitOptions{ - All: true, - Author: &object.Signature{Name: "kraken", Email: "kraken@kasperhermansen.com", When: time.Now()}, - Committer: &object.Signature{Name: "kraken", Email: "kraken@kasperhermansen.com", When: time.Now()}, - SignKey: g.openPGP.SigningKey, - }) - if err != nil { - return err - } - - g.logger.Debug("done commiting objects") - - return nil -} - -func (g *Git) Push(ctx context.Context, gitRepo *GitRepo) error { - auth, err := g.GetAuth() - if err != nil { - return err - } - - err = gitRepo.repo.PushContext(ctx, &git.PushOptions{ - RemoteName: "origin", - RefSpecs: []config.RefSpec{}, - Auth: auth, - Progress: g.getProgressWriter(), - Prune: false, - Force: true, - InsecureSkipTLS: false, - CABundle: []byte{}, - RequireRemoteRefs: []config.RefSpec{}, - }) - if err != nil { - return err - } - - g.logger.Debug("done pushing branch") - - return nil -} - -func (g *Git) GetAuth() (transport.AuthMethod, error) { - switch g.gitConfig.AuthOption { - case GIT_AUTH_SSH: - sshKey, err := ssh.NewPublicKeysFromFile( - g.gitConfig.User, - g.gitConfig.SshPublicKeyFilePath, - g.gitConfig.SshPrivateKeyPassword, - ) - if err != nil { - return nil, err - } - return sshKey, nil - case GIT_AUTH_USERNAME_PASSWORD: - return &http.BasicAuth{ - Username: g.gitConfig.User, - Password: g.gitConfig.Password, - }, nil - case GIT_AUTH_ACCESS_TOKEN: - return &http.BasicAuth{ - Username: "required-username", - Password: g.gitConfig.AccessToken, - }, nil - case GIT_AUTH_ANONYMOUS: - return nil, nil - case GIT_AUTH_SSH_AGENT: - return ssh.NewSSHAgentAuth(g.gitConfig.User) - default: - return nil, nil - } -} diff --git a/internal/services/providers/gogit.go b/internal/services/providers/gogit.go new file mode 100644 index 0000000..3e1eacd --- /dev/null +++ b/internal/services/providers/gogit.go @@ -0,0 +1,339 @@ +package providers + +import ( + "context" + "errors" + "fmt" + "time" + + "git.front.kjuulh.io/kjuulh/octopush/internal/services/signer" + "git.front.kjuulh.io/kjuulh/octopush/internal/services/storage" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/object" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/go-git/go-git/v5/plumbing/transport/http" + "github.com/go-git/go-git/v5/plumbing/transport/ssh" + "go.uber.org/zap" + "go.uber.org/zap/zapio" +) + +// GoGit is a native git provider, it can clone, pull +// , push and as in abstraction on native git operations +type GoGit struct { + logger *zap.Logger + gitConfig *GitConfig + openPGP *signer.OpenPGP +} + +type GoGitRepo struct { + repo *git.Repository +} + +func (gr *GoGitRepo) GetHEAD() (string, error) { + head, err := gr.repo.Head() + if err != nil { + return "", err + } + + return head.Name().Short(), nil +} + +type GitAuth string + +const ( + GIT_AUTH_SSH GitAuth = "ssh" + GIT_AUTH_USERNAME_PASSWORD GitAuth = "username_password" + GIT_AUTH_ACCESS_TOKEN GitAuth = "access_token" + GIT_AUTH_ANONYMOUS GitAuth = "anonymous" + GIT_AUTH_SSH_AGENT GitAuth = "ssh_agent" +) + +type GitConfig struct { + AuthOption GitAuth + User string + Password string + AccessToken string + SshPublicKeyFilePath string + SshPrivateKeyPassword string +} + +func NewGit(logger *zap.Logger, gitConfig *GitConfig, openPGP *signer.OpenPGP) *GoGit { + return &GoGit{logger: logger, gitConfig: gitConfig, openPGP: openPGP} +} + +func (g *GoGit) GetOriginHEADForRepo(ctx context.Context, gitRepo *GoGitRepo) (string, error) { + auth, err := g.GetAuth() + if err != nil { + return "", err + } + + remote, err := gitRepo.repo.Remote("origin") + if err != nil { + return "", err + } + + refs, err := remote.ListContext(ctx, &git.ListOptions{ + Auth: auth, + }) + if err != nil { + return "", err + } + + headRef := "" + for _, ref := range refs { + //g.logger.Debug(ref.String()) + if ref.Target().IsBranch() { + headRef = ref.Target().Short() + } + } + + if headRef == "" { + return "", errors.New("no upstream HEAD branch could be found") + } + + return headRef, nil +} + +func (g *GoGit) CloneBranch(ctx context.Context, storageArea *storage.Area, repoUrl string, branch string) (*GoGitRepo, error) { + g.logger.Debug( + "cloning repository", + zap.String("repoUrl", repoUrl), + zap.String("path", storageArea.Path), + ) + + auth, err := g.GetAuth() + if err != nil { + return nil, err + } + + cloneOptions := git.CloneOptions{ + URL: repoUrl, + Auth: auth, + RemoteName: "origin", + ReferenceName: plumbing.NewBranchReferenceName(branch), + SingleBranch: false, + NoCheckout: false, + Depth: 1, + RecurseSubmodules: 1, + Progress: g.getProgressWriter(), + Tags: 0, + InsecureSkipTLS: false, + CABundle: []byte{}, + } + + repo, err := git.PlainCloneContext(ctx, storageArea.Path, false, &cloneOptions) + if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) { + return nil, err + } + + g.logger.Debug("done cloning repo") + + return &GoGitRepo{repo: repo}, nil +} + +func (g *GoGit) Clone(ctx context.Context, storageArea *storage.Area, repoUrl string) (*GoGitRepo, error) { + g.logger.Debug( + "cloning repository", + zap.String("repoUrl", repoUrl), + zap.String("path", storageArea.Path), + ) + + auth, err := g.GetAuth() + if err != nil { + return nil, err + } + + cloneOptions := git.CloneOptions{ + URL: repoUrl, + Auth: auth, + RemoteName: "origin", + ReferenceName: "", + SingleBranch: false, + NoCheckout: false, + Depth: 1, + RecurseSubmodules: 1, + Progress: g.getProgressWriter(), + Tags: 0, + InsecureSkipTLS: false, + CABundle: []byte{}, + } + + repo, err := git.PlainCloneContext(ctx, storageArea.Path, false, &cloneOptions) + if err != nil { + return nil, err + } + + g.logger.Debug("done cloning repo") + + return &GoGitRepo{repo: repo}, nil +} + +func (g *GoGit) getProgressWriter() *zapio.Writer { + return &zapio.Writer{ + Log: g.logger.With(zap.String("process", "go-git")), + Level: zap.DebugLevel, + } +} + +func (g *GoGit) Add(ctx context.Context, storageArea *storage.Area, gitRepo *GoGitRepo) (*git.Worktree, error) { + worktree, err := gitRepo.repo.Worktree() + if err != nil { + return nil, err + } + + err = worktree.AddWithOptions(&git.AddOptions{ + All: true, + }) + if err != nil { + return nil, err + } + + status, err := worktree.Status() + if err != nil { + return nil, err + } + + g.logger.Debug("git status", zap.String("status", status.String())) + + return worktree, nil +} + +func (g *GoGit) CreateBranch(ctx context.Context, gitRepo *GoGitRepo) error { + worktree, err := gitRepo.repo.Worktree() + if err != nil { + return err + } + + refSpec := plumbing.NewBranchReferenceName("octopush-apply") + err = gitRepo.repo.CreateBranch(&config.Branch{ + Name: "octopush-apply", + Remote: "origin", + Merge: refSpec, + Rebase: "", + }) + if err != nil { + return fmt.Errorf("could not create branch: %w", err) + } + + err = worktree.Checkout(&git.CheckoutOptions{ + Branch: plumbing.ReferenceName(refSpec.String()), + Create: true, + Force: false, + Keep: false, + }) + if err != nil { + return fmt.Errorf("could not checkout branch: %w", err) + } + + //remoteRef := plumbing.NewRemoteReferenceName("origin", "octopush-apply") + //ref := plumbing.NewSymbolicReference(refSpec, remoteRef) + //err = gitRepo.repo.Storer.SetReference(ref) + //if err != nil { + // return fmt.Errorf("could not set reference: %w", err) + //} + + auth, err := g.GetAuth() + if err != nil { + return err + } + + err = worktree.PullContext(ctx, &git.PullOptions{ + RemoteName: "origin", + ReferenceName: "", + SingleBranch: false, + Depth: 1, + Auth: auth, + RecurseSubmodules: 1, + Progress: g.getProgressWriter(), + Force: true, + InsecureSkipTLS: false, + CABundle: []byte{}, + }) + if err != nil && !errors.Is(err, git.NoErrAlreadyUpToDate) { + return fmt.Errorf("could not pull from origin: %w", err) + } + + g.logger.Debug("done creating branches") + + return nil +} + +func (g *GoGit) Commit(ctx context.Context, gitRepo *GoGitRepo) error { + worktree, err := gitRepo.repo.Worktree() + if err != nil { + return err + } + + _, err = worktree.Commit("some-commit", &git.CommitOptions{ + All: true, + Author: &object.Signature{Name: "octopush", Email: "octopush@kasperhermansen.com", When: time.Now()}, + Committer: &object.Signature{Name: "octopush", Email: "octopush@kasperhermansen.com", When: time.Now()}, + SignKey: g.openPGP.SigningKey, + }) + if err != nil { + return err + } + + g.logger.Debug("done commiting objects") + + return nil +} + +func (g *GoGit) Push(ctx context.Context, gitRepo *GoGitRepo) error { + auth, err := g.GetAuth() + if err != nil { + return err + } + + err = gitRepo.repo.PushContext(ctx, &git.PushOptions{ + RemoteName: "origin", + RefSpecs: []config.RefSpec{}, + Auth: auth, + Progress: g.getProgressWriter(), + Prune: false, + Force: true, + InsecureSkipTLS: false, + CABundle: []byte{}, + RequireRemoteRefs: []config.RefSpec{}, + }) + if err != nil { + return err + } + + g.logger.Debug("done pushing branch") + + return nil +} + +func (g *GoGit) GetAuth() (transport.AuthMethod, error) { + switch g.gitConfig.AuthOption { + case GIT_AUTH_SSH: + sshKey, err := ssh.NewPublicKeysFromFile( + g.gitConfig.User, + g.gitConfig.SshPublicKeyFilePath, + g.gitConfig.SshPrivateKeyPassword, + ) + if err != nil { + return nil, err + } + return sshKey, nil + case GIT_AUTH_USERNAME_PASSWORD: + return &http.BasicAuth{ + Username: g.gitConfig.User, + Password: g.gitConfig.Password, + }, nil + case GIT_AUTH_ACCESS_TOKEN: + return &http.BasicAuth{ + Username: "required-username", + Password: g.gitConfig.AccessToken, + }, nil + case GIT_AUTH_ANONYMOUS: + return nil, nil + case GIT_AUTH_SSH_AGENT: + return ssh.NewSSHAgentAuth(g.gitConfig.User) + default: + return nil, nil + } +} diff --git a/internal/services/storage/storage.go b/internal/services/storage/storage.go index 01a2625..89b8a90 100644 --- a/internal/services/storage/storage.go +++ b/internal/services/storage/storage.go @@ -22,7 +22,7 @@ func NewDefaultStorageConfig() (*StorageConfig, error) { return nil, err } return &StorageConfig{ - Path: path.Join(tempDir, "kraken"), + Path: path.Join(tempDir, "octopush"), }, nil } diff --git a/roadmap.md b/roadmap.md index 34cf540..2e91660 100644 --- a/roadmap.md +++ b/roadmap.md @@ -19,26 +19,43 @@ ## Version 0.1 - [x] Setup a way to choose actions and predicates -- [x] Allow instantiation of actions, kraken template repo etc. +- [x] Allow instantiation of actions, octopush template repo etc. - [x] Implement docker action - [x] Create pr for gitea provider - [x] Providing query results -- [ ] Create CLI to trigger action +- [x] Create CLI to trigger action -### Not in scope +## Version 0.2 -## Version 1.0 +- [x] Write README +- [x] Fix git issues +- [x] Allow octopush to run directly on the cli -- [ ] Write README +## Version 0.3 + +- [ ] Make select depend on query - [ ] Make configurable ssh user - [ ] Make configurable gpg keyset - [ ] Make configurable git provider -- [ ] Create templating function + - [ ] Add github +- [ ] Create templating function for easily creating new actions - [ ] Add way to see progress of runners -- [ ] Implement global .kraken store for easy access -- [ ] Move builders to start instead of every time +- [ ] Implement global .octopush store for easy access to settings +- [ ] Move builders to start instead of every building on every action +- [ ] Setup releases on github +- [ ] Setup CI +- [ ] Setup static analysis +- [ ] Setup releases on gitea using drone +- [ ] Figure out a license (probably MIT) -## Version 1.x +## Version 0.4 + +- [ ] Create setup version for local actions +- [ ] Create setup version for server actions +- [ ] Create json schema +- [ ] Move roadmap to release / changelog + +## Version 0.x - Think about some sort of isolation - Run authenticated on servers diff --git a/scripts/push_github.sh b/scripts/push_github.sh index d2a19cb..f8032db 100755 --- a/scripts/push_github.sh +++ b/scripts/push_github.sh @@ -2,6 +2,6 @@ set -e -git remote add github git@github.com:kjuulh/kraken.git || true +git remote add github git@github.com:kjuulh/octopush.git || true git push -f github main diff --git a/scripts/run_client.sh b/scripts/run_client.sh index 237c23d..8ab48f4 100755 --- a/scripts/run_client.sh +++ b/scripts/run_client.sh @@ -4,5 +4,10 @@ set -e current_branch=$(git branch --show-current) -go run cmd/kraken/kraken.go process --actions-repo "git@git.front.kjuulh.io:kjuulh/kraken.git" --branch "$current_branch" --path "_examples/actions/write_a_readme" -go run cmd/kraken/kraken.go process --actions-repo "git@git.front.kjuulh.io:kjuulh/kraken.git" --branch "$current_branch" --path "_examples/queries/scrape_readme" +export $(cat .env | xargs) + +#go run cmd/octopush/octopush.go process --actions-repo "git@git.front.kjuulh.io:kjuulh/octopush.git" --branch "$current_branch" --path "_examples/actions/write_a_readme" +go run cmd/octopush/octopush.go process \ + --actions-repo "git@git.front.kjuulh.io:kjuulh/octopush.git"\ + --branch "$current_branch" \ + --path "_examples/actions/add_releaserc"