diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 420c1ce09..8d7adfd89 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -7,10 +7,56 @@ on: branches: [main, v1] jobs: + # Identify the CodeQL tool versions to use in the analysis job. + check-codeql-versions: + runs-on: ubuntu-latest + outputs: + versions: ${{ steps.compare.outputs.versions }} + + steps: + - uses: actions/checkout@v2 + - name: Init with default CodeQL bundle from the VM image + id: init-default + uses: ./init + with: + languages: javascript + - name: Remove empty database + # allows us to run init a second time + run: | + rm -rf "$RUNNER_TEMP/codeql_databases" + - name: Init with latest CodeQL bundle + id: init-latest + uses: ./init + with: + tools: latest + languages: javascript + - name: Compare default and latest CodeQL bundle versions + id: compare + env: + CODEQL_DEFAULT: ${{ steps.init-default.outputs.codeql-path }} + CODEQL_LATEST: ${{ steps.init-latest.outputs.codeql-path }} + run: | + CODEQL_VERSION_DEFAULT="$("$CODEQL_DEFAULT" version --format terse)" + CODEQL_VERSION_LATEST="$("$CODEQL_LATEST" version --format terse)" + echo "Default CodeQL bundle version is $CODEQL_VERSION_DEFAULT" + echo "Latest CodeQL bundle version is $CODEQL_VERSION_LATEST" + if [[ "$CODEQL_VERSION_DEFAULT" == "$CODEQL_VERSION_LATEST" ]]; then + # Just use `tools: null` to avoid duplication in the analysis job. + VERSIONS_JSON='[null]' + else + # Use both `tools: null` and `tools: latest` in the analysis job. + VERSIONS_JSON='[null, "latest"]' + fi + # Output a JSON-encoded list with the distinct versions to test against. + echo "Suggested matrix config for analysis job: $VERSIONS_JSON" + echo "::set-output name=versions::${VERSIONS_JSON}" + build: + needs: [check-codeql-versions] strategy: matrix: os: [ubuntu-latest,windows-latest,macos-latest] + tools: ${{ fromJson(needs.check-codeql-versions.outputs.versions) }} runs-on: ${{ matrix.os }} steps: @@ -20,6 +66,7 @@ jobs: with: languages: javascript config-file: ./.github/codeql/codeql-config.yml + tools: ${{ matrix.tools }} # confirm steps.init.outputs.codeql-path points to the codeql binary - name: Print CodeQL Version run: ${{steps.init.outputs.codeql-path}} version --format=json diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 5716217c9..fffec2f2f 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -80,13 +80,65 @@ jobs: exit 1 fi - multi-language-repo_test-custom-queries-and-remote-config: + # Identify the CodeQL tool versions to integration test against. + check-codeql-versions: needs: [check-js, check-node-modules] + runs-on: ubuntu-latest + outputs: + versions: ${{ steps.compare.outputs.versions }} + + steps: + - uses: actions/checkout@v2 + - name: Move codeql-action + shell: bash + run: | + mkdir ../action + mv * .github ../action/ + mv ../action/tests/multi-language-repo/{*,.github} . + mv ../action/.github/workflows .github + - name: Init with default CodeQL bundle from the VM image + id: init-default + uses: ./../action/init + with: + languages: javascript + - name: Remove empty database + # allows us to run init a second time + run: | + rm -rf "$RUNNER_TEMP/codeql_databases" + - name: Init with latest CodeQL bundle + id: init-latest + uses: ./../action/init + with: + tools: latest + languages: javascript + - name: Compare default and latest CodeQL bundle versions + id: compare + env: + CODEQL_DEFAULT: ${{ steps.init-default.outputs.codeql-path }} + CODEQL_LATEST: ${{ steps.init-latest.outputs.codeql-path }} + run: | + CODEQL_VERSION_DEFAULT="$("$CODEQL_DEFAULT" version --format terse)" + CODEQL_VERSION_LATEST="$("$CODEQL_LATEST" version --format terse)" + echo "Default CodeQL bundle version is $CODEQL_VERSION_DEFAULT" + echo "Latest CodeQL bundle version is $CODEQL_VERSION_LATEST" + if [[ "$CODEQL_VERSION_DEFAULT" == "$CODEQL_VERSION_LATEST" ]]; then + # Just use `tools: null` to avoid duplication in the integration tests. + VERSIONS_JSON='[null]' + else + # Use both `tools: null` and `tools: latest` in the integration tests. + VERSIONS_JSON='[null, "latest"]' + fi + # Output a JSON-encoded list with the distinct versions to test against. + echo "Suggested matrix config for integration tests: $VERSIONS_JSON" + echo "::set-output name=versions::${VERSIONS_JSON}" + + multi-language-repo_test-custom-queries-and-remote-config: + needs: [check-js, check-node-modules, check-codeql-versions] strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - tools: [~, latest] + tools: ${{ fromJson(needs.check-codeql-versions.outputs.versions) }} runs-on: ${{ matrix.os }} steps: @@ -112,11 +164,12 @@ jobs: # Currently is not possible to analyze Go in conjunction with other languages in macos multi-language-repo_test-go-custom-queries: - needs: [check-js, check-node-modules] + needs: [check-js, check-node-modules, check-codeql-versions] strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] + tools: ${{ fromJson(needs.check-codeql-versions.outputs.versions) }} runs-on: ${{ matrix.os }} steps: @@ -136,6 +189,7 @@ jobs: with: languages: go config-file: ./.github/codeql/custom-queries.yml + tools: ${{ matrix.tools }} - name: Build code shell: bash run: ./build.sh @@ -144,11 +198,12 @@ jobs: TEST_MODE: true go-custom-tracing: - needs: [check-js, check-node-modules] + needs: [check-js, check-node-modules, check-codeql-versions] strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] + tools: ${{ fromJson(needs.check-codeql-versions.outputs.versions) }} runs-on: ${{ matrix.os }} env: CODEQL_EXTRACTOR_GO_BUILD_TRACING: "on" @@ -169,6 +224,7 @@ jobs: - uses: ./../action/init with: languages: go + tools: ${{ matrix.tools }} - name: Build code shell: bash run: go build main.go @@ -177,7 +233,11 @@ jobs: TEST_MODE: true go-custom-tracing-autobuild: - needs: [check-js, check-node-modules] + needs: [check-js, check-node-modules, check-codeql-versions] + strategy: + fail-fast: false + matrix: + tools: ${{ fromJson(needs.check-codeql-versions.outputs.versions) }} # No need to test Go autobuild on multiple OSes since # we're testing Go custom tracing with a manual build on all OSes. runs-on: ubuntu-latest @@ -196,6 +256,7 @@ jobs: - uses: ./../action/init with: languages: go + tools: ${{ matrix.tools }} - uses: ./../action/autobuild - uses: ./../action/analyze env: @@ -235,7 +296,11 @@ jobs: TEST_MODE: true test-proxy: - needs: [check-js, check-node-modules] + needs: [check-js, check-node-modules, check-codeql-versions] + strategy: + fail-fast: false + matrix: + tools: ${{ fromJson(needs.check-codeql-versions.outputs.versions) }} runs-on: ubuntu-latest container: image: ubuntu:18.04 @@ -259,6 +324,7 @@ jobs: - uses: ./../action/init with: languages: javascript + tools: ${{ matrix.tools }} - uses: ./../action/analyze env: TEST_MODE: true