tools_build

package module
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 4, 2024 License: MIT Imports: 9 Imported by: 2

README

tools-build

GoDoc Reference go.mod LICENSE

Release Code Coverage Report Go Report Card Build Status

This package provides build script tooling for go-based projects. The tooling is in the form of code utilizing goyek build automation. goyek builds are typically set up as tasks, and this project provides some common code to perform the work of the tasks. Here is a sample set of tasks:

var (
    build = goyek.Define(goyek.Task{
        Name:  "build",
        Usage: "build the executable",
        Action: func(a *goyek.A) {
            buildExecutable(a)
        },
    })

    clean = goyek.Define(goyek.Task{
        Name:  "clean",
        Usage: "delete build products",
        Action: func(a *goyek.A) {
            fmt.Println("deleting build products")
            exec, path, _, _ := readConfig()
            workingDir := WorkingDir()
            files := []string{
                filepath.Join(workingDir, path, versionInfoFile),
                filepath.Join(workingDir, path, resourceFile),
                filepath.Join(workingDir, coverageFile),
                filepath.Join(workingDir, exec),
            }
            Clean(files)
        },
    })

    _ = goyek.Define(goyek.Task{
        Name:  "coverage",
        Usage: "run unit tests and produce a coverage report",
        Action: func(a *goyek.A) {
            GenerateCoverageReport(a, coverageFile)
        },
    })

    _ = goyek.Define(goyek.Task{
        Name:  "doc",
        Usage: "generate documentation",
        Action: func(a *goyek.A) {
            GenerateDocumentation(a)
        },
    })

    format = goyek.Define(goyek.Task{
        Name:  "format",
        Usage: "clean up source code formatting",
        Action: func(a *goyek.A) {
            Format(a)
        },
    })

    lint = goyek.Define(goyek.Task{
        Name:  "lint",
        Usage: "run the linter on source code",
        Action: func(a *goyek.A) {
            Lint(a)
        },
    })

    nilaway = goyek.Define(goyek.Task{
        Name:  "nilaway",
        Usage: "run nilaway on source code",
        Action: func(a *goyek.A) {
            NilAway(a)
        },
    })

    vulnCheck = goyek.Define(goyek.Task{
        Name:  "vulnCheck",
        Usage: "run vulnerability check on source code",
        Action: func(a *goyek.A) {
            VulnerabilityCheck(a)
        },
    })

    _ = goyek.Define(goyek.Task{
        Name:  "preCommit",
        Usage: "run all pre-commit tasks",
        Deps:  goyek.Deps{clean, lint, nilaway, format, vulnCheck, tests, build},
    })

    tests = goyek.Define(goyek.Task{
        Name:  "tests",
        Usage: "run unit tests",
        Action: func(a *goyek.A) {
            UnitTests(a)
        },
    })
)

And here is a typical build script to execute the tasks:

#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

if [[ "${TRACE-0}" == "1" ]]; then
    set -o xtrace
    tracing=true
else
    tracing=false
fi

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
cd "${DIR}/build"
if [[ "${tracing}" == "true" ]]; then
    DIR=${DIR} go run . -v "$@"
else
    DIR=${DIR} go run . "$@"
fi

The script employs a DIR environment variable for the benefit of the WorkingDir function, which is used by this package to find the project's top level directory. If DIR is not set as an environment variable, WorkingDir will assume that ".." is the correct location, which is based on the assumption that the go code running the build is placed in a directory, one level deep, such as build (as seen in the line above cd "${DIR}/build). Regardless of whether or not the DIR environment variable is set, the WorkingDir function looks for the .git directory in its candidate value, and it's not found, then the WorkingDir function calls os.Exit and the build ends.

Opinionated?

Well, yes. I wrote this for my go projects, and, as such, it reflects my thinking about the proper tooling to use, and how to use that tooling. The biggest example of this is probably my use of gocritic as the tool called by the Lint function.

That said, if you find the package useful but don't like some of my choices, you can easily create your own functions to replace the ones you don't care for. Won't hurt my feelings a bit.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Clean

func Clean(files []string)

Clean deletes the named files, which must be located in, or in a subdirectory of, WorkingDir(). If any of the named files contains a back directory (".."), calls os.Exit()

func Format

func Format(a *goyek.A) bool

Format runs the gofmt tool to repair the formatting of each source file; returns false if the command fails

func Generate added in v0.2.1

func Generate(a *goyek.A) bool

Generate runs the 'go generate' tool

func GenerateCoverageReport

func GenerateCoverageReport(a *goyek.A, file string) bool

GenerateCoverageReport runs the unit tests, generating a coverage profile; if the unit tests all succeed, generates the report as HTML to be displayed in the current browser window. Returns false if either the unit tests or the coverage report display fails

func GenerateDocumentation

func GenerateDocumentation(a *goyek.A, excludedDirs []string) bool

GenerateDocumentation generates documentation of the code, outputting it to stdout; returns false on error

func Install

func Install(a *goyek.A, packageName string) bool

Install runs the command to install the '@latest' version of a specified package; returns false on failure

func Lint

func Lint(a *goyek.A) bool

Lint runs lint on the source code after making sure that the lint tool is up to date; returns false on failure

func MakeCmdOptions

func MakeCmdOptions(b *bytes.Buffer) []cmd.Option

MakeCmdOptions creates a slice of cmd.Option instances consisting of the working directory, stderr (using the provided buffer), and stdout (using the same provided buffer)

func NilAway

func NilAway(a *goyek.A) bool

NilAway runs the nilaway tool, which attempts, via static analysis, to detect potential nil access errors; returns false on errors

func RunCommand

func RunCommand(a *goyek.A, command string) bool

RunCommand runs a command and displays all of its output; returns true on success

func UnitTests

func UnitTests(a *goyek.A) bool

UnitTests runs all unit tests, with code coverage enabled; returns false on failure

func UpdateDependencies added in v0.3.0

func UpdateDependencies(a *goyek.A) bool

UpdateDependencies updates module dependencies and prunes the modified go.mod and go.sum files

func VulnerabilityCheck

func VulnerabilityCheck(a *goyek.A) bool

VulnerabilityCheck runs the govulncheck tool, which checks for unresolved known vulnerabilities in the libraries used; returns false on failure

func WorkingDir

func WorkingDir() string

WorkingDir returns a best guess of the working directory. If the directory found is not, in fact, a directory, or is, but does not contain a .git subdirectory, calls exit. A successful call's value is cached.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL