diff --git a/README.md b/README.md index c4f70d8..4e22371 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,7 @@ # donotpassgo -A composite workflow that runs general code checks on Go projects, an optional test input is available to trigger unit tests. See [steps](#steps) for more information on the jobs run +donotpassgo is a github/gitea action to run standard go checks in pipelines. -## Usage -adding donotpassgo to workflows is simple, just add the following step to your yaml file: -```yaml -- name: "checkpoint" - uses: https://code.jakeyoungdev.com/actions/donotpassgo@main -``` - -donotpassgo has optional support for running unit tests, this can be added by setting the test flag to standard -```yaml -- name: "checkpoint" - uses: https://code.jakeyoungdev.com/actions/donotpassgo@main - with: - test: standard -``` - -running unit tests with ginkgo is also supported by setting the test flag to ginkgo -```yaml -- name: "checkpoint" - uses: https://code.jakeyoungdev.com/actions/donotpassgo@main - with: - test: ginkgo -``` - -## Steps -donotpassgo runs several workflow jobs to ensure quality and secure go code, these steps may be updated as new tools develop. -### Dependency Scans -[govulncheck](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck) is installed using golang and is used to scan for vulnerabilities in the project dependencies and standard library. -### Static Code Analysis -[gosec](https://github.com/securego/gosec) inspects source code for security problems -### Unit Tests -donotpassgo supports two unit tests libraries: the standard go library and [ginkgo](https://github.com/onsi/ginkgo) \ No newline at end of file +## TODO +explain inputs in readme +test +does file naming matter here if the project has install.sh or /src will we overwrite? \ No newline at end of file diff --git a/action.yaml b/action.yaml index aed5b2f..6d8e704 100644 --- a/action.yaml +++ b/action.yaml @@ -1,27 +1,46 @@ name: "donotpassgo" -description: "general go code checks" +description: "go security checks and unit tests" inputs: - test: - description: "runs unit tests with specified library" + test-library: #TEST_LIBRARY + description: "if set, tests are run with the specific library (standard|ginkgo)" required: false default: "none" + test-version: #TEST_VERSION + description: "the test library version, if the version is none or standard this value is ignored" + required: false + default: "latest" + test-fail: #TEST_FAIL + description: "override switch to prevent jobs from failing when unit tests do" + required: false + default: "yes" + static: #STATIC_FLAG + description: "if set, static code checks are ran with gosec (yes|no)" + required: false + default: "yes" + static-fail: #STATIC_FAIL + description: "override switch to prevent jobs from failing when static code analysis does" + required: false + default: "yes" + vulnerability: #VULN_CHECK + description: "if set, dependencies are scanned with govulncheck (yes|no)" + required: false + default: "yes" + vulnerability-fail: #VULN_FAIL + description: "override switch to prevent jobs from failing when vulnerability scan does" + required: false + default: "yes" + runs: using: "composite" steps: + - name: "install dependencies" + shell: bash + run: ${{ github.action_path }}/src/install.sh + - name: "run unit tests" shell: bash - run: ${{ github.action_path }}/test.sh - env: - LIBRARY: ${{ inputs.test }} + run: ${{ github.action_path }}/src/test.sh - - name: "install govulncheck" - run: | - go install golang.org/x/vuln/cmd/govulncheck@latest - - - name: "dependency scan" - run: govulncheck ./... - - - name: "static code analysis" - uses: securego/gosec@master - with: - args: ./... \ No newline at end of file + - name: "run security checks" + shell: bash + run: ${{ github.action_path }}/src/security.sh \ No newline at end of file diff --git a/src/install.sh b/src/install.sh new file mode 100644 index 0000000..13ce6e5 --- /dev/null +++ b/src/install.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -eo pipefail + +version=$(go version); +if [[ -z "$version" ]]; then + echo "[FATAL] golang is not installed"; + exit 1; +fi + +go install golang.org/x/vuln/cmd/govulncheck@latest +go install github.com/securego/gosec/v2/cmd/gosec@latest + +if [[ "$TEST_LIBRARY" == "ginkgo" ]]; then + go install github.com/onsi/ginkgo/v2/ginkgo@$TEST_VERSION +fi \ No newline at end of file diff --git a/src/security.sh b/src/security.sh new file mode 100644 index 0000000..14b90f3 --- /dev/null +++ b/src/security.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +set -eo pipefail + +if [[ "$STATIC_FLAG" == "no" && "$VULN_SCAN" == "no" ]]; then + echo "[INFO] no security flags set, skipping!"; + exit 0; +fi + +if [[ "$STATIC_FLAG" == "yes" ]]; then + if gosec ./...; then + echo "[INFO] gosec passed!"; + else + if [[ "$STATIC_FAIL" == "yes" ]]; then + echo "[FATAL] gosec failed!"; + exit 1; + else + echo "[INFO] gosec failed!"; + fi + fi +fi + +if [[ "$VULN_CHECK" == "yes" ]]; then + if govulncheck ./...; then + echo "[INFO] govulncheck passed!"; + else + if [[ "$VULN_FAIL" == "yes" ]]; then + echo "[FATAL] govulncheck failed!" + exit 1; + else + echo "[INFO] govulncheck failed!" + fi + fi +fi \ No newline at end of file diff --git a/src/test.sh b/src/test.sh new file mode 100644 index 0000000..29e6a8c --- /dev/null +++ b/src/test.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +set -eo pipefail + +if [[ "$TEST_LIBRARY" == "none" ]]; then + echo "[INFO] test-library input not set, skipping unit tests."; + exit 0; +fi + +echo "[INFO] running unit tests"; +if [[ "$TEST_LIBRARY" == "standard" ]]; then + if go test ./...; then + echo "[INFO] unit tests passed!"; + exit 0; + else + if [[ "$TEST_FAIL" == "yes" ]]; then + echo "[FATAL] unit tests failed!"; + exit 1; + else + echo "[INFO] unit tests failed!"; + fi + fi +fi + +if [[ "$TEST_LIBRARY" == "ginkgo" ]]; then + if ginkgo ./...; then + echo "[INFO] unit tests passed!"; + exit 0; + else + if [[ "$TEST_FAIL" == "yes" ]]; then + echo "[FATAL] unit tests failed!"; + exit 1; + else + echo "[INFO] unit tests failed!"; + fi + fi +fi \ No newline at end of file diff --git a/test.sh b/test.sh deleted file mode 100755 index 39dfe8a..0000000 --- a/test.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -if [[ "$LIBRARY" == "none" ]]; then - echo "Test flag not set, skipping unit tests." - exit 0 -fi - -if [[ "$LIBRARY" == "standard" ]]; then - echo "Running unit tests with standard library" - if go test ./...; then - echo "Tests passed!" - exit 0 - else - echo "Tests failed!" - exit 1 - fi -fi - -if [[ "$LIBRARY" == "ginkgo" ]]; then - echo "Running unit tests with ginkgo" - go install github.com/onsi/ginkgo/v2/ginkgo@v2.23.4 - if ginkgo ./...; then - echo "Tests passed!" - exit 0 - else - echo "Tests failed!" - exit 1 - fi -fi \ No newline at end of file