| # Copyright 2023 The Go Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style | |
| # license that can be found in the LICENSE file. | |
| # Makefile for common tasks. | |
| default: | |
| @echo "usage: make TARGET" | |
| # Copy a gzipped tar of a Go docker image from a bucket. | |
| # This is the image that is used by the sandbox. | |
| # The file must live in the repo directory so that cmd/worker/Dockerfile | |
| # can access it. | |
| # We assume that the file exists in the bucket. | |
| # See the rule below for how to create the image. | |
| go-image.tar.gz: | |
| gsutil cp gs://go-ecosystem/$@ $@ | |
| # Use this rule to build a go image for a specific Go version. | |
| # E.g. | |
| # make go-image-1.19.4.tar.gz | |
| # To change the sandbox image permanently, copy it to GCP: | |
| # | |
| # gsutil cp go-image.1.19.4.tar.gz gs://go-ecosystem/go-image.tar.gz | |
| # Then delete the local copy. | |
| go-image-%.tar.gz: | |
| docker export $(shell docker create golang:$*) | gzip > go-image-$*.tar.gz | |
| # Download the Go vulnerability DB to a local directory, so vulndb can access it | |
| # from the sandbox, which has no network connectivity. | |
| # | |
| # Get the last-modified time of the index.json file, which is reported as the | |
| # last-modified time of the DB, and save it to a local file. (The last-modified | |
| # time of the local index.json is not what we want: it is the time that gsutil cp | |
| # wrote the file.) | |
| # | |
| # This directory must live in the repo directory so that cmd/worker/Dockerfile | |
| # can access it. | |
| go-vulndb: | |
| gsutil -m -q cp -r gs://go-vulndb . | |
| gsutil stat gs://go-vulndb/index.json | \ | |
| awk '$$1 == "Update" { for (i = 4; i <= NF; i++) printf("%s ", $$i); printf("\n"); }' \ | |
| > go-vulndb/LAST_MODIFIED | |
| # Remove comments from a json file. | |
| %.json: %.json.commented | |
| sed '/^[ \t]*#/d' $< > $@ | |
| IMAGE := ecosystem-worker-test | |
| # Enable the docker container to authenticate to Google Cloud. | |
| # This assumes the user has run "gcloud auth application-default login". | |
| DOCKER_AUTH_ARGS := -v "$(HOME)/.config/gcloud:/creds" \ | |
| --env GOOGLE_APPLICATION_CREDENTIALS=/creds/application_default_credentials.json | |
| DOCKER_RUN_ARGS := --rm --privileged -p 8080:8080 \ | |
| --env GO_ECOSYSTEM_BINARY_BUCKET=go-ecosystem \ | |
| $(DOCKER_AUTH_ARGS) | |
| DOCKER_ID_FILE := /tmp/ecosystem-docker-container-id | |
| # Build a docker image for testing. | |
| # This target is a local file that marks the time of the last | |
| # docker build. We use a file because make uses only local file timestamps to determine | |
| # whether a target needs to be regenerated. | |
| docker-build: go-image.tar.gz go-vulndb cmd/worker/*.go internal/**/*.go cmd/govulncheck_sandbox/* config.json cmd/worker/Dockerfile | |
| docker build -f cmd/worker/Dockerfile -t $(IMAGE) . \ | |
| --build-arg DOCKER_IMAGE=$(IMAGE) \ | |
| --build-arg BQ_DATASET=disable | |
| touch $@ | |
| # Run the docker image locally, for testing. | |
| # The worker will start and listen at port 8080. | |
| docker-run: docker-build | |
| docker run $(DOCKER_RUN_ARGS) $(IMAGE) | |
| # Run the docker image and enter an interactive shell. | |
| # The worker does not start. | |
| docker-run-shell: docker-build | |
| docker run -it $(DOCKER_RUN_ARGS) $(IMAGE) /bin/bash | |
| # Run the docker image in the background, waiting until the server is ready. | |
| docker-run-bg: docker-build | |
| docker run --detach $(DOCKER_RUN_ARGS) $(IMAGE) > $(DOCKER_ID_FILE) | |
| while ! curl -s --head http://localhost:8080 > /dev/null; do sleep 1; done | |
| test: docker-run-bg govulncheck-test analysis-test | |
| docker container stop `cat $(DOCKER_ID_FILE)` | |
| GOVULNCHECK_TEST_FILE := /tmp/vtest.out | |
| # Test by scanning a small module. | |
| govulncheck-test: | |
| curl -s 'http://localhost:8080/govulncheck/scan/github.com/fossas/fossa-cli@v1.1.10?importedby=1&serve=true' > $(GOVULNCHECK_TEST_FILE) | |
| @if [[ `grep -c GO-2020-0016 $(GOVULNCHECK_TEST_FILE)` -ge 2 ]]; then \ | |
| echo PASS; \ | |
| rm $(GOVULNCHECK_TEST_FILE); \ | |
| else \ | |
| echo FAIL; \ | |
| echo "output in $(GOVULNCHECK_TEST_FILE)"; \ | |
| docker container stop `cat $(DOCKER_ID_FILE)`; \ | |
| exit 1; \ | |
| fi | |
| ANALYSIS_TEST_FILE := /tmp/atest.out | |
| analysis-test: | |
| curl -sa 'http://localhost:8080/analysis/scan/github.com/jba/cli@v0.6.0?binary=findcall&args=-name+stringsCut&serve=true' > $(ANALYSIS_TEST_FILE) | |
| @if grep -q Diagnostics $(ANALYSIS_TEST_FILE); then \ | |
| echo PASS; \ | |
| rm $(ANALYSIS_TEST_FILE); \ | |
| else \ | |
| echo FAIL; \ | |
| echo "output in $(ANALYSIS_TEST_FILE)"; \ | |
| docker container stop `cat $(DOCKER_ID_FILE)`; \ | |
| exit 1; \ | |
| fi | |
| clean: | |
| rm -f go-image.tar.gz | |
| rm -rf go-vulndb | |
| rm -f config.json | |
| rm -f govulncheck_sandbox | |
| .PHONY: docker-run docker-run-bg test govulncheck-test analysis-test \ | |
| clean build-go-image |