From f6001f4e3d83e52504b32a03360e291a64e14e6a Mon Sep 17 00:00:00 2001 From: Kasper Juul Hermansen Date: Sun, 18 Sep 2022 21:07:07 +0200 Subject: [PATCH] Add a basic readme (#15) Co-authored-by: kjuulh Reviewed-on: https://git.front.kjuulh.io/kjuulh/kraken/pulls/15 --- .DS_Store | Bin 0 -> 6148 bytes CONFIGURATION_SERVER.md | 1 + README.md | 249 ++++++++++++++++++++++++++++++++++++++++ assets/kraken.png | Bin 0 -> 32918 bytes assets/kraken.svg | 10 ++ 5 files changed, 260 insertions(+) create mode 100644 .DS_Store create mode 100644 CONFIGURATION_SERVER.md create mode 100644 README.md create mode 100644 assets/kraken.png create mode 100644 assets/kraken.svg diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0c465124c446bc67eec18062d8fa41354bb96c70 GIT binary patch literal 6148 zcmeHKL5tHs82zTL+jNUkL18aKz-w8fyC~wN+iedE>R~H-P^oDX)?k_`O=^`==vn`R zf5EH2#Q)++-#0UrBwf8Mh%ED!nKzkvZ<2Y*%yfuIbmzfcq81T3NQ|{zWak98bJ~iE zsksgms*edxDW;IplX#15E35<7f&a|`p1TbiV$OabpK|k8jz_T^p_P}0Bc%PGDo`TY z0XM}jq>Sf!f&2Au+|eSPnts2Hrg4;Jp7&i;sO23C|nF%H;!eJ`B4(ilpqR1P+q-=l0YuHa-IaK(hhWk({LKY*4}b?=pDA* z1Mk7A?JggBUfaEYaBsD0I5%(Kd2~8_7f%xTNsW*MRx}k?4Q}8w3Wf2%AIy?iCTFN; zO_j#*F(|qsZlNXbU=yr41^DrLxlbRJ`*BId_sXm4#rITV|0uC{=!_)#o**whPlca0 z-}8o>;;AOZe%0Iml6(6tiYURG57GY&&z<2~qGqV-Qp!qt{vz^v=eK?al~3hSvsZb3 zogUK(9aEp4(t!HK-UWMa26CjViG_CIo43l=-I`7sU5OBYYK`gSm2k&3TFx|4CDe~zHp~`fj+F%I$#~R zoDT5%;36@046Ze*r30Bd0sw2MR)I4AVPK7Guw!to5iJOzr9dqe=7=G*9QCf@bquaG zYB>pW_z>pK!kkcqx;y%J6`e#!qs^@Y)`6k}Rejmw{lEX`^M6rfudD;sflK9psPzWD zE{0_G)~&(uUh5*gLE>QETBDL6GuyE$@K(HsqylX&7l0juYmKNu*gpcw2Af$2{;31M E0E|ixk^lez literal 0 HcmV?d00001 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..ae5f156 --- /dev/null +++ b/README.md @@ -0,0 +1,249 @@ +

+ +

+

Kraken - Your cute action executor

+ +## Purpose + +The goal of this project is to easily do batch changes or queries a host of +repositories. In large organisations using multi-repository strategies, it may +be painful to change even small things, because there are so many repositories +to go through; Kraken aims to change that. + +**DISCLAIMER:** It is still early days, and the api is subject to change. + +## Features + +- uses a actions repository, where you store all your pending actions 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 + +Kraken comes in two modes. Client or Client -> Server. Kraken can stand alone as +a client, for smaller and less secure changes. However, for organisations, it +may be useful to use Kraken in server mode, which supports more features, and +has extra security built in. + +### Client (CLI) + +Download executable from [releases](https://github.com/kjuulh/kraken/releases) + +#### Or Use docker image + +```bash +docker run --rm kasperhermansen/krakencli:latest version +``` + +#### Or Build from source + +```bash +git clone https://github.com/kjuulh/kraken.git +cd kraken + +go build cmd/kraken/kraken.go +./kraken version +``` + +#### Or Build with cuddle + +```bash +git clone https://github.com/kjuulh/kraken.git +cd kraken + +cuddle_cli x build_cli +``` + +### Server + +We prefer to run the server directly as a docker image. + +```bash +docker pull kasperhermansen/krakenserver:latest +docker run -p 9090:80 --rm kasperhermansen/krakenserver:latest +``` + +#### Or Build from source + +```bash +git clone https://github.com/kjuulh/kraken.git +cd kraken + +go build cmd/server/server.go +./server version +``` + +#### Or Build with cuddle + +```bash +git clone https://github.com/kjuulh/kraken.git +cd kraken + +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)) + +Kraken ships with autocomplete built in (courtesy of spf13/cobra). To add: + +- Bash: `echo 'source <(kraken completion bash)' >> ~/.bashrc` +- Zsh: `echo 'source <(kraken completion zsh)' >> ~/.zshrc` + +### Creating a new action + +Creating a new action + +```bash +git init my-actions # should only be done once +cd my-actions +kraken tmpl init write-a-readme --command +cat write-a-readme/kraken.yml + +# Output +# apiVersion: git.front.kjuulh.io/kjuulh/kraken/blob/main/schema/v1 +# name: write-a-readme +# select: +# repositories: [] +# actions: +# - type: shell +# entry: "main.sh" +``` + +Kraken 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/kraken.yml +apiVersion: git.front.kjuulh.io/kjuulh/kraken/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/kraken.yml +apiVersion: git.front.kjuulh.io/kjuulh/kraken/blob/main/schema/v1 +name: write-a-readme +select: + repositories: #new + - git@git.front.kjuulh.io:kjuulh/kraken.git #new + - git@git.front.kjuulh.io:kjuulh/kraken-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 +kraken process --path "write-a-readme" +``` + +This will cause the kraken process to automatically apply the action on the repo +and open a pr. + +### Query repositories + +Kraken can also be used to query. + +```bash +cat << EOF > write-a-readme/kraken.yml +apiVersion: git.front.kjuulh.io/kjuulh/kraken/blob/main/schema/v1 +name: write-a-readme +select: + repositories: + - git@git.front.kjuulh.io:kjuulh/kraken.git + - git@git.front.kjuulh.io:kjuulh/kraken-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: +`kraken server process --path "write-a-readme" --apply`. Kraken will try to +infer as much as possible, but it may be needed to apply some extra flags to +specify upstream repositories and such. Kraken will also help you setup keys and +such on the first run, using `kraken setup` or `kraken 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/kraken/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/kraken/kraken.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/assets/kraken.png b/assets/kraken.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1c4993c197ddc2e6527e21e4cb01caa5ca3438 GIT binary patch literal 32918 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

%xgl<&daem_ei*#AvN$&rIJO7M?<+M! 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 WPnyP`2RU5+r>c_HGsIJ?(EktLL<~6q literal 0 HcmV?d00001 diff --git a/assets/kraken.svg b/assets/kraken.svg new file mode 100644 index 0000000..8812c64 --- /dev/null +++ b/assets/kraken.svg @@ -0,0 +1,10 @@ + + + + + + + + + +