From ed8a66fdd32a648c830221073f0d318971dee665 Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Sat, 23 Nov 2024 05:39:22 +0100 Subject: [PATCH] cmd: add additional CLI entrypoint and build separately --- .dockerignore | 1 + .github/workflows/build-tag.yml | 25 +++++++++++++++++++ .github/workflows/build.yml | 11 +++++++++ .gitignore | 1 + Makefile | 37 +++++++++++++++++----------- cmd/{ => cli}/cli.go | 9 +++---- cmd/{ => cli}/cli_convert.go | 4 +-- cmd/{ => cli}/cli_convert_ms_dhcp.go | 2 +- cmd/{ => cli}/cli_etcdctl.go | 4 +-- cmd/{ => cli}/cli_export.go | 4 +-- cmd/{ => cli}/cli_health.go | 4 +-- cmd/{ => cli}/cli_import.go | 4 +-- cmd/{ => cli}/cli_snapshot.go | 4 +-- cmd/{ => cli}/cli_token_add.go | 2 +- cmd/{ => cli}/cli_tokens.go | 4 +-- cmd/{ => cli}/cli_users.go | 4 +-- cmd/{ => cli}/cli_users_add.go | 2 +- cmd/cli/main/main.go | 8 ++++++ cmd/root.go | 5 ++++ 19 files changed, 96 insertions(+), 39 deletions(-) rename cmd/{ => cli}/cli.go (88%) rename cmd/{ => cli}/cli_convert.go (77%) rename cmd/{ => cli}/cli_convert_ms_dhcp.go (98%) rename cmd/{ => cli}/cli_etcdctl.go (90%) rename cmd/{ => cli}/cli_export.go (95%) rename cmd/{ => cli}/cli_health.go (89%) rename cmd/{ => cli}/cli_import.go (95%) rename cmd/{ => cli}/cli_snapshot.go (94%) rename cmd/{ => cli}/cli_token_add.go (98%) rename cmd/{ => cli}/cli_tokens.go (77%) rename cmd/{ => cli}/cli_users.go (77%) rename cmd/{ => cli}/cli_users_add.go (98%) create mode 100644 cmd/cli/main/main.go diff --git a/.dockerignore b/.dockerignore index af073a111..22ced8fb9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,3 +4,4 @@ data/ Dockerfile internal/resources/blocky internal/resources/macoui +bin/** diff --git a/.github/workflows/build-tag.yml b/.github/workflows/build-tag.yml index af4f8552d..2471f5249 100644 --- a/.github/workflows/build-tag.yml +++ b/.github/workflows/build-tag.yml @@ -15,6 +15,8 @@ jobs: build: name: Build runs-on: ubuntu-latest + outputs: + release_upload_url: ${{ steps.create_release.outputs.upload_url }} steps: - uses: actions/checkout@v4 - uses: docker/setup-qemu-action@v3 @@ -37,7 +39,10 @@ jobs: build-args: | BUILD=${{ steps.vars.outputs.build }} GIT_BUILD_HASH=${{ steps.vars.outputs.sha }} + - run: | + make bin/gravity-cli - uses: actions/create-release@v1.1.4 + id: create_release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -63,3 +68,23 @@ jobs: ``` go get beryju.io/gravity@v${{ steps.vars.outputs.version }} ``` + build-cli: + name: Build CLI + needs: build + runs-on: ubuntu-latest + strategy: + matrix: + arch: [arm64, amd64] + os: [darwin, linux] + steps: + - uses: actions/checkout@v4 + - run: | + GOOS=${{ matrix.os }} GOARCH=${{ matrix.arch }} make bin/gravity-cli + - uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.build.outputs.release_upload_url }} + asset_path: ./bin/gravity-cli + asset_name: gravity-cli_${{ matrix.os }}_${{ matrix.arch }} + asset_content_type: application/octet-stream diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 71d1b5942..51b9bc144 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,3 +40,14 @@ jobs: BUILD=${{ steps.vars.outputs.build }} GIT_BUILD_HASH=${{ steps.vars.outputs.sha }} CC_GH_COMMIT_SHA=${{ github.event.pull_request.head.sha }} + build-cli: + name: Build CLI + runs-on: ubuntu-latest + strategy: + matrix: + arch: [arm64, amd64] + os: [darwin, linux] + steps: + - uses: actions/checkout@v4 + - run: | + GOOS=${{ matrix.os }} GOARCH=${{ matrix.arch }} make bin/gravity-cli diff --git a/.gitignore b/.gitignore index c9d210eb2..fb39663c2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ coverage.html *.sock tests.json test-output +bin/** diff --git a/Makefile b/Makefile index 01bb76b47..59fda01f6 100644 --- a/Makefile +++ b/Makefile @@ -19,17 +19,18 @@ ci--env: docker-build: internal/resources/macoui internal/resources/blocky internal/resources/tftp go build \ -ldflags "${LD_FLAGS} -X beryju.io/gravity/pkg/extconfig.BuildHash=${GIT_BUILD_HASH}" \ - -v -a -o gravity . + -v -a -o gravity ${PWD} clean: rm -rf ${PWD}/data/ + rm -rf ${PWD}/bin/ run: internal/resources/macoui internal/resources/blocky internal/resources/tftp export INSTANCE_LISTEN=0.0.0.0 export DEBUG=true export LISTEN_ONLY=true $(eval LD_FLAGS := -X beryju.io/gravity/pkg/extconfig.Version=${VERSION} -X beryju.io/gravity/pkg/extconfig.BuildHash=dev-$(shell git rev-parse HEAD)) - go run ${GO_FLAGS} . server + go run ${GO_FLAGS} ${PWD} server # Web web-install: @@ -51,6 +52,12 @@ web-lint: npm run lint npm run lit-analyse +# CLI +bin/gravity-cli: + $(eval LD_FLAGS := -X beryju.io/gravity/pkg/extconfig.Version=${VERSION} -X beryju.io/gravity/pkg/extconfig.BuildHash=dev-$(shell git rev-parse HEAD)) + mkdir -p ${PWD}/bin/ + go build ${GO_FLAGS} -o ${PWD}/bin/gravity-cli ${PWD}/cmd/cli/main/ + # Website website-watch: cd ${PWD}/docs @@ -58,26 +65,26 @@ website-watch: internal/resources/macoui: mkdir -p internal/resources/macoui - curl -L https://raw.githubusercontent.com/wireshark/wireshark/6885d787fda5f74a2d1f9eeea443fecf8dd58528/manuf -o ./internal/resources/macoui/db.txt + curl -L https://raw.githubusercontent.com/wireshark/wireshark/6885d787fda5f74a2d1f9eeea443fecf8dd58528/manuf -o ${PWD}/internal/resources/macoui/db.txt internal/resources/blocky: mkdir -p internal/resources/blocky - curl -L https://adaway.org/hosts.txt -o ./internal/resources/blocky/adaway.org.txt - curl -L https://big.oisd.nl/domainswild -o ./internal/resources/blocky/big.oisd.nl.txt - curl -L https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts -o ./internal/resources/blocky/StevenBlack.hosts.txt - curl -L https://v.firebog.net/hosts/AdguardDNS.txt -o ./internal/resources/blocky/AdguardDNS.txt - curl -L https://v.firebog.net/hosts/Easylist.txt -o ./internal/resources/blocky/Easylist.txt - curl -L https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt -o ./internal/resources/blocky/AdGuardSDNSFilter.txt + curl -L https://adaway.org/hosts.txt -o ${PWD}/internal/resources/blocky/adaway.org.txt + curl -L https://big.oisd.nl/domainswild -o ${PWD}/internal/resources/blocky/big.oisd.nl.txt + curl -L https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts -o ${PWD}/internal/resources/blocky/StevenBlack.hosts.txt + curl -L https://v.firebog.net/hosts/AdguardDNS.txt -o ${PWD}/internal/resources/blocky/AdguardDNS.txt + curl -L https://v.firebog.net/hosts/Easylist.txt -o ${PWD}/internal/resources/blocky/Easylist.txt + curl -L https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt -o ${PWD}/internal/resources/blocky/AdGuardSDNSFilter.txt internal/resources/tftp: mkdir -p internal/resources/tftp - curl -L http://boot.ipxe.org/undionly.kpxe -o ./internal/resources/tftp/ipxe.undionly.kpxe - curl -L https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe -o ./internal/resources/tftp/netboot.xyz.kpxe - curl -L https://boot.netboot.xyz/ipxe/netboot.xyz-undionly.kpxe -o ./internal/resources/tftp/netboot.xyz-undionly.kpxe - curl -L https://boot.netboot.xyz/ipxe/netboot.xyz.efi -o ./internal/resources/tftp/netboot.xyz.efi + curl -L http://boot.ipxe.org/undionly.kpxe -o ${PWD}/internal/resources/tftp/ipxe.undionly.kpxe + curl -L https://boot.netboot.xyz/ipxe/netboot.xyz.kpxe -o ${PWD}/internal/resources/tftp/netboot.xyz.kpxe + curl -L https://boot.netboot.xyz/ipxe/netboot.xyz-undionly.kpxe -o ${PWD}/internal/resources/tftp/netboot.xyz-undionly.kpxe + curl -L https://boot.netboot.xyz/ipxe/netboot.xyz.efi -o ${PWD}/internal/resources/tftp/netboot.xyz.efi gen-build: - DEBUG=true go run ${GO_FLAGS} . generateSchema ${SCHEMA_FILE} + DEBUG=true go run ${GO_FLAGS} ${PWD} generateSchema ${SCHEMA_FILE} git add ${SCHEMA_FILE} gen-clean: @@ -162,7 +169,7 @@ test: internal/resources/macoui internal/resources/blocky internal/resources/tft export ETCD_ENDPOINT="localhost:2385" export DEBUG="true" export LISTEN_ONLY="true" - go run -v . cli etcdctl del --prefix / + go run -v ${PWD} cli etcdctl del --prefix / go test \ -p 1 \ -coverprofile=coverage.txt \ diff --git a/cmd/cli.go b/cmd/cli/cli.go similarity index 88% rename from cmd/cli.go rename to cmd/cli/cli.go index d0bee6e9b..4615588e9 100644 --- a/cmd/cli.go +++ b/cmd/cli/cli.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "context" @@ -25,7 +25,7 @@ var ( logger *zap.Logger ) -var cliCmd = &cobra.Command{ +var CLICmd = &cobra.Command{ Use: "cli", Short: "Interact with a running Gravity server", PersistentPreRun: func(cmd *cobra.Command, args []string) { @@ -66,9 +66,8 @@ func init() { defUrl = fmt.Sprintf("unix://%s/gravity.sock", cwd) } logger = extconfig.Get().Logger().Named("cli") - cliCmd.PersistentFlags().StringVarP(&apiUrl, "host", "s", defUrl, "API Host") - cliCmd.PersistentFlags().StringVarP(&apiToken, "token", "t", "", "API Token") - rootCmd.AddCommand(cliCmd) + CLICmd.PersistentFlags().StringVarP(&apiUrl, "host", "s", defUrl, "API Host") + CLICmd.PersistentFlags().StringVarP(&apiToken, "token", "t", "", "API Token") } func checkApiError(hr *http.Response, err error) { diff --git a/cmd/cli_convert.go b/cmd/cli/cli_convert.go similarity index 77% rename from cmd/cli_convert.go rename to cmd/cli/cli_convert.go index 706ce9b46..00006f3ed 100644 --- a/cmd/cli_convert.go +++ b/cmd/cli/cli_convert.go @@ -1,4 +1,4 @@ -package cmd +package cli import "github.com/spf13/cobra" @@ -8,5 +8,5 @@ var cliConvertCmd = &cobra.Command{ } func init() { - cliCmd.AddCommand(cliConvertCmd) + CLICmd.AddCommand(cliConvertCmd) } diff --git a/cmd/cli_convert_ms_dhcp.go b/cmd/cli/cli_convert_ms_dhcp.go similarity index 98% rename from cmd/cli_convert_ms_dhcp.go rename to cmd/cli/cli_convert_ms_dhcp.go index 08b598ea4..70959694f 100644 --- a/cmd/cli_convert_ms_dhcp.go +++ b/cmd/cli/cli_convert_ms_dhcp.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "context" diff --git a/cmd/cli_etcdctl.go b/cmd/cli/cli_etcdctl.go similarity index 90% rename from cmd/cli_etcdctl.go rename to cmd/cli/cli_etcdctl.go index bf5ef06ad..a0008ab61 100644 --- a/cmd/cli_etcdctl.go +++ b/cmd/cli/cli_etcdctl.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( _ "unsafe" @@ -17,5 +17,5 @@ var globalFlags command.GlobalFlags func init() { globalFlags.Endpoints = []string{extconfig.Get().Etcd.Endpoint} - cliCmd.AddCommand(etcdctlCommand) + CLICmd.AddCommand(etcdctlCommand) } diff --git a/cmd/cli_export.go b/cmd/cli/cli_export.go similarity index 95% rename from cmd/cli_export.go rename to cmd/cli/cli_export.go index 03c3790fb..573cf845c 100644 --- a/cmd/cli_export.go +++ b/cmd/cli/cli_export.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "encoding/json" @@ -43,5 +43,5 @@ var exportCmd = &cobra.Command{ func init() { exportCmd.Flags().BoolVar(&exportSafe, "safe", false, "Export only safe values") - cliCmd.AddCommand(exportCmd) + CLICmd.AddCommand(exportCmd) } diff --git a/cmd/cli_health.go b/cmd/cli/cli_health.go similarity index 89% rename from cmd/cli_health.go rename to cmd/cli/cli_health.go index 0a68f5c23..12595e6b5 100644 --- a/cmd/cli_health.go +++ b/cmd/cli/cli_health.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "os" @@ -20,5 +20,5 @@ var healthCmd = &cobra.Command{ } func init() { - cliCmd.AddCommand(healthCmd) + CLICmd.AddCommand(healthCmd) } diff --git a/cmd/cli_import.go b/cmd/cli/cli_import.go similarity index 95% rename from cmd/cli_import.go rename to cmd/cli/cli_import.go index 2ae572c79..024a9cd0b 100644 --- a/cmd/cli_import.go +++ b/cmd/cli/cli_import.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "encoding/json" @@ -36,5 +36,5 @@ var importCmd = &cobra.Command{ } func init() { - cliCmd.AddCommand(importCmd) + CLICmd.AddCommand(importCmd) } diff --git a/cmd/cli_snapshot.go b/cmd/cli/cli_snapshot.go similarity index 94% rename from cmd/cli_snapshot.go rename to cmd/cli/cli_snapshot.go index 88398b6b3..7160c7889 100644 --- a/cmd/cli_snapshot.go +++ b/cmd/cli/cli_snapshot.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "github.com/spf13/cobra" @@ -14,5 +14,5 @@ func init() { if err != nil { panic(err) } - cliCmd.AddCommand(sc) + CLICmd.AddCommand(sc) } diff --git a/cmd/cli_token_add.go b/cmd/cli/cli_token_add.go similarity index 98% rename from cmd/cli_token_add.go rename to cmd/cli/cli_token_add.go index 34f4f0c69..0905c2d87 100644 --- a/cmd/cli_token_add.go +++ b/cmd/cli/cli_token_add.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "fmt" diff --git a/cmd/cli_tokens.go b/cmd/cli/cli_tokens.go similarity index 77% rename from cmd/cli_tokens.go rename to cmd/cli/cli_tokens.go index b8002f058..c2327f590 100644 --- a/cmd/cli_tokens.go +++ b/cmd/cli/cli_tokens.go @@ -1,4 +1,4 @@ -package cmd +package cli import "github.com/spf13/cobra" @@ -8,5 +8,5 @@ var cliTokensCmd = &cobra.Command{ } func init() { - cliCmd.AddCommand(cliTokensCmd) + CLICmd.AddCommand(cliTokensCmd) } diff --git a/cmd/cli_users.go b/cmd/cli/cli_users.go similarity index 77% rename from cmd/cli_users.go rename to cmd/cli/cli_users.go index 20f57ce07..28a66a774 100644 --- a/cmd/cli_users.go +++ b/cmd/cli/cli_users.go @@ -1,4 +1,4 @@ -package cmd +package cli import "github.com/spf13/cobra" @@ -8,5 +8,5 @@ var cliUsersCmd = &cobra.Command{ } func init() { - cliCmd.AddCommand(cliUsersCmd) + CLICmd.AddCommand(cliUsersCmd) } diff --git a/cmd/cli_users_add.go b/cmd/cli/cli_users_add.go similarity index 98% rename from cmd/cli_users_add.go rename to cmd/cli/cli_users_add.go index 7b3306142..ee982995b 100644 --- a/cmd/cli_users_add.go +++ b/cmd/cli/cli_users_add.go @@ -1,4 +1,4 @@ -package cmd +package cli import ( "fmt" diff --git a/cmd/cli/main/main.go b/cmd/cli/main/main.go new file mode 100644 index 000000000..c8d265062 --- /dev/null +++ b/cmd/cli/main/main.go @@ -0,0 +1,8 @@ +package main + +import "beryju.io/gravity/cmd/cli" + +func main() { + cli.CLICmd.Use = "gravity-cli" + cli.CLICmd.Execute() +} diff --git a/cmd/root.go b/cmd/root.go index d0906d0ea..7761cfc88 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "os" + "beryju.io/gravity/cmd/cli" "beryju.io/gravity/pkg/extconfig" "github.com/spf13/cobra" ) @@ -13,6 +14,10 @@ var rootCmd = &cobra.Command{ Version: extconfig.FullVersion(), } +func init() { + rootCmd.AddCommand(cli.CLICmd) +} + func Execute() { err := rootCmd.Execute() if err != nil {