diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 24b4534f5..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,129 +0,0 @@ -version: 2.1 - -jobs: - run-static-analysis: - parameters: - version: - type: string - docker: - - image: circleci/golang:<< parameters.version >> - environment: - GO111MODULE: "on" - # work around for recent circle CI breaking change - # Error: "Error response from daemon: client version 1.39 is too new. Maximum supported API version is 1.38" - DOCKER_API_VERSION: "1.38" - # 2CPU / 4GB RAM - resource_class: medium - steps: - - checkout - - - restore_cache: - keys: - - go-<< parameters.version >>-{{ checksum "go.sum" }}-{{ checksum "Makefile" }} - - - run: make ci-bootstrap - - - save_cache: - key: go-<< parameters.version >>-{{ checksum "go.sum" }}-{{ checksum "Makefile" }} - paths: - - "/go/pkg/mod" - - ".tmp" - - - run: - name: run static analysis - command: make static-analysis - - run-tests: - parameters: - version: - type: string - docker: - - image: circleci/golang:<< parameters.version >> - environment: - GO111MODULE: "on" - # work around for recent circle CI breaking change - # Error: "Error response from daemon: client version 1.39 is too new. Maximum supported API version is 1.38" - DOCKER_API_VERSION: "1.38" - # 2CPU / 4GB RAM - resource_class: medium - steps: - - checkout - - - restore_cache: - keys: - - go-<< parameters.version >>-{{ checksum "go.sum" }}-{{ checksum "Makefile" }} - - - run: make ci-bootstrap - - - save_cache: - key: go-<< parameters.version >>-{{ checksum "go.sum" }}-{{ checksum "Makefile" }} - paths: - - "/go/pkg/mod" - - ".tmp" - - - setup_remote_docker: - version: 18.06.0-ce - - - run: - name: enable docker client - command: | - # all of this to enable "circleci local execute ..." cli commands for /var/run/docker.sock - mkdir -p ${HOME}/.local/bin - cat \<< EOF > ${HOME}/.local/bin/docker - #!/bin/bash - set -xue - sudo -E ${HOME}/.local/bin/docker.bin \$@ - EOF - sudo mv /usr/bin/docker ${HOME}/.local/bin/docker.bin - chmod 755 ${HOME}/.local/bin/docker - - - run: - name: build cache key for java test-fixture blobs - command: make java-packages-fingerprint - - - restore_cache: - keys: - - syft-unit-test-java-cache-{{ checksum "syft/cataloger/java/test-fixtures/java-builds/packages.fingerprint" }} - - - run: - name: run unit tests - command: make unit - - - save_cache: - key: syft-unit-test-java-cache-{{ checksum "syft/cataloger/java/test-fixtures/java-builds/packages.fingerprint" }} - paths: - - "syft/cataloger/java/test-fixtures/java-builds/packages" - - - run: - name: validate syft output against the CycloneDX schema - command: make validate-cyclonedx-schema - - - run: - name: build hash key for integration test-fixtures blobs - command: make integration-fingerprint - - - restore_cache: - keys: - - syft-integration-test-cache-{{ checksum "test/integration/test-fixtures/cache.fingerprint" }} - - run: - name: run integration tests - command: make integration - - - save_cache: - key: syft-integration-test-cache-{{ checksum "test/integration/test-fixtures/cache.fingerprint" }} - paths: - - "test/integration/test-fixtures/cache" - -workflows: - # Note: changing this workflow name requires making the same update in the .github/workflows/release.yaml pipeline - "Static Analysis + Unit + Integration": - jobs: - - run-static-analysis: - name: "Static Analysis" - version: "1.14" - - run-tests: - name: "Unit & Integration Tests (go-1.13)" - version: "1.13" - - run-tests: - name: "Unit & Integration Tests (go-latest)" - version: "latest" diff --git a/.github/workflows/static-unit-integration.yaml b/.github/workflows/static-unit-integration.yaml new file mode 100644 index 000000000..fe3b42b45 --- /dev/null +++ b/.github/workflows/static-unit-integration.yaml @@ -0,0 +1,103 @@ +name: 'Static Analysis + Unit + Integration' +on: + workflow_dispatch: + push: +jobs: + + Static-Analysis: + strategy: + matrix: + go-version: [1.x] + platform: [ubuntu-latest] + runs-on: ${{ matrix.platform }} + steps: + + - uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + + - uses: actions/checkout@v2 + + - name: Restore bootstrap cache + id: bootstrap-cache + uses: actions/cache@v2 + with: + path: | + ~/go/pkg/mod + ${{ github.workspace }}/.tmp + key: ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}-${{ hashFiles('Makefile') }} + restore-keys: | + ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}- + ${{ runner.os }}-go-${{ matrix.go-version }}- + + - name: Bootstrap project dependencies + if: steps.bootstrap-cache.outputs.cache-hit != 'true' + run: make bootstrap + + - name: Bootstrap CI dependencies + run: make ci-bootstrap + + - name: Run static analysis + run: make static-analysis + + Tests: + strategy: + matrix: + # test the lower bounds of support, and the latest available + go-version: [1.13.x, 1.x] + platform: [ubuntu-latest] + runs-on: ${{ matrix.platform }} + steps: + + - uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + + - uses: actions/checkout@v2 + + - name: Restore bootstrap cache + id: bootstrap-cache + uses: actions/cache@v2 + with: + path: | + ~/go/pkg/mod + ${{ github.workspace }}/.tmp + key: ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}-${{ hashFiles('Makefile') }} + restore-keys: | + ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}- + ${{ runner.os }}-go-${{ matrix.go-version }}- + + - name: Bootstrap project dependencies + if: steps.bootstrap-cache.outputs.cache-hit != 'true' + run: make bootstrap + + - name: Bootstrap CI dependencies + run: make ci-bootstrap + + - name: Build cache key for java test-fixture blobs (for unit tests) + run: make java-packages-fingerprint + + - name: Restore Java test-fixture cache + id: unit-java-cache + uses: actions/cache@v2 + with: + path: syft/cataloger/java/test-fixtures/java-builds/packages + key: ${{ runner.os }}-unit-java-cache-${{ hashFiles( 'syft/cataloger/java/test-fixtures/java-builds/packages.fingerprint' ) }} + + - name: Run unit tests + run: make unit + + - name: Validate syft output against the CycloneDX schema + run: make validate-cyclonedx-schema + + - name: Build key for tar cache + run: make integration-fingerprint + + - name: Restore integration test cache + uses: actions/cache@v2 + with: + path: ${{ github.workspace }}/integration/test-fixtures/cache + key: ${{ runner.os }}-integration-test-cache-${{ hashFiles('integration/test-fixtures/cache.fingerprint') }} + + - name: Run integration tests + run: make integration diff --git a/Makefile b/Makefile index 294100ca5..ade92a5e0 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(BOLD)$(CYAN)%-25s$(RESET)%s\n", $$1, $$2}' .PHONY: ci-bootstrap -ci-bootstrap: bootstrap +ci-bootstrap: DEBIAN_FRONTEND=noninteractive sudo apt update && sudo -E apt install -y bc jq libxml2-utils .PHONY: bootstrap @@ -163,16 +163,6 @@ generate-json-schema: clean-json-schema-examples integration ## Generate a new j clear-test-cache: ## Delete all test cache (built docker image tars) find . -type f -wholename "**/test-fixtures/cache/*.tar" -delete -.PHONY: check-pipeline -check-pipeline: ## Run local CircleCI pipeline locally (sanity check) - $(call title,Check pipeline) - # note: this is meant for local development & testing of the pipeline, NOT to be run in CI - mkdir -p $(TEMPDIR) - circleci config process .circleci/config.yml > .tmp/circleci.yml - circleci local execute -c .tmp/circleci.yml --job "Static Analysis" - circleci local execute -c .tmp/circleci.yml --job "Unit & Integration Tests (go-latest)" - @printf '$(SUCCESS)Pipeline checks pass!$(RESET)\n' - .PHONY: build build: $(SNAPSHOTDIR) ## Build release snapshot binaries and packages