This is a versatile and easy-to-use template for building a robust Golang CLI with Cobra and Viper. It comes with built-in AWS adapters via Golang SDK v2 and handy utilities.
Use this repository as a GitHub Template to create your own CLI:
- Clone this repository and start adding your command and flag definitions. Utilize pre-installed AWS adapters and included utilities to kickstart your CLI development.
- This template's CLI is called
golang-cli-boilerplate. You can rename it by changing the name using your favourite tool, or just using our IDE with a simpleCtrl+Shift+Rand replace all the occurrences ofgolang-cli-boilerplatewith your new name (or including the org/golang-cli-boilerplate) if applicable. - Configure PreCommit hooks by running
task pre-commit-init. This will install the pre-commit hooks in your local repository. - Update the
LICENSE.mdfile with your own license. - Verify that everything is working as expected:
# If you want to use the MakeFile included.
make lint
# Or, if you're using Taskfile
task go-lint- After this step, you should be able to run your CLI:
# TaskFile wraps the binary in a task, so you can run it like this:
task cli-run -- help
# Or directly, just ensure you're building the binary first
go build -o <my-cli> main.go
# Or, with TaskFile
task cli-buildNOTE: This template includes a MakeFile and a TaskFile with the necessary (best practices) configuration to build and lint your CLI. Both tools include the same capability, so you can choose the one you prefer.
The release of your CLI is done using GoReleaser. For MacOs, you can use Homebrew. This template already includes a .goreleaser.yml file with the necessary (best practices) configuration to release your CLI.
In addition, a GitHub Action is included to automate the release process.
goreleaser:
if: needs.release-please.outputs.releases_created == 'true'
permissions:
contents: write
needs:
- release-please
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3
with:
fetch-depth: 0
- name: Set up Go
uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4
with:
go-version: '1.20'
- name: Download Syft
uses: anchore/sbom-action/download-syft@422cb34a0f8b599678c41b21163ea6088edb2624 # v0.14.1
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@f82d6c1c344bcacabba2c841718984797f664a6b # v4
with:
distribution: goreleaser
version: latest
args: release --clean
env:
GITHUB_TOKEN: ${{secrets.GH_HOMEBREW_TOKEN}}
NOTE: In order to use the GitHub Action, you need to create a
GH_HOMEBREW_TOKENsecret in your repository with enough permissions to read and write into thetaprepository.
Documenting your CLI is relevant. This repository includes a docs folder with a template for the documentation of your CLI. You can use it as a starting point for your own documentation. It includes:
- π
README.mdwith a standard structure for a CLI repository. - π
INSTALLATION.mdfile with the installation instructions for your CLI. - π
CONTRIBUTING.mdfile with the instructions for contributing to your CLI. - π
CODE_OF_CONDUCT.mdfile with the code of conduct for your CLI. - π
LICENSE.mdfile with the license for your CLI.
tree -L 3 docs/
docs/
βββ about_docs.md
βββ templates
βββ CODE_OF_CONDUCT.md
βββ CONTRIBUTING.md
βββ INSTALLATION.md
βββ LICENSE
βββ README.mdNOTE: It's recommended to move these files accordingly, nevertheless it's strongly encouraged to keep a concise documentation structure, keeping the
README.mdsimple, concise, and store the more detailed documentation in thedocsfolder. For more details about the document templates, see this.
- Out-of-the-box environment variable management π³
- Auto-scan host environment variables for
AWSandTerraformcredentials π - Import env vars from dotfiles (
.env) π - Leverages built-in AWS adapters (Golang SDK v2)
- Ready-to-use utilities for common tasks π§°. See the pkg folder for more details.
- Built-in Docker support π³
- Out-of-the-box GitHub Actions workflows for CI/CD π
- Built-in PreCommit hooks for linting and formatting π§Ή
- Out-of-the-box support for output data in
yaml,jsonortablesπ€
On each subcommand (at the parent level, which means, those that are in the top of your pkg), ensure you're implementing the GetClient function:
func GetClient(cmd *cobra.Command) *cli.Client {
ctx := cmd.Context().Value(cliutils.GetCtxKey())
if ctx == nil {
log.Fatal("Unable to get the client context.")
}
client, ok := ctx.(*cli.Client)
if !ok {
log.Fatal("Unable to assert client.")
}
return client
}Adapters are known also as clients. They can plug into the cliClient and provide additional functionality. This template includes a subcommand called aws-ecs in the cmd/example package. It's a subcommand that use the aws adapter to read the ECS clusters in your account. It's a good example of how to use the cliClient and the aws adapter. See here
This template is equipped with an array of tools to maintain a high standard of code quality and accelerate the development process:
- Precommit framework for managing and maintaining multi-language pre-commit hooks
- Taskfile is a simpler way to automate tasks
- Makefile for managing build workflow
- GolangCI-linter for consolidated linting to improve code quality
- GoReleaser for easy binary release management
- Docker for containerization
- ShellCheck for shell script linting
- Release please for automated releases
NOTE: For pre-commit, ensure you're running
task pre-commmit-initto add the pre-configured hooks into yourgithooks. This will ensure that the code is linted and formatted before committing it. Also, there are other linters included (yaml, docker, shell, md, etc.).
- Add a built-in
GitHubadapter. - Add a CLI for quickly bootstrapping a new CLI
- Add an OpenAI adapter for generating CLI documentation and/or other purposes.
Please read our contributing guide. All issues, pull requests and GitHub stars are welcome! Happy coding! π»
Find me in: