golang-cli-template icon indicating copy to clipboard operation
golang-cli-template copied to clipboard

A general purpose golang CLI template for Github and Gitlab

golang-cli-template

A general purpose project template for golang CLI applications

This template serves as a starting point for golang commandline applications it is based on golang projects that I consider high quality and various other useful blog posts that helped me understanding golang better.

drawing drawing drawing drawing drawing drawing drawing

Table of Contents

  • golang-cli-template
  • Features
  • Project Layout
  • How to use this template
  • Demo Application
  • Makefile Targets
  • Contribute

Features

  • goreleaser with deb. and .rpm packer and container (docker.hub and ghcr.io) releasing including manpages and shell completions and grouped Changelog generation.
  • golangci-lint for linting and formatting
  • Github Actions Stages (Lint, Test (windows, linux, mac-os), Build, Release)
  • Gitlab CI Configuration (Lint, Test, Build, Release)
  • cobra example setup including tests
  • Makefile - with various useful targets and documentation (see Makefile Targets)
  • Github Pages using jekyll-theme-minimal (checkout https://falcosuessgott.github.io/golang-cli-template/)
  • Useful README.md badges
  • pre-commit-hooks for formatting and validating code before committing

Project Layout

  • assets/ => docs, images, etc
  • cmd/ => commandline configurartions (flags, subcommands)
  • pkg/ => packages that are okay to import for other projects
  • internal/ => packages that are only for project internal purposes
  • tools/ => for automatically shipping all required dependencies when running go get (or make bootstrap) such as golang-ci-lint (see: https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module) )
  • scripts/ => build scripts

How to use this template

bash <(curl -s https://raw.githubusercontent.com/FalcoSuessgott/golang-cli-template/master/install.sh)

In order to make the CI work you will need to have the following Secrets in your repository defined:

Repository -> Settings -> Secrets & variables -> CODECOV_TOKEN, DOCKERHUB_TOKEN & DOCKERHUB_USERNAME

Demo Application

$> golang-cli-template -h
golang-cli project template demo application

Usage:
  golang-cli-template [flags]
  golang-cli-template [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  example     example subcommand which adds or multiplies two given integers
  help        Help about any command
  version     golang-cli-template version

Flags:
  -h, --help   help for golang-cli-template

Use "golang-cli-template [command] --help" for more information about a command.
$> golang-cli-template example 2 5 --add
7

$> golang-cli-template example 2 5 --multiply
10

Makefile Targets

$> make
bootstrap                      install build deps
build                          build golang binary
clean                          clean up environment
cover                          display test coverage
docker-build                   dockerize golang application
fmt                            format go files
help                           list makefile targets
install                        install golang binary
lint                           lint go files
pre-commit                     run pre-commit hooks
run                            run the app
test                           display test coverage

Contribute

If you find issues in that setup or have some nice features / improvements, I would welcome an issue or a PR :)