mirror of
https://github.com/github/codeql-action.git
synced 2025-12-18 13:29:25 +08:00
Compare commits
71 Commits
default-se
...
v3.31.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f47c8e6a9b | ||
|
|
74951318a2 | ||
|
|
5676d1f64a | ||
|
|
c1bea80e56 | ||
|
|
2d9c0b97af | ||
|
|
827017f97b | ||
|
|
bffd034ab1 | ||
|
|
817dbfb39b | ||
|
|
793f7006bb | ||
|
|
d2e9832330 | ||
|
|
c2e4b7785f | ||
|
|
66d7f51a10 | ||
|
|
497990dfed | ||
|
|
89cb79a131 | ||
|
|
dbf6819ebd | ||
|
|
5af51f4048 | ||
|
|
e439418aab | ||
|
|
249860e323 | ||
|
|
d3ced5c96c | ||
|
|
c12d7c1f2d | ||
|
|
2e2a1cf1ef | ||
|
|
e2cca77d06 | ||
|
|
801a18bea6 | ||
|
|
1c715a714c | ||
|
|
c3d42c5d08 | ||
|
|
9031cd9330 | ||
|
|
f58938aee2 | ||
|
|
1f1c162805 | ||
|
|
7ab96a0e6f | ||
|
|
e3cb86275a | ||
|
|
f94c9befff | ||
|
|
e5971bdba6 | ||
|
|
c5a9d29dc9 | ||
|
|
9f1109665d | ||
|
|
f8f60f3a2b | ||
|
|
f4d10b9ef7 | ||
|
|
5d5cd550d3 | ||
|
|
c6eb09db21 | ||
|
|
09db9044dc | ||
|
|
d3cd47d8d6 | ||
|
|
8e9caa5100 | ||
|
|
23a6333b88 | ||
|
|
c503cb4fbb | ||
|
|
c2805e0a04 | ||
|
|
c0d3370b54 | ||
|
|
ddd0dc746a | ||
|
|
2f607936ce | ||
|
|
37e7dfbaa0 | ||
|
|
d198d2fabf | ||
|
|
9e3918e481 | ||
|
|
7dd1575dac | ||
|
|
28fc48d83c | ||
|
|
12c6008004 | ||
|
|
d3019effb0 | ||
|
|
42213152a8 | ||
|
|
e677e67801 | ||
|
|
5f3f3164ad | ||
|
|
ba42101490 | ||
|
|
f11af5849b | ||
|
|
ba5430dc86 | ||
|
|
13e883e119 | ||
|
|
755f44910c | ||
|
|
948223fe01 | ||
|
|
a37add20d4 | ||
|
|
ab163cf08b | ||
|
|
319796f085 | ||
|
|
bd1ac56295 | ||
|
|
a8d1ac45b9 | ||
|
|
c551c50310 | ||
|
|
01f1a24033 | ||
|
|
b264e15259 |
2
.github/actions/check-sarif/action.yml
vendored
2
.github/actions/check-sarif/action.yml
vendored
@@ -16,5 +16,5 @@ inputs:
|
|||||||
Comma separated list of query ids that should NOT be included in this SARIF file.
|
Comma separated list of query ids that should NOT be included in this SARIF file.
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: index.js
|
main: index.js
|
||||||
|
|||||||
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -34,7 +34,7 @@ Products:
|
|||||||
|
|
||||||
Environments:
|
Environments:
|
||||||
|
|
||||||
- **Dotcom** - Impacts CodeQL workflows on `github.com` and/or GitHub Enterprise Cloud with Data Residency.
|
- **Dotcom** - Impacts CodeQL workflows on `github.com`.
|
||||||
- **GHES** - Impacts CodeQL workflows on GitHub Enterprise Server.
|
- **GHES** - Impacts CodeQL workflows on GitHub Enterprise Server.
|
||||||
- **Testing/None** - This change does not impact any CodeQL workflows in production.
|
- **Testing/None** - This change does not impact any CodeQL workflows in production.
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/__bundle-zstd.yml
generated
vendored
2
.github/workflows/__bundle-zstd.yml
generated
vendored
@@ -79,7 +79,7 @@ jobs:
|
|||||||
output: ${{ runner.temp }}/results
|
output: ${{ runner.temp }}/results
|
||||||
upload-database: false
|
upload-database: false
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.os }}-zstd-bundle.sarif
|
name: ${{ matrix.os }}-zstd-bundle.sarif
|
||||||
path: ${{ runner.temp }}/results/javascript.sarif
|
path: ${{ runner.temp }}/results/javascript.sarif
|
||||||
|
|||||||
2
.github/workflows/__config-export.yml
generated
vendored
2
.github/workflows/__config-export.yml
generated
vendored
@@ -67,7 +67,7 @@ jobs:
|
|||||||
output: ${{ runner.temp }}/results
|
output: ${{ runner.temp }}/results
|
||||||
upload-database: false
|
upload-database: false
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: config-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: config-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: ${{ runner.temp }}/results/javascript.sarif
|
path: ${{ runner.temp }}/results/javascript.sarif
|
||||||
|
|||||||
2
.github/workflows/__diagnostics-export.yml
generated
vendored
2
.github/workflows/__diagnostics-export.yml
generated
vendored
@@ -78,7 +78,7 @@ jobs:
|
|||||||
output: ${{ runner.temp }}/results
|
output: ${{ runner.temp }}/results
|
||||||
upload-database: false
|
upload-database: false
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: diagnostics-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: diagnostics-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: ${{ runner.temp }}/results/javascript.sarif
|
path: ${{ runner.temp }}/results/javascript.sarif
|
||||||
|
|||||||
2
.github/workflows/__export-file-baseline-information.yml
generated
vendored
2
.github/workflows/__export-file-baseline-information.yml
generated
vendored
@@ -99,7 +99,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
output: ${{ runner.temp }}/results
|
output: ${{ runner.temp }}/results
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: with-baseline-information-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: with-baseline-information-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: ${{ runner.temp }}/results/javascript.sarif
|
path: ${{ runner.temp }}/results/javascript.sarif
|
||||||
|
|||||||
2
.github/workflows/__job-run-uuid-sarif.yml
generated
vendored
2
.github/workflows/__job-run-uuid-sarif.yml
generated
vendored
@@ -64,7 +64,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
output: ${{ runner.temp }}/results
|
output: ${{ runner.temp }}/results
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: ${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: ${{ runner.temp }}/results/javascript.sarif
|
path: ${{ runner.temp }}/results/javascript.sarif
|
||||||
|
|||||||
6
.github/workflows/__quality-queries.yml
generated
vendored
6
.github/workflows/__quality-queries.yml
generated
vendored
@@ -83,7 +83,7 @@ jobs:
|
|||||||
post-processed-sarif-path: ${{ runner.temp }}/post-processed
|
post-processed-sarif-path: ${{ runner.temp }}/post-processed
|
||||||
- name: Upload security SARIF
|
- name: Upload security SARIF
|
||||||
if: contains(matrix.analysis-kinds, 'code-scanning')
|
if: contains(matrix.analysis-kinds, 'code-scanning')
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: |
|
name: |
|
||||||
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
||||||
@@ -91,14 +91,14 @@ jobs:
|
|||||||
retention-days: 7
|
retention-days: 7
|
||||||
- name: Upload quality SARIF
|
- name: Upload quality SARIF
|
||||||
if: contains(matrix.analysis-kinds, 'code-quality')
|
if: contains(matrix.analysis-kinds, 'code-quality')
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: |
|
name: |
|
||||||
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.quality.sarif.json
|
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.quality.sarif.json
|
||||||
path: ${{ runner.temp }}/results/javascript.quality.sarif
|
path: ${{ runner.temp }}/results/javascript.quality.sarif
|
||||||
retention-days: 7
|
retention-days: 7
|
||||||
- name: Upload post-processed SARIF
|
- name: Upload post-processed SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: |
|
name: |
|
||||||
post-processed-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
post-processed-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
||||||
|
|||||||
2
.github/workflows/__rubocop-multi-language.yml
generated
vendored
2
.github/workflows/__rubocop-multi-language.yml
generated
vendored
@@ -56,7 +56,7 @@ jobs:
|
|||||||
use-all-platform-bundle: 'false'
|
use-all-platform-bundle: 'false'
|
||||||
setup-kotlin: 'true'
|
setup-kotlin: 'true'
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@ac793fdd38cc468a4dd57246fa9d0e868aba9085 # v1.270.0
|
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
|
||||||
with:
|
with:
|
||||||
ruby-version: 2.6
|
ruby-version: 2.6
|
||||||
- name: Install Code Scanning integration
|
- name: Install Code Scanning integration
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v7
|
uses: actions/download-artifact@v6
|
||||||
- name: Check expected artifacts exist
|
- name: Check expected artifacts exist
|
||||||
run: |
|
run: |
|
||||||
LANGUAGES="cpp csharp go java javascript python"
|
LANGUAGES="cpp csharp go java javascript python"
|
||||||
|
|||||||
2
.github/workflows/debug-artifacts-safe.yml
vendored
2
.github/workflows/debug-artifacts-safe.yml
vendored
@@ -77,7 +77,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v7
|
uses: actions/download-artifact@v6
|
||||||
- name: Check expected artifacts exist
|
- name: Check expected artifacts exist
|
||||||
run: |
|
run: |
|
||||||
VERSIONS="stable-v2.20.3 default linked nightly-latest"
|
VERSIONS="stable-v2.20.3 default linked nightly-latest"
|
||||||
|
|||||||
2
.github/workflows/post-release-mergeback.yml
vendored
2
.github/workflows/post-release-mergeback.yml
vendored
@@ -142,7 +142,7 @@ jobs:
|
|||||||
token: "${{ secrets.GITHUB_TOKEN }}"
|
token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
|
||||||
- name: Generate token
|
- name: Generate token
|
||||||
uses: actions/create-github-app-token@v2.2.1
|
uses: actions/create-github-app-token@v2.2.0
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.AUTOMATION_APP_ID }}
|
app-id: ${{ vars.AUTOMATION_APP_ID }}
|
||||||
|
|||||||
2
.github/workflows/rollback-release.yml
vendored
2
.github/workflows/rollback-release.yml
vendored
@@ -137,7 +137,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Generate token
|
- name: Generate token
|
||||||
if: github.event_name == 'workflow_dispatch'
|
if: github.event_name == 'workflow_dispatch'
|
||||||
uses: actions/create-github-app-token@v2.2.1
|
uses: actions/create-github-app-token@v2.2.0
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.AUTOMATION_APP_ID }}
|
app-id: ${{ vars.AUTOMATION_APP_ID }}
|
||||||
|
|||||||
2
.github/workflows/update-release-branch.yml
vendored
2
.github/workflows/update-release-branch.yml
vendored
@@ -93,7 +93,7 @@ jobs:
|
|||||||
pull-requests: write # needed to create pull request
|
pull-requests: write # needed to create pull request
|
||||||
steps:
|
steps:
|
||||||
- name: Generate token
|
- name: Generate token
|
||||||
uses: actions/create-github-app-token@v2.2.1
|
uses: actions/create-github-app-token@v2.2.0
|
||||||
id: app-token
|
id: app-token
|
||||||
with:
|
with:
|
||||||
app-id: ${{ vars.AUTOMATION_APP_ID }}
|
app-id: ${{ vars.AUTOMATION_APP_ID }}
|
||||||
|
|||||||
41
CHANGELOG.md
41
CHANGELOG.md
@@ -2,64 +2,56 @@
|
|||||||
|
|
||||||
See the [releases page](https://github.com/github/codeql-action/releases) for the relevant changes to the CodeQL CLI and language packs.
|
See the [releases page](https://github.com/github/codeql-action/releases) for the relevant changes to the CodeQL CLI and language packs.
|
||||||
|
|
||||||
## [UNRELEASED]
|
## 3.31.8 - 11 Dec 2025
|
||||||
|
|
||||||
No user facing changes.
|
|
||||||
|
|
||||||
## 4.31.9 - 16 Dec 2025
|
|
||||||
|
|
||||||
No user facing changes.
|
|
||||||
|
|
||||||
## 4.31.8 - 11 Dec 2025
|
|
||||||
|
|
||||||
- Update default CodeQL bundle version to 2.23.8. [#3354](https://github.com/github/codeql-action/pull/3354)
|
- Update default CodeQL bundle version to 2.23.8. [#3354](https://github.com/github/codeql-action/pull/3354)
|
||||||
|
|
||||||
## 4.31.7 - 05 Dec 2025
|
## 3.31.7 - 05 Dec 2025
|
||||||
|
|
||||||
- Update default CodeQL bundle version to 2.23.7. [#3343](https://github.com/github/codeql-action/pull/3343)
|
- Update default CodeQL bundle version to 2.23.7. [#3343](https://github.com/github/codeql-action/pull/3343)
|
||||||
|
|
||||||
## 4.31.6 - 01 Dec 2025
|
## 3.31.6 - 01 Dec 2025
|
||||||
|
|
||||||
No user facing changes.
|
No user facing changes.
|
||||||
|
|
||||||
## 4.31.5 - 24 Nov 2025
|
## 3.31.5 - 24 Nov 2025
|
||||||
|
|
||||||
- Update default CodeQL bundle version to 2.23.6. [#3321](https://github.com/github/codeql-action/pull/3321)
|
- Update default CodeQL bundle version to 2.23.6. [#3321](https://github.com/github/codeql-action/pull/3321)
|
||||||
|
|
||||||
## 4.31.4 - 18 Nov 2025
|
## 3.31.4 - 18 Nov 2025
|
||||||
|
|
||||||
No user facing changes.
|
No user facing changes.
|
||||||
|
|
||||||
## 4.31.3 - 13 Nov 2025
|
## 3.31.3 - 13 Nov 2025
|
||||||
|
|
||||||
- CodeQL Action v3 will be deprecated in December 2026. The Action now logs a warning for customers who are running v3 but could be running v4. For more information, see [Upcoming deprecation of CodeQL Action v3](https://github.blog/changelog/2025-10-28-upcoming-deprecation-of-codeql-action-v3/).
|
- CodeQL Action v3 will be deprecated in December 2026. The Action now logs a warning for customers who are running v3 but could be running v4. For more information, see [Upcoming deprecation of CodeQL Action v3](https://github.blog/changelog/2025-10-28-upcoming-deprecation-of-codeql-action-v3/).
|
||||||
- Update default CodeQL bundle version to 2.23.5. [#3288](https://github.com/github/codeql-action/pull/3288)
|
- Update default CodeQL bundle version to 2.23.5. [#3288](https://github.com/github/codeql-action/pull/3288)
|
||||||
|
|
||||||
## 4.31.2 - 30 Oct 2025
|
## 3.31.2 - 30 Oct 2025
|
||||||
|
|
||||||
No user facing changes.
|
No user facing changes.
|
||||||
|
|
||||||
## 4.31.1 - 30 Oct 2025
|
## 3.31.1 - 30 Oct 2025
|
||||||
|
|
||||||
- The `add-snippets` input has been removed from the `analyze` action. This input has been deprecated since CodeQL Action 3.26.4 in August 2024 when this removal was announced.
|
- The `add-snippets` input has been removed from the `analyze` action. This input has been deprecated since CodeQL Action 3.26.4 in August 2024 when this removal was announced.
|
||||||
|
|
||||||
## 4.31.0 - 24 Oct 2025
|
## 3.31.0 - 24 Oct 2025
|
||||||
|
|
||||||
- Bump minimum CodeQL bundle version to 2.17.6. [#3223](https://github.com/github/codeql-action/pull/3223)
|
- Bump minimum CodeQL bundle version to 2.17.6. [#3223](https://github.com/github/codeql-action/pull/3223)
|
||||||
- When SARIF files are uploaded by the `analyze` or `upload-sarif` actions, the CodeQL Action automatically performs post-processing steps to prepare the data for the upload. Previously, these post-processing steps were only performed before an upload took place. We are now changing this so that the post-processing steps will always be performed, even when the SARIF files are not uploaded. This does not change anything for the `upload-sarif` action. For `analyze`, this may affect Advanced Setup for CodeQL users who specify a value other than `always` for the `upload` input. [#3222](https://github.com/github/codeql-action/pull/3222)
|
- When SARIF files are uploaded by the `analyze` or `upload-sarif` actions, the CodeQL Action automatically performs post-processing steps to prepare the data for the upload. Previously, these post-processing steps were only performed before an upload took place. We are now changing this so that the post-processing steps will always be performed, even when the SARIF files are not uploaded. This does not change anything for the `upload-sarif` action. For `analyze`, this may affect Advanced Setup for CodeQL users who specify a value other than `always` for the `upload` input. [#3222](https://github.com/github/codeql-action/pull/3222)
|
||||||
|
|
||||||
## 4.30.9 - 17 Oct 2025
|
## 3.30.9 - 17 Oct 2025
|
||||||
|
|
||||||
- Update default CodeQL bundle version to 2.23.3. [#3205](https://github.com/github/codeql-action/pull/3205)
|
- Update default CodeQL bundle version to 2.23.3. [#3205](https://github.com/github/codeql-action/pull/3205)
|
||||||
- Experimental: A new `setup-codeql` action has been added which is similar to `init`, except it only installs the CodeQL CLI and does not initialize a database. Do not use this in production as it is part of an internal experiment and subject to change at any time. [#3204](https://github.com/github/codeql-action/pull/3204)
|
- Experimental: A new `setup-codeql` action has been added which is similar to `init`, except it only installs the CodeQL CLI and does not initialize a database. Do not use this in production as it is part of an internal experiment and subject to change at any time. [#3204](https://github.com/github/codeql-action/pull/3204)
|
||||||
|
|
||||||
## 4.30.8 - 10 Oct 2025
|
## 3.30.8 - 10 Oct 2025
|
||||||
|
|
||||||
No user facing changes.
|
No user facing changes.
|
||||||
|
|
||||||
## 4.30.7 - 06 Oct 2025
|
## 3.30.7 - 06 Oct 2025
|
||||||
|
|
||||||
- [v4+ only] The CodeQL Action now runs on Node.js v24. [#3169](https://github.com/github/codeql-action/pull/3169)
|
No user facing changes.
|
||||||
|
|
||||||
## 3.30.6 - 02 Oct 2025
|
## 3.30.6 - 02 Oct 2025
|
||||||
|
|
||||||
@@ -295,17 +287,13 @@ No user facing changes.
|
|||||||
## 3.26.12 - 07 Oct 2024
|
## 3.26.12 - 07 Oct 2024
|
||||||
|
|
||||||
- _Upcoming breaking change_: Add a deprecation warning for customers using CodeQL version 2.14.5 and earlier. These versions of CodeQL were discontinued on 24 September 2024 alongside GitHub Enterprise Server 3.10, and will be unsupported by CodeQL Action versions 3.27.0 and later and versions 2.27.0 and later. [#2520](https://github.com/github/codeql-action/pull/2520)
|
- _Upcoming breaking change_: Add a deprecation warning for customers using CodeQL version 2.14.5 and earlier. These versions of CodeQL were discontinued on 24 September 2024 alongside GitHub Enterprise Server 3.10, and will be unsupported by CodeQL Action versions 3.27.0 and later and versions 2.27.0 and later. [#2520](https://github.com/github/codeql-action/pull/2520)
|
||||||
|
|
||||||
- If you are using one of these versions, please update to CodeQL CLI version 2.14.6 or later. For instance, if you have specified a custom version of the CLI using the 'tools' input to the 'init' Action, you can remove this input to use the default version.
|
- If you are using one of these versions, please update to CodeQL CLI version 2.14.6 or later. For instance, if you have specified a custom version of the CLI using the 'tools' input to the 'init' Action, you can remove this input to use the default version.
|
||||||
|
|
||||||
- Alternatively, if you want to continue using a version of the CodeQL CLI between 2.13.5 and 2.14.5, you can replace `github/codeql-action/*@v3` by `github/codeql-action/*@v3.26.11` and `github/codeql-action/*@v2` by `github/codeql-action/*@v2.26.11` in your code scanning workflow to ensure you continue using this version of the CodeQL Action.
|
- Alternatively, if you want to continue using a version of the CodeQL CLI between 2.13.5 and 2.14.5, you can replace `github/codeql-action/*@v3` by `github/codeql-action/*@v3.26.11` and `github/codeql-action/*@v2` by `github/codeql-action/*@v2.26.11` in your code scanning workflow to ensure you continue using this version of the CodeQL Action.
|
||||||
|
|
||||||
## 3.26.11 - 03 Oct 2024
|
## 3.26.11 - 03 Oct 2024
|
||||||
|
|
||||||
- _Upcoming breaking change_: Add support for using `actions/download-artifact@v4` to programmatically consume CodeQL Action debug artifacts.
|
- _Upcoming breaking change_: Add support for using `actions/download-artifact@v4` to programmatically consume CodeQL Action debug artifacts.
|
||||||
|
|
||||||
Starting November 30, 2024, GitHub.com customers will [no longer be able to use `actions/download-artifact@v3`](https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/). Therefore, to avoid breakage, customers who programmatically download the CodeQL Action debug artifacts should set the `CODEQL_ACTION_ARTIFACT_V4_UPGRADE` environment variable to `true` and bump `actions/download-artifact@v3` to `actions/download-artifact@v4` in their workflows. The CodeQL Action will enable this behavior by default in early November and workflows that have not yet bumped `actions/download-artifact@v3` to `actions/download-artifact@v4` will begin failing then.
|
Starting November 30, 2024, GitHub.com customers will [no longer be able to use `actions/download-artifact@v3`](https://github.blog/changelog/2024-04-16-deprecation-notice-v3-of-the-artifact-actions/). Therefore, to avoid breakage, customers who programmatically download the CodeQL Action debug artifacts should set the `CODEQL_ACTION_ARTIFACT_V4_UPGRADE` environment variable to `true` and bump `actions/download-artifact@v3` to `actions/download-artifact@v4` in their workflows. The CodeQL Action will enable this behavior by default in early November and workflows that have not yet bumped `actions/download-artifact@v3` to `actions/download-artifact@v4` will begin failing then.
|
||||||
|
|
||||||
This change is currently unavailable for GitHub Enterprise Server customers, as `actions/upload-artifact@v4` and `actions/download-artifact@v4` are not yet compatible with GHES.
|
This change is currently unavailable for GitHub Enterprise Server customers, as `actions/upload-artifact@v4` and `actions/download-artifact@v4` are not yet compatible with GHES.
|
||||||
- Update default CodeQL bundle version to 2.19.1. [#2519](https://github.com/github/codeql-action/pull/2519)
|
- Update default CodeQL bundle version to 2.19.1. [#2519](https://github.com/github/codeql-action/pull/2519)
|
||||||
|
|
||||||
@@ -428,12 +416,9 @@ No user facing changes.
|
|||||||
## 3.25.0 - 15 Apr 2024
|
## 3.25.0 - 15 Apr 2024
|
||||||
|
|
||||||
- The deprecated feature for extracting dependencies for a Python analysis has been removed. [#2224](https://github.com/github/codeql-action/pull/2224)
|
- The deprecated feature for extracting dependencies for a Python analysis has been removed. [#2224](https://github.com/github/codeql-action/pull/2224)
|
||||||
|
|
||||||
As a result, the following inputs and environment variables are now ignored:
|
As a result, the following inputs and environment variables are now ignored:
|
||||||
|
|
||||||
- The `setup-python-dependencies` input to the `init` Action
|
- The `setup-python-dependencies` input to the `init` Action
|
||||||
- The `CODEQL_ACTION_DISABLE_PYTHON_DEPENDENCY_INSTALLATION` environment variable
|
- The `CODEQL_ACTION_DISABLE_PYTHON_DEPENDENCY_INSTALLATION` environment variable
|
||||||
|
|
||||||
We recommend removing any references to these from your workflows. For more information, see the release notes for CodeQL Action v3.23.0 and v2.23.0.
|
We recommend removing any references to these from your workflows. For more information, see the release notes for CodeQL Action v3.23.0 and v2.23.0.
|
||||||
- Automatically overwrite an existing database if found on the filesystem. [#2229](https://github.com/github/codeql-action/pull/2229)
|
- Automatically overwrite an existing database if found on the filesystem. [#2229](https://github.com/github/codeql-action/pull/2229)
|
||||||
- Bump the minimum CodeQL bundle version to 2.12.6. [#2232](https://github.com/github/codeql-action/pull/2232)
|
- Bump the minimum CodeQL bundle version to 2.12.6. [#2232](https://github.com/github/codeql-action/pull/2232)
|
||||||
|
|||||||
@@ -94,6 +94,6 @@ outputs:
|
|||||||
sarif-id:
|
sarif-id:
|
||||||
description: The ID of the uploaded SARIF file.
|
description: The ID of the uploaded SARIF file.
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: "../lib/analyze-action.js"
|
main: "../lib/analyze-action.js"
|
||||||
post: "../lib/analyze-action-post.js"
|
post: "../lib/analyze-action-post.js"
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ inputs:
|
|||||||
$GITHUB_WORKSPACE as its working directory.
|
$GITHUB_WORKSPACE as its working directory.
|
||||||
required: false
|
required: false
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: '../lib/autobuild-action.js'
|
main: '../lib/autobuild-action.js'
|
||||||
|
|||||||
@@ -165,6 +165,6 @@ outputs:
|
|||||||
codeql-version:
|
codeql-version:
|
||||||
description: The version of the CodeQL binary used for analysis
|
description: The version of the CodeQL binary used for analysis
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: '../lib/init-action.js'
|
main: '../lib/init-action.js'
|
||||||
post: '../lib/init-action-post.js'
|
post: '../lib/init-action-post.js'
|
||||||
|
|||||||
42388
lib/analyze-action-post.js
generated
42388
lib/analyze-action-post.js
generated
File diff suppressed because it is too large
Load Diff
37099
lib/analyze-action.js
generated
37099
lib/analyze-action.js
generated
File diff suppressed because it is too large
Load Diff
35831
lib/autobuild-action.js
generated
35831
lib/autobuild-action.js
generated
File diff suppressed because it is too large
Load Diff
42425
lib/init-action-post.js
generated
42425
lib/init-action-post.js
generated
File diff suppressed because it is too large
Load Diff
36956
lib/init-action.js
generated
36956
lib/init-action.js
generated
File diff suppressed because it is too large
Load Diff
35820
lib/resolve-environment-action.js
generated
35820
lib/resolve-environment-action.js
generated
File diff suppressed because it is too large
Load Diff
35839
lib/setup-codeql-action.js
generated
35839
lib/setup-codeql-action.js
generated
File diff suppressed because it is too large
Load Diff
42394
lib/start-proxy-action-post.js
generated
42394
lib/start-proxy-action-post.js
generated
File diff suppressed because it is too large
Load Diff
36210
lib/start-proxy-action.js
generated
36210
lib/start-proxy-action.js
generated
File diff suppressed because it is too large
Load Diff
35842
lib/upload-lib.js
generated
35842
lib/upload-lib.js
generated
File diff suppressed because it is too large
Load Diff
42300
lib/upload-sarif-action-post.js
generated
42300
lib/upload-sarif-action-post.js
generated
File diff suppressed because it is too large
Load Diff
35861
lib/upload-sarif-action.js
generated
35861
lib/upload-sarif-action.js
generated
File diff suppressed because it is too large
Load Diff
1218
package-lock.json
generated
1218
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
22
package.json
22
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "codeql",
|
"name": "codeql",
|
||||||
"version": "4.31.10",
|
"version": "3.31.8",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "CodeQL action",
|
"description": "CodeQL action",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -24,12 +24,12 @@
|
|||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/artifact": "^5.0.1",
|
"@actions/artifact": "^4.0.0",
|
||||||
"@actions/artifact-legacy": "npm:@actions/artifact@^1.1.2",
|
"@actions/artifact-legacy": "npm:@actions/artifact@^1.1.2",
|
||||||
"@actions/cache": "^5.0.1",
|
"@actions/cache": "^4.1.0",
|
||||||
"@actions/core": "^2.0.1",
|
"@actions/core": "^1.11.1",
|
||||||
"@actions/exec": "^2.0.0",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/github": "^6.0.1",
|
"@actions/github": "^6.0.0",
|
||||||
"@actions/glob": "^0.5.0",
|
"@actions/glob": "^0.5.0",
|
||||||
"@actions/http-client": "^3.0.0",
|
"@actions/http-client": "^3.0.0",
|
||||||
"@actions/io": "^2.0.0",
|
"@actions/io": "^2.0.0",
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
"js-yaml": "^4.1.1",
|
"js-yaml": "^4.1.1",
|
||||||
"jsonschema": "1.4.1",
|
"jsonschema": "1.4.1",
|
||||||
"long": "^5.3.2",
|
"long": "^5.3.2",
|
||||||
"node-forge": "^1.3.3",
|
"node-forge": "^1.3.2",
|
||||||
"semver": "^7.7.3",
|
"semver": "^7.7.3",
|
||||||
"uuid": "^13.0.0"
|
"uuid": "^13.0.0"
|
||||||
},
|
},
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
"@ava/typescript": "6.0.0",
|
"@ava/typescript": "6.0.0",
|
||||||
"@eslint/compat": "^2.0.0",
|
"@eslint/compat": "^2.0.0",
|
||||||
"@eslint/eslintrc": "^3.3.3",
|
"@eslint/eslintrc": "^3.3.3",
|
||||||
"@eslint/js": "^9.39.2",
|
"@eslint/js": "^9.39.1",
|
||||||
"@microsoft/eslint-formatter-sarif": "^3.1.0",
|
"@microsoft/eslint-formatter-sarif": "^3.1.0",
|
||||||
"@octokit/types": "^16.0.0",
|
"@octokit/types": "^16.0.0",
|
||||||
"@types/archiver": "^7.0.0",
|
"@types/archiver": "^7.0.0",
|
||||||
@@ -61,16 +61,16 @@
|
|||||||
"@types/node-forge": "^1.3.14",
|
"@types/node-forge": "^1.3.14",
|
||||||
"@types/semver": "^7.7.1",
|
"@types/semver": "^7.7.1",
|
||||||
"@types/sinon": "^21.0.0",
|
"@types/sinon": "^21.0.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.49.0",
|
"@typescript-eslint/eslint-plugin": "^8.48.0",
|
||||||
"@typescript-eslint/parser": "^8.48.0",
|
"@typescript-eslint/parser": "^8.48.0",
|
||||||
"ava": "^6.4.1",
|
"ava": "^6.4.1",
|
||||||
"esbuild": "^0.27.1",
|
"esbuild": "^0.27.0",
|
||||||
"eslint": "^8.57.1",
|
"eslint": "^8.57.1",
|
||||||
"eslint-import-resolver-typescript": "^3.8.7",
|
"eslint-import-resolver-typescript": "^3.8.7",
|
||||||
"eslint-plugin-filenames": "^1.3.2",
|
"eslint-plugin-filenames": "^1.3.2",
|
||||||
"eslint-plugin-github": "^5.1.8",
|
"eslint-plugin-github": "^5.1.8",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"eslint-plugin-jsdoc": "^61.5.0",
|
"eslint-plugin-jsdoc": "^61.4.1",
|
||||||
"eslint-plugin-no-async-foreach": "^0.1.1",
|
"eslint-plugin-no-async-foreach": "^0.1.1",
|
||||||
"glob": "^11.1.0",
|
"glob": "^11.1.0",
|
||||||
"nock": "^14.0.10",
|
"nock": "^14.0.10",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ steps:
|
|||||||
output: ${{ runner.temp }}/results
|
output: ${{ runner.temp }}/results
|
||||||
upload-database: false
|
upload-database: false
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.os }}-zstd-bundle.sarif
|
name: ${{ matrix.os }}-zstd-bundle.sarif
|
||||||
path: ${{ runner.temp }}/results/javascript.sarif
|
path: ${{ runner.temp }}/results/javascript.sarif
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ steps:
|
|||||||
output: "${{ runner.temp }}/results"
|
output: "${{ runner.temp }}/results"
|
||||||
upload-database: false
|
upload-database: false
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: config-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: config-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: "${{ runner.temp }}/results/javascript.sarif"
|
path: "${{ runner.temp }}/results/javascript.sarif"
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ steps:
|
|||||||
output: "${{ runner.temp }}/results"
|
output: "${{ runner.temp }}/results"
|
||||||
upload-database: false
|
upload-database: false
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: diagnostics-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: diagnostics-export-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: "${{ runner.temp }}/results/javascript.sarif"
|
path: "${{ runner.temp }}/results/javascript.sarif"
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ steps:
|
|||||||
with:
|
with:
|
||||||
output: "${{ runner.temp }}/results"
|
output: "${{ runner.temp }}/results"
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: with-baseline-information-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: with-baseline-information-${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: "${{ runner.temp }}/results/javascript.sarif"
|
path: "${{ runner.temp }}/results/javascript.sarif"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ steps:
|
|||||||
with:
|
with:
|
||||||
output: "${{ runner.temp }}/results"
|
output: "${{ runner.temp }}/results"
|
||||||
- name: Upload SARIF
|
- name: Upload SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
name: ${{ matrix.os }}-${{ matrix.version }}.sarif.json
|
||||||
path: "${{ runner.temp }}/results/javascript.sarif"
|
path: "${{ runner.temp }}/results/javascript.sarif"
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ steps:
|
|||||||
post-processed-sarif-path: "${{ runner.temp }}/post-processed"
|
post-processed-sarif-path: "${{ runner.temp }}/post-processed"
|
||||||
- name: Upload security SARIF
|
- name: Upload security SARIF
|
||||||
if: contains(matrix.analysis-kinds, 'code-scanning')
|
if: contains(matrix.analysis-kinds, 'code-scanning')
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: |
|
name: |
|
||||||
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
||||||
@@ -47,14 +47,14 @@ steps:
|
|||||||
retention-days: 7
|
retention-days: 7
|
||||||
- name: Upload quality SARIF
|
- name: Upload quality SARIF
|
||||||
if: contains(matrix.analysis-kinds, 'code-quality')
|
if: contains(matrix.analysis-kinds, 'code-quality')
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: |
|
name: |
|
||||||
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.quality.sarif.json
|
quality-queries-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.quality.sarif.json
|
||||||
path: "${{ runner.temp }}/results/javascript.quality.sarif"
|
path: "${{ runner.temp }}/results/javascript.quality.sarif"
|
||||||
retention-days: 7
|
retention-days: 7
|
||||||
- name: Upload post-processed SARIF
|
- name: Upload post-processed SARIF
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: |
|
name: |
|
||||||
post-processed-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
post-processed-${{ matrix.os }}-${{ matrix.version }}-${{ matrix.analysis-kinds }}.sarif.json
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ description: "Tests using RuboCop to analyze a multi-language repository and the
|
|||||||
versions: ["default"]
|
versions: ["default"]
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@ac793fdd38cc468a4dd57246fa9d0e868aba9085 # v1.270.0
|
uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0
|
||||||
with:
|
with:
|
||||||
ruby-version: 2.6
|
ruby-version: 2.6
|
||||||
- name: Install Code Scanning integration
|
- name: Install Code Scanning integration
|
||||||
|
|||||||
@@ -21,5 +21,5 @@ outputs:
|
|||||||
environment:
|
environment:
|
||||||
description: The inferred build environment configuration.
|
description: The inferred build environment configuration.
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: '../lib/resolve-environment-action.js'
|
main: '../lib/resolve-environment-action.js'
|
||||||
|
|||||||
@@ -35,5 +35,5 @@ outputs:
|
|||||||
codeql-version:
|
codeql-version:
|
||||||
description: The version of the CodeQL binary that was installed.
|
description: The version of the CodeQL binary that was installed.
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: '../lib/setup-codeql-action.js'
|
main: '../lib/setup-codeql-action.js'
|
||||||
|
|||||||
@@ -19,18 +19,20 @@ import { getApiDetails, getGitHubVersion } from "./api-client";
|
|||||||
import { runAutobuild } from "./autobuild";
|
import { runAutobuild } from "./autobuild";
|
||||||
import { getTotalCacheSize, shouldStoreCache } from "./caching-utils";
|
import { getTotalCacheSize, shouldStoreCache } from "./caching-utils";
|
||||||
import { getCodeQL } from "./codeql";
|
import { getCodeQL } from "./codeql";
|
||||||
import { Config, getConfig } from "./config-utils";
|
|
||||||
import {
|
import {
|
||||||
cleanupAndUploadDatabases,
|
Config,
|
||||||
DatabaseUploadResult,
|
getConfig,
|
||||||
} from "./database-upload";
|
isCodeQualityEnabled,
|
||||||
|
isCodeScanningEnabled,
|
||||||
|
} from "./config-utils";
|
||||||
|
import { cleanupAndUploadDatabases } from "./database-upload";
|
||||||
import {
|
import {
|
||||||
DependencyCacheUploadStatusReport,
|
DependencyCacheUploadStatusReport,
|
||||||
uploadDependencyCaches,
|
uploadDependencyCaches,
|
||||||
} from "./dependency-caching";
|
} from "./dependency-caching";
|
||||||
import { getDiffInformedAnalysisBranches } from "./diff-informed-analysis-utils";
|
import { getDiffInformedAnalysisBranches } from "./diff-informed-analysis-utils";
|
||||||
import { EnvVar } from "./environment";
|
import { EnvVar } from "./environment";
|
||||||
import { Features } from "./feature-flags";
|
import { Feature, Features } from "./feature-flags";
|
||||||
import { KnownLanguage } from "./languages";
|
import { KnownLanguage } from "./languages";
|
||||||
import { getActionsLogger, Logger } from "./logging";
|
import { getActionsLogger, Logger } from "./logging";
|
||||||
import { cleanupAndUploadOverlayBaseDatabaseToCache } from "./overlay-database-utils";
|
import { cleanupAndUploadOverlayBaseDatabaseToCache } from "./overlay-database-utils";
|
||||||
@@ -57,13 +59,15 @@ interface AnalysisStatusReport
|
|||||||
extends uploadLib.UploadStatusReport,
|
extends uploadLib.UploadStatusReport,
|
||||||
QueriesStatusReport {}
|
QueriesStatusReport {}
|
||||||
|
|
||||||
|
interface DependencyCachingUploadStatusReport {
|
||||||
|
dependency_caching_upload_results?: DependencyCacheUploadStatusReport;
|
||||||
|
}
|
||||||
|
|
||||||
interface FinishStatusReport
|
interface FinishStatusReport
|
||||||
extends StatusReportBase,
|
extends StatusReportBase,
|
||||||
DatabaseCreationTimings,
|
DatabaseCreationTimings,
|
||||||
AnalysisStatusReport {
|
AnalysisStatusReport,
|
||||||
dependency_caching_upload_results?: DependencyCacheUploadStatusReport;
|
DependencyCachingUploadStatusReport {}
|
||||||
database_upload_results: DatabaseUploadResult[];
|
|
||||||
}
|
|
||||||
|
|
||||||
interface FinishWithTrapUploadStatusReport extends FinishStatusReport {
|
interface FinishWithTrapUploadStatusReport extends FinishStatusReport {
|
||||||
/** Size of TRAP caches that we uploaded, in bytes. */
|
/** Size of TRAP caches that we uploaded, in bytes. */
|
||||||
@@ -82,7 +86,6 @@ async function sendStatusReport(
|
|||||||
didUploadTrapCaches: boolean,
|
didUploadTrapCaches: boolean,
|
||||||
trapCacheCleanup: TrapCacheCleanupStatusReport | undefined,
|
trapCacheCleanup: TrapCacheCleanupStatusReport | undefined,
|
||||||
dependencyCacheResults: DependencyCacheUploadStatusReport | undefined,
|
dependencyCacheResults: DependencyCacheUploadStatusReport | undefined,
|
||||||
databaseUploadResults: DatabaseUploadResult[],
|
|
||||||
logger: Logger,
|
logger: Logger,
|
||||||
) {
|
) {
|
||||||
const status = getActionsStatus(error, stats?.analyze_failure_language);
|
const status = getActionsStatus(error, stats?.analyze_failure_language);
|
||||||
@@ -103,7 +106,6 @@ async function sendStatusReport(
|
|||||||
...(dbCreationTimings || {}),
|
...(dbCreationTimings || {}),
|
||||||
...(trapCacheCleanup || {}),
|
...(trapCacheCleanup || {}),
|
||||||
dependency_caching_upload_results: dependencyCacheResults,
|
dependency_caching_upload_results: dependencyCacheResults,
|
||||||
database_upload_results: databaseUploadResults,
|
|
||||||
};
|
};
|
||||||
if (config && didUploadTrapCaches) {
|
if (config && didUploadTrapCaches) {
|
||||||
const trapCacheUploadStatusReport: FinishWithTrapUploadStatusReport = {
|
const trapCacheUploadStatusReport: FinishWithTrapUploadStatusReport = {
|
||||||
@@ -221,7 +223,6 @@ async function run() {
|
|||||||
let dbCreationTimings: DatabaseCreationTimings | undefined = undefined;
|
let dbCreationTimings: DatabaseCreationTimings | undefined = undefined;
|
||||||
let didUploadTrapCaches = false;
|
let didUploadTrapCaches = false;
|
||||||
let dependencyCacheResults: DependencyCacheUploadStatusReport | undefined;
|
let dependencyCacheResults: DependencyCacheUploadStatusReport | undefined;
|
||||||
let databaseUploadResults: DatabaseUploadResult[] = [];
|
|
||||||
util.initializeEnvironment(actionsUtil.getActionVersion());
|
util.initializeEnvironment(actionsUtil.getActionVersion());
|
||||||
|
|
||||||
// Make inputs accessible in the `post` step, details at
|
// Make inputs accessible in the `post` step, details at
|
||||||
@@ -357,6 +358,7 @@ async function run() {
|
|||||||
const checkoutPath = actionsUtil.getRequiredInput("checkout_path");
|
const checkoutPath = actionsUtil.getRequiredInput("checkout_path");
|
||||||
const category = actionsUtil.getOptionalInput("category");
|
const category = actionsUtil.getOptionalInput("category");
|
||||||
|
|
||||||
|
if (await features.getValue(Feature.AnalyzeUseNewUpload)) {
|
||||||
uploadResults = await postProcessAndUploadSarif(
|
uploadResults = await postProcessAndUploadSarif(
|
||||||
logger,
|
logger,
|
||||||
features,
|
features,
|
||||||
@@ -366,6 +368,36 @@ async function run() {
|
|||||||
category,
|
category,
|
||||||
actionsUtil.getOptionalInput("post-processed-sarif-path"),
|
actionsUtil.getOptionalInput("post-processed-sarif-path"),
|
||||||
);
|
);
|
||||||
|
} else if (uploadKind === "always") {
|
||||||
|
uploadResults = {};
|
||||||
|
|
||||||
|
if (isCodeScanningEnabled(config)) {
|
||||||
|
uploadResults[analyses.AnalysisKind.CodeScanning] =
|
||||||
|
await uploadLib.uploadFiles(
|
||||||
|
outputDir,
|
||||||
|
checkoutPath,
|
||||||
|
category,
|
||||||
|
features,
|
||||||
|
logger,
|
||||||
|
analyses.CodeScanning,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCodeQualityEnabled(config)) {
|
||||||
|
uploadResults[analyses.AnalysisKind.CodeQuality] =
|
||||||
|
await uploadLib.uploadFiles(
|
||||||
|
outputDir,
|
||||||
|
checkoutPath,
|
||||||
|
category,
|
||||||
|
features,
|
||||||
|
logger,
|
||||||
|
analyses.CodeQuality,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uploadResults = {};
|
||||||
|
logger.info("Not uploading results");
|
||||||
|
}
|
||||||
|
|
||||||
// Set the SARIF id outputs only if we have results for them, to avoid
|
// Set the SARIF id outputs only if we have results for them, to avoid
|
||||||
// having keys with empty values in the action output.
|
// having keys with empty values in the action output.
|
||||||
@@ -393,7 +425,7 @@ async function run() {
|
|||||||
// Possibly upload the database bundles for remote queries.
|
// Possibly upload the database bundles for remote queries.
|
||||||
// Note: Take care with the ordering of this call since databases may be cleaned up
|
// Note: Take care with the ordering of this call since databases may be cleaned up
|
||||||
// at the `overlay` or `clear` level.
|
// at the `overlay` or `clear` level.
|
||||||
databaseUploadResults = await cleanupAndUploadDatabases(
|
await cleanupAndUploadDatabases(
|
||||||
repositoryNwo,
|
repositoryNwo,
|
||||||
codeql,
|
codeql,
|
||||||
config,
|
config,
|
||||||
@@ -465,7 +497,6 @@ async function run() {
|
|||||||
didUploadTrapCaches,
|
didUploadTrapCaches,
|
||||||
trapCacheCleanupTelemetry,
|
trapCacheCleanupTelemetry,
|
||||||
dependencyCacheResults,
|
dependencyCacheResults,
|
||||||
databaseUploadResults,
|
|
||||||
logger,
|
logger,
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
@@ -488,7 +519,6 @@ async function run() {
|
|||||||
didUploadTrapCaches,
|
didUploadTrapCaches,
|
||||||
trapCacheCleanupTelemetry,
|
trapCacheCleanupTelemetry,
|
||||||
dependencyCacheResults,
|
dependencyCacheResults,
|
||||||
databaseUploadResults,
|
|
||||||
logger,
|
logger,
|
||||||
);
|
);
|
||||||
} else if (runStats !== undefined) {
|
} else if (runStats !== undefined) {
|
||||||
@@ -502,7 +532,6 @@ async function run() {
|
|||||||
didUploadTrapCaches,
|
didUploadTrapCaches,
|
||||||
trapCacheCleanupTelemetry,
|
trapCacheCleanupTelemetry,
|
||||||
dependencyCacheResults,
|
dependencyCacheResults,
|
||||||
databaseUploadResults,
|
|
||||||
logger,
|
logger,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@@ -516,7 +545,6 @@ async function run() {
|
|||||||
didUploadTrapCaches,
|
didUploadTrapCaches,
|
||||||
trapCacheCleanupTelemetry,
|
trapCacheCleanupTelemetry,
|
||||||
dependencyCacheResults,
|
dependencyCacheResults,
|
||||||
databaseUploadResults,
|
|
||||||
logger,
|
logger,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,14 +95,14 @@ test("getGitHubVersion for different domain", async (t) => {
|
|||||||
t.deepEqual({ type: util.GitHubVariant.DOTCOM }, v3);
|
t.deepEqual({ type: util.GitHubVariant.DOTCOM }, v3);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("getGitHubVersion for GHEC-DR", async (t) => {
|
test("getGitHubVersion for GHE_DOTCOM", async (t) => {
|
||||||
mockGetMetaVersionHeader("ghe.com");
|
mockGetMetaVersionHeader("ghe.com");
|
||||||
const gheDotcom = await api.getGitHubVersionFromApi(api.getApiClient(), {
|
const gheDotcom = await api.getGitHubVersionFromApi(api.getApiClient(), {
|
||||||
auth: "",
|
auth: "",
|
||||||
url: "https://foo.ghe.com",
|
url: "https://foo.ghe.com",
|
||||||
apiURL: undefined,
|
apiURL: undefined,
|
||||||
});
|
});
|
||||||
t.deepEqual({ type: util.GitHubVariant.GHEC_DR }, gheDotcom);
|
t.deepEqual({ type: util.GitHubVariant.GHE_DOTCOM }, gheDotcom);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("wrapApiConfigurationError correctly wraps specific configuration errors", (t) => {
|
test("wrapApiConfigurationError correctly wraps specific configuration errors", (t) => {
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ export async function getGitHubVersionFromApi(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (response.headers[GITHUB_ENTERPRISE_VERSION_HEADER] === "ghe.com") {
|
if (response.headers[GITHUB_ENTERPRISE_VERSION_HEADER] === "ghe.com") {
|
||||||
return { type: GitHubVariant.GHEC_DR };
|
return { type: GitHubVariant.GHE_DOTCOM };
|
||||||
}
|
}
|
||||||
|
|
||||||
const version = response.headers[GITHUB_ENTERPRISE_VERSION_HEADER] as string;
|
const version = response.headers[GITHUB_ENTERPRISE_VERSION_HEADER] as string;
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ test("Don't crash if uploading a database fails", async (t) => {
|
|||||||
(v) =>
|
(v) =>
|
||||||
v.type === "warning" &&
|
v.type === "warning" &&
|
||||||
v.message ===
|
v.message ===
|
||||||
"Failed to upload database for javascript: some error message",
|
"Failed to upload database for javascript: Error: some error message",
|
||||||
) !== undefined,
|
) !== undefined,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -13,20 +13,6 @@ import { RepositoryNwo } from "./repository";
|
|||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
import { bundleDb, CleanupLevel, parseGitHubUrl } from "./util";
|
import { bundleDb, CleanupLevel, parseGitHubUrl } from "./util";
|
||||||
|
|
||||||
/** Information about a database upload. */
|
|
||||||
export interface DatabaseUploadResult {
|
|
||||||
/** Language of the database. */
|
|
||||||
language: string;
|
|
||||||
/** Size of the zipped database in bytes. */
|
|
||||||
zipped_upload_size_bytes?: number;
|
|
||||||
/** Whether the uploaded database is an overlay base. */
|
|
||||||
is_overlay_base?: boolean;
|
|
||||||
/** Time taken to upload database in milliseconds. */
|
|
||||||
upload_duration_ms?: number;
|
|
||||||
/** If there was an error during database upload, this is its message. */
|
|
||||||
error?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function cleanupAndUploadDatabases(
|
export async function cleanupAndUploadDatabases(
|
||||||
repositoryNwo: RepositoryNwo,
|
repositoryNwo: RepositoryNwo,
|
||||||
codeql: CodeQL,
|
codeql: CodeQL,
|
||||||
@@ -34,44 +20,42 @@ export async function cleanupAndUploadDatabases(
|
|||||||
apiDetails: GitHubApiDetails,
|
apiDetails: GitHubApiDetails,
|
||||||
features: FeatureEnablement,
|
features: FeatureEnablement,
|
||||||
logger: Logger,
|
logger: Logger,
|
||||||
): Promise<DatabaseUploadResult[]> {
|
): Promise<void> {
|
||||||
if (actionsUtil.getRequiredInput("upload-database") !== "true") {
|
if (actionsUtil.getRequiredInput("upload-database") !== "true") {
|
||||||
logger.debug("Database upload disabled in workflow. Skipping upload.");
|
logger.debug("Database upload disabled in workflow. Skipping upload.");
|
||||||
return [];
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!config.analysisKinds.includes(AnalysisKind.CodeScanning)) {
|
if (!config.analysisKinds.includes(AnalysisKind.CodeScanning)) {
|
||||||
logger.debug(
|
logger.debug(
|
||||||
`Not uploading database because 'analysis-kinds: ${AnalysisKind.CodeScanning}' is not enabled.`,
|
`Not uploading database because 'analysis-kinds: ${AnalysisKind.CodeScanning}' is not enabled.`,
|
||||||
);
|
);
|
||||||
return [];
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (util.isInTestMode()) {
|
if (util.isInTestMode()) {
|
||||||
logger.debug("In test mode. Skipping database upload.");
|
logger.debug("In test mode. Skipping database upload.");
|
||||||
return [];
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do nothing when not running against github.com
|
// Do nothing when not running against github.com
|
||||||
if (
|
if (
|
||||||
config.gitHubVersion.type !== util.GitHubVariant.DOTCOM &&
|
config.gitHubVersion.type !== util.GitHubVariant.DOTCOM &&
|
||||||
config.gitHubVersion.type !== util.GitHubVariant.GHEC_DR
|
config.gitHubVersion.type !== util.GitHubVariant.GHE_DOTCOM
|
||||||
) {
|
) {
|
||||||
logger.debug("Not running against github.com or GHEC-DR. Skipping upload.");
|
logger.debug("Not running against github.com or GHEC-DR. Skipping upload.");
|
||||||
return [];
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(await gitUtils.isAnalyzingDefaultBranch())) {
|
if (!(await gitUtils.isAnalyzingDefaultBranch())) {
|
||||||
// We only want to upload a database if we are analyzing the default branch.
|
// We only want to upload a database if we are analyzing the default branch.
|
||||||
logger.debug("Not analyzing default branch. Skipping upload.");
|
logger.debug("Not analyzing default branch. Skipping upload.");
|
||||||
return [];
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If config.overlayDatabaseMode is OverlayBase, then we have overlay base databases for all languages.
|
const cleanupLevel =
|
||||||
const shouldUploadOverlayBase =
|
|
||||||
config.overlayDatabaseMode === OverlayDatabaseMode.OverlayBase &&
|
config.overlayDatabaseMode === OverlayDatabaseMode.OverlayBase &&
|
||||||
(await features.getValue(Feature.UploadOverlayDbToApi));
|
(await features.getValue(Feature.UploadOverlayDbToApi))
|
||||||
const cleanupLevel = shouldUploadOverlayBase
|
|
||||||
? CleanupLevel.Overlay
|
? CleanupLevel.Overlay
|
||||||
: CleanupLevel.Clear;
|
: CleanupLevel.Clear;
|
||||||
|
|
||||||
@@ -93,7 +77,6 @@ export async function cleanupAndUploadDatabases(
|
|||||||
uploadsBaseUrl = uploadsBaseUrl.slice(0, -1);
|
uploadsBaseUrl = uploadsBaseUrl.slice(0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const reports: DatabaseUploadResult[] = [];
|
|
||||||
for (const language of config.languages) {
|
for (const language of config.languages) {
|
||||||
try {
|
try {
|
||||||
// Upload the database bundle.
|
// Upload the database bundle.
|
||||||
@@ -107,7 +90,6 @@ export async function cleanupAndUploadDatabases(
|
|||||||
actionsUtil.getRequiredInput("checkout_path"),
|
actionsUtil.getRequiredInput("checkout_path"),
|
||||||
);
|
);
|
||||||
try {
|
try {
|
||||||
const startTime = performance.now();
|
|
||||||
await client.request(
|
await client.request(
|
||||||
`POST /repos/:owner/:repo/code-scanning/codeql/databases/:language?name=:name&commit_oid=:commit_oid`,
|
`POST /repos/:owner/:repo/code-scanning/codeql/databases/:language?name=:name&commit_oid=:commit_oid`,
|
||||||
{
|
{
|
||||||
@@ -125,27 +107,13 @@ export async function cleanupAndUploadDatabases(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
const endTime = performance.now();
|
|
||||||
reports.push({
|
|
||||||
language,
|
|
||||||
zipped_upload_size_bytes: bundledDbSize,
|
|
||||||
is_overlay_base: shouldUploadOverlayBase,
|
|
||||||
upload_duration_ms: endTime - startTime,
|
|
||||||
});
|
|
||||||
logger.debug(`Successfully uploaded database for ${language}`);
|
logger.debug(`Successfully uploaded database for ${language}`);
|
||||||
} finally {
|
} finally {
|
||||||
bundledDbReadStream.close();
|
bundledDbReadStream.close();
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Log a warning but don't fail the workflow
|
// Log a warning but don't fail the workflow
|
||||||
logger.warning(
|
logger.warning(`Failed to upload database for ${language}: ${e}`);
|
||||||
`Failed to upload database for ${language}: ${util.getErrorMessage(e)}`,
|
|
||||||
);
|
|
||||||
reports.push({
|
|
||||||
language,
|
|
||||||
error: util.getErrorMessage(e),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return reports;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -603,6 +603,28 @@ test("getFeaturePrefix - returns empty string if no features are enabled", async
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("getFeaturePrefix - Java - returns 'minify-' if JavaMinimizeDependencyJars is enabled", async (t) => {
|
||||||
|
const codeql = createStubCodeQL({});
|
||||||
|
const features = createFeatures([Feature.JavaMinimizeDependencyJars]);
|
||||||
|
|
||||||
|
const result = await getFeaturePrefix(codeql, features, KnownLanguage.java);
|
||||||
|
t.deepEqual(result, "minify-");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getFeaturePrefix - non-Java - returns '' if JavaMinimizeDependencyJars is enabled", async (t) => {
|
||||||
|
const codeql = createStubCodeQL({});
|
||||||
|
const features = createFeatures([Feature.JavaMinimizeDependencyJars]);
|
||||||
|
|
||||||
|
for (const knownLanguage of Object.values(KnownLanguage)) {
|
||||||
|
// Skip Java since we expect a result for it, which is tested in the previous test.
|
||||||
|
if (knownLanguage === KnownLanguage.java) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const result = await getFeaturePrefix(codeql, features, knownLanguage);
|
||||||
|
t.deepEqual(result, "", `Expected no feature prefix for ${knownLanguage}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
test("getFeaturePrefix - C# - returns prefix if CsharpNewCacheKey is enabled", async (t) => {
|
test("getFeaturePrefix - C# - returns prefix if CsharpNewCacheKey is enabled", async (t) => {
|
||||||
const codeql = createStubCodeQL({});
|
const codeql = createStubCodeQL({});
|
||||||
const features = createFeatures([Feature.CsharpNewCacheKey]);
|
const features = createFeatures([Feature.CsharpNewCacheKey]);
|
||||||
|
|||||||
@@ -541,7 +541,18 @@ export async function getFeaturePrefix(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (language === KnownLanguage.csharp) {
|
if (language === KnownLanguage.java) {
|
||||||
|
// To ensure a safe rollout of JAR minimization, we change the key when the feature is enabled.
|
||||||
|
const minimizeJavaJars = await features.getValue(
|
||||||
|
Feature.JavaMinimizeDependencyJars,
|
||||||
|
codeql,
|
||||||
|
);
|
||||||
|
|
||||||
|
// To maintain backwards compatibility with this, we return "minify-" instead of a hash.
|
||||||
|
if (minimizeJavaJars) {
|
||||||
|
return "minify-";
|
||||||
|
}
|
||||||
|
} else if (language === KnownLanguage.csharp) {
|
||||||
await addFeatureIfEnabled(Feature.CsharpNewCacheKey);
|
await addFeatureIfEnabled(Feature.CsharpNewCacheKey);
|
||||||
await addFeatureIfEnabled(Feature.CsharpCacheBuildModeNone);
|
await addFeatureIfEnabled(Feature.CsharpCacheBuildModeNone);
|
||||||
}
|
}
|
||||||
@@ -582,8 +593,14 @@ async function cachePrefix(
|
|||||||
// experimental features that affect the cache contents.
|
// experimental features that affect the cache contents.
|
||||||
const featurePrefix = await getFeaturePrefix(codeql, features, language);
|
const featurePrefix = await getFeaturePrefix(codeql, features, language);
|
||||||
|
|
||||||
// Assemble the cache key.
|
// Assemble the cache key. For backwards compatibility with the JAR minification experiment's existing
|
||||||
|
// feature prefix usage, we add that feature prefix at the start. Other feature prefixes are inserted
|
||||||
|
// after the general CodeQL dependency cache prefix.
|
||||||
|
if (featurePrefix === "minify-") {
|
||||||
|
return `${featurePrefix}${prefix}-${CODEQL_DEPENDENCY_CACHE_VERSION}-${runnerOs}-${language}-`;
|
||||||
|
} else {
|
||||||
return `${prefix}-${featurePrefix}${CODEQL_DEPENDENCY_CACHE_VERSION}-${runnerOs}-${language}-`;
|
return `${prefix}-${featurePrefix}${CODEQL_DEPENDENCY_CACHE_VERSION}-${runnerOs}-${language}-`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Represents information about our overall cache usage for CodeQL dependency caches. */
|
/** Represents information about our overall cache usage for CodeQL dependency caches. */
|
||||||
|
|||||||
@@ -62,13 +62,13 @@ test(`All features are disabled if running against GHES`, async (t) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test(`Feature flags are requested in GHEC-DR`, async (t) => {
|
test(`Feature flags are requested in Proxima`, async (t) => {
|
||||||
await withTmpDir(async (tmpDir) => {
|
await withTmpDir(async (tmpDir) => {
|
||||||
const loggedMessages = [];
|
const loggedMessages = [];
|
||||||
const features = setUpFeatureFlagTests(
|
const features = setUpFeatureFlagTests(
|
||||||
tmpDir,
|
tmpDir,
|
||||||
getRecordingLogger(loggedMessages),
|
getRecordingLogger(loggedMessages),
|
||||||
{ type: GitHubVariant.GHEC_DR },
|
{ type: GitHubVariant.GHE_DOTCOM },
|
||||||
);
|
);
|
||||||
|
|
||||||
mockFeatureFlagApiEndpoint(200, initializeFeatures(true));
|
mockFeatureFlagApiEndpoint(200, initializeFeatures(true));
|
||||||
@@ -436,48 +436,65 @@ test(`selects CLI from defaults.json on GHES`, async (t) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const variant of [GitHubVariant.DOTCOM, GitHubVariant.GHEC_DR]) {
|
test("selects CLI v2.20.1 on Dotcom when feature flags enable v2.20.0 and v2.20.1", async (t) => {
|
||||||
test(`selects CLI v2.20.1 on ${variant} when feature flags enable v2.20.0 and v2.20.1`, async (t) => {
|
|
||||||
await withTmpDir(async (tmpDir) => {
|
await withTmpDir(async (tmpDir) => {
|
||||||
const features = setUpFeatureFlagTests(tmpDir);
|
const features = setUpFeatureFlagTests(tmpDir);
|
||||||
const expectedFeatureEnablement = initializeFeatures(true);
|
const expectedFeatureEnablement = initializeFeatures(true);
|
||||||
expectedFeatureEnablement["default_codeql_version_2_20_0_enabled"] = true;
|
expectedFeatureEnablement["default_codeql_version_2_20_0_enabled"] = true;
|
||||||
expectedFeatureEnablement["default_codeql_version_2_20_1_enabled"] = true;
|
expectedFeatureEnablement["default_codeql_version_2_20_1_enabled"] = true;
|
||||||
expectedFeatureEnablement["default_codeql_version_2_20_2_enabled"] =
|
expectedFeatureEnablement["default_codeql_version_2_20_2_enabled"] = false;
|
||||||
false;
|
expectedFeatureEnablement["default_codeql_version_2_20_3_enabled"] = false;
|
||||||
expectedFeatureEnablement["default_codeql_version_2_20_3_enabled"] =
|
expectedFeatureEnablement["default_codeql_version_2_20_4_enabled"] = false;
|
||||||
false;
|
expectedFeatureEnablement["default_codeql_version_2_20_5_enabled"] = false;
|
||||||
expectedFeatureEnablement["default_codeql_version_2_20_4_enabled"] =
|
|
||||||
false;
|
|
||||||
expectedFeatureEnablement["default_codeql_version_2_20_5_enabled"] =
|
|
||||||
false;
|
|
||||||
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
||||||
|
|
||||||
const defaultCliVersion = await features.getDefaultCliVersion(variant);
|
const defaultCliVersion = await features.getDefaultCliVersion(
|
||||||
|
GitHubVariant.DOTCOM,
|
||||||
|
);
|
||||||
t.deepEqual(defaultCliVersion, {
|
t.deepEqual(defaultCliVersion, {
|
||||||
cliVersion: "2.20.1",
|
cliVersion: "2.20.1",
|
||||||
tagName: "codeql-bundle-v2.20.1",
|
tagName: "codeql-bundle-v2.20.1",
|
||||||
toolsFeatureFlagsValid: true,
|
toolsFeatureFlagsValid: true,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test(`selects CLI from defaults.json on ${variant} when no default version feature flags are enabled`, async (t) => {
|
test("includes tag name", async (t) => {
|
||||||
|
await withTmpDir(async (tmpDir) => {
|
||||||
|
const features = setUpFeatureFlagTests(tmpDir);
|
||||||
|
const expectedFeatureEnablement = initializeFeatures(true);
|
||||||
|
expectedFeatureEnablement["default_codeql_version_2_20_0_enabled"] = true;
|
||||||
|
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
||||||
|
|
||||||
|
const defaultCliVersion = await features.getDefaultCliVersion(
|
||||||
|
GitHubVariant.DOTCOM,
|
||||||
|
);
|
||||||
|
t.deepEqual(defaultCliVersion, {
|
||||||
|
cliVersion: "2.20.0",
|
||||||
|
tagName: "codeql-bundle-v2.20.0",
|
||||||
|
toolsFeatureFlagsValid: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`selects CLI from defaults.json on Dotcom when no default version feature flags are enabled`, async (t) => {
|
||||||
await withTmpDir(async (tmpDir) => {
|
await withTmpDir(async (tmpDir) => {
|
||||||
const features = setUpFeatureFlagTests(tmpDir);
|
const features = setUpFeatureFlagTests(tmpDir);
|
||||||
const expectedFeatureEnablement = initializeFeatures(true);
|
const expectedFeatureEnablement = initializeFeatures(true);
|
||||||
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
||||||
|
|
||||||
const defaultCliVersion = await features.getDefaultCliVersion(variant);
|
const defaultCliVersion = await features.getDefaultCliVersion(
|
||||||
|
GitHubVariant.DOTCOM,
|
||||||
|
);
|
||||||
t.deepEqual(defaultCliVersion, {
|
t.deepEqual(defaultCliVersion, {
|
||||||
cliVersion: defaults.cliVersion,
|
cliVersion: defaults.cliVersion,
|
||||||
tagName: defaults.bundleVersion,
|
tagName: defaults.bundleVersion,
|
||||||
toolsFeatureFlagsValid: false,
|
toolsFeatureFlagsValid: false,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test(`ignores invalid version numbers in default version feature flags on ${variant}`, async (t) => {
|
test("ignores invalid version numbers in default version feature flags", async (t) => {
|
||||||
await withTmpDir(async (tmpDir) => {
|
await withTmpDir(async (tmpDir) => {
|
||||||
const loggedMessages = [];
|
const loggedMessages = [];
|
||||||
const features = setUpFeatureFlagTests(
|
const features = setUpFeatureFlagTests(
|
||||||
@@ -491,7 +508,9 @@ for (const variant of [GitHubVariant.DOTCOM, GitHubVariant.GHEC_DR]) {
|
|||||||
true;
|
true;
|
||||||
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
mockFeatureFlagApiEndpoint(200, expectedFeatureEnablement);
|
||||||
|
|
||||||
const defaultCliVersion = await features.getDefaultCliVersion(variant);
|
const defaultCliVersion = await features.getDefaultCliVersion(
|
||||||
|
GitHubVariant.DOTCOM,
|
||||||
|
);
|
||||||
t.deepEqual(defaultCliVersion, {
|
t.deepEqual(defaultCliVersion, {
|
||||||
cliVersion: "2.20.1",
|
cliVersion: "2.20.1",
|
||||||
tagName: "codeql-bundle-v2.20.1",
|
tagName: "codeql-bundle-v2.20.1",
|
||||||
@@ -507,8 +526,7 @@ for (const variant of [GitHubVariant.DOTCOM, GitHubVariant.GHEC_DR]) {
|
|||||||
) !== undefined,
|
) !== undefined,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
test("legacy feature flags should end with _enabled", async (t) => {
|
test("legacy feature flags should end with _enabled", async (t) => {
|
||||||
for (const [feature, config] of Object.entries(featureConfig)) {
|
for (const [feature, config] of Object.entries(featureConfig)) {
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export interface FeatureEnablement {
|
|||||||
*/
|
*/
|
||||||
export enum Feature {
|
export enum Feature {
|
||||||
AllowToolcacheInput = "allow_toolcache_input",
|
AllowToolcacheInput = "allow_toolcache_input",
|
||||||
|
AnalyzeUseNewUpload = "analyze_use_new_upload",
|
||||||
CleanupTrapCaches = "cleanup_trap_caches",
|
CleanupTrapCaches = "cleanup_trap_caches",
|
||||||
CppDependencyInstallation = "cpp_dependency_installation_enabled",
|
CppDependencyInstallation = "cpp_dependency_installation_enabled",
|
||||||
CsharpCacheBuildModeNone = "csharp_cache_bmn",
|
CsharpCacheBuildModeNone = "csharp_cache_bmn",
|
||||||
@@ -53,6 +54,7 @@ export enum Feature {
|
|||||||
DisableJavaBuildlessEnabled = "disable_java_buildless_enabled",
|
DisableJavaBuildlessEnabled = "disable_java_buildless_enabled",
|
||||||
DisableKotlinAnalysisEnabled = "disable_kotlin_analysis_enabled",
|
DisableKotlinAnalysisEnabled = "disable_kotlin_analysis_enabled",
|
||||||
ExportDiagnosticsEnabled = "export_diagnostics_enabled",
|
ExportDiagnosticsEnabled = "export_diagnostics_enabled",
|
||||||
|
JavaMinimizeDependencyJars = "java_minimize_dependency_jars",
|
||||||
OverlayAnalysis = "overlay_analysis",
|
OverlayAnalysis = "overlay_analysis",
|
||||||
OverlayAnalysisActions = "overlay_analysis_actions",
|
OverlayAnalysisActions = "overlay_analysis_actions",
|
||||||
OverlayAnalysisCodeScanningActions = "overlay_analysis_code_scanning_actions",
|
OverlayAnalysisCodeScanningActions = "overlay_analysis_code_scanning_actions",
|
||||||
@@ -118,6 +120,11 @@ export const featureConfig: Record<
|
|||||||
envVar: "CODEQL_ACTION_ALLOW_TOOLCACHE_INPUT",
|
envVar: "CODEQL_ACTION_ALLOW_TOOLCACHE_INPUT",
|
||||||
minimumVersion: undefined,
|
minimumVersion: undefined,
|
||||||
},
|
},
|
||||||
|
[Feature.AnalyzeUseNewUpload]: {
|
||||||
|
defaultValue: false,
|
||||||
|
envVar: "CODEQL_ACTION_ANALYZE_USE_NEW_UPLOAD",
|
||||||
|
minimumVersion: undefined,
|
||||||
|
},
|
||||||
[Feature.CleanupTrapCaches]: {
|
[Feature.CleanupTrapCaches]: {
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
envVar: "CODEQL_ACTION_CLEANUP_TRAP_CACHES",
|
envVar: "CODEQL_ACTION_CLEANUP_TRAP_CACHES",
|
||||||
@@ -167,6 +174,11 @@ export const featureConfig: Record<
|
|||||||
legacyApi: true,
|
legacyApi: true,
|
||||||
minimumVersion: undefined,
|
minimumVersion: undefined,
|
||||||
},
|
},
|
||||||
|
[Feature.JavaMinimizeDependencyJars]: {
|
||||||
|
defaultValue: false,
|
||||||
|
envVar: "CODEQL_ACTION_JAVA_MINIMIZE_DEPENDENCY_JARS",
|
||||||
|
minimumVersion: "2.23.0",
|
||||||
|
},
|
||||||
[Feature.OverlayAnalysis]: {
|
[Feature.OverlayAnalysis]: {
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS",
|
envVar: "CODEQL_ACTION_OVERLAY_ANALYSIS",
|
||||||
@@ -486,8 +498,8 @@ class GitHubFeatureFlags {
|
|||||||
async getDefaultCliVersion(
|
async getDefaultCliVersion(
|
||||||
variant: util.GitHubVariant,
|
variant: util.GitHubVariant,
|
||||||
): Promise<CodeQLDefaultVersionInfo> {
|
): Promise<CodeQLDefaultVersionInfo> {
|
||||||
if (supportsFeatureFlags(variant)) {
|
if (variant === util.GitHubVariant.DOTCOM) {
|
||||||
return await this.getDefaultCliVersionFromFlags();
|
return await this.getDefaultDotcomCliVersion();
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
cliVersion: defaults.cliVersion,
|
cliVersion: defaults.cliVersion,
|
||||||
@@ -495,7 +507,7 @@ class GitHubFeatureFlags {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async getDefaultCliVersionFromFlags(): Promise<CodeQLDefaultVersionInfo> {
|
async getDefaultDotcomCliVersion(): Promise<CodeQLDefaultVersionInfo> {
|
||||||
const response = await this.getAllFeatures();
|
const response = await this.getAllFeatures();
|
||||||
|
|
||||||
const enabledFeatureFlagCliVersions = Object.entries(response)
|
const enabledFeatureFlagCliVersions = Object.entries(response)
|
||||||
@@ -621,7 +633,10 @@ class GitHubFeatureFlags {
|
|||||||
|
|
||||||
private async loadApiResponse(): Promise<GitHubFeatureFlagsApiResponse> {
|
private async loadApiResponse(): Promise<GitHubFeatureFlagsApiResponse> {
|
||||||
// Do nothing when not running against github.com
|
// Do nothing when not running against github.com
|
||||||
if (!supportsFeatureFlags(this.gitHubVersion.type)) {
|
if (
|
||||||
|
this.gitHubVersion.type !== util.GitHubVariant.DOTCOM &&
|
||||||
|
this.gitHubVersion.type !== util.GitHubVariant.GHE_DOTCOM
|
||||||
|
) {
|
||||||
this.logger.debug(
|
this.logger.debug(
|
||||||
"Not running against github.com. Disabling all toggleable features.",
|
"Not running against github.com. Disabling all toggleable features.",
|
||||||
);
|
);
|
||||||
@@ -687,10 +702,3 @@ class GitHubFeatureFlags {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function supportsFeatureFlags(githubVariant: util.GitHubVariant): boolean {
|
|
||||||
return (
|
|
||||||
githubVariant === util.GitHubVariant.DOTCOM ||
|
|
||||||
githubVariant === util.GitHubVariant.GHEC_DR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -88,13 +88,6 @@ import {
|
|||||||
} from "./util";
|
} from "./util";
|
||||||
import { checkWorkflow } from "./workflow";
|
import { checkWorkflow } from "./workflow";
|
||||||
|
|
||||||
/**
|
|
||||||
* First version of CodeQL where the Java extractor safely supports the option to minimize
|
|
||||||
* dependency jars. Note: some earlier versions of the extractor will respond to the corresponding
|
|
||||||
* option, but may rewrite jars in ways that lead to extraction errors.
|
|
||||||
*/
|
|
||||||
export const CODEQL_VERSION_JAR_MINIMIZATION = "2.23.0";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a status report indicating that the `init` Action is starting.
|
* Sends a status report indicating that the `init` Action is starting.
|
||||||
*
|
*
|
||||||
@@ -645,20 +638,18 @@ async function run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are doing a Java `build-mode: none` analysis, then set the environment variable that
|
// If the feature flag to minimize Java dependency jars is enabled, and we are doing a Java
|
||||||
// enables the option in the Java extractor to minimize dependency jars. We also only do this if
|
// `build-mode: none` analysis (i.e. the flag is relevant), then set the environment variable
|
||||||
// dependency caching is enabled, since the option is intended to reduce the size of dependency
|
// that enables the corresponding option in the Java extractor. We also only do this if
|
||||||
// caches, but the jar-rewriting does have a performance cost that we'd like to avoid when
|
// dependency caching is enabled, since the option is intended to reduce the size of
|
||||||
// caching is not being used.
|
// dependency caches, but the jar-rewriting does have a performance cost that we'd like to avoid
|
||||||
// TODO: Remove this language-specific mechanism and replace it with a more general one that
|
// when caching is not being used.
|
||||||
// tells extractors when dependency caching is enabled, and then the Java extractor can make its
|
|
||||||
// own decision about whether to rewrite jars.
|
|
||||||
if (process.env[EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS]) {
|
if (process.env[EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS]) {
|
||||||
logger.debug(
|
logger.debug(
|
||||||
`${EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS} is already set to '${process.env[EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS]}', so the Action will not override it.`,
|
`${EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS} is already set to '${process.env[EnvVar.JAVA_EXTRACTOR_MINIMIZE_DEPENDENCY_JARS]}', so the Action will not override it.`,
|
||||||
);
|
);
|
||||||
} else if (
|
} else if (
|
||||||
(await codeQlVersionAtLeast(codeql, CODEQL_VERSION_JAR_MINIMIZATION)) &&
|
(await features.getValue(Feature.JavaMinimizeDependencyJars, codeql)) &&
|
||||||
config.dependencyCachingEnabled &&
|
config.dependencyCachingEnabled &&
|
||||||
config.buildMode === BuildMode.None &&
|
config.buildMode === BuildMode.None &&
|
||||||
config.languages.includes(KnownLanguage.java)
|
config.languages.includes(KnownLanguage.java)
|
||||||
|
|||||||
@@ -511,7 +511,7 @@ export async function getCodeQLSource(
|
|||||||
// different version to save download time if the version hasn't been
|
// different version to save download time if the version hasn't been
|
||||||
// specified explicitly (in which case we always honor it).
|
// specified explicitly (in which case we always honor it).
|
||||||
if (
|
if (
|
||||||
variant === util.GitHubVariant.GHES &&
|
variant !== util.GitHubVariant.DOTCOM &&
|
||||||
!forceShippedTools &&
|
!forceShippedTools &&
|
||||||
!toolsInput
|
!toolsInput
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -433,8 +433,8 @@ function formatGitHubVersion(version: util.GitHubVersion): string {
|
|||||||
switch (version.type) {
|
switch (version.type) {
|
||||||
case util.GitHubVariant.DOTCOM:
|
case util.GitHubVariant.DOTCOM:
|
||||||
return "dotcom";
|
return "dotcom";
|
||||||
case util.GitHubVariant.GHEC_DR:
|
case util.GitHubVariant.GHE_DOTCOM:
|
||||||
return "GHEC-DR";
|
return "GHE dotcom";
|
||||||
case util.GitHubVariant.GHES:
|
case util.GitHubVariant.GHES:
|
||||||
return `GHES ${version.version}`;
|
return `GHES ${version.version}`;
|
||||||
default:
|
default:
|
||||||
@@ -445,12 +445,12 @@ function formatGitHubVersion(version: util.GitHubVersion): string {
|
|||||||
const CHECK_ACTION_VERSION_TESTS: Array<[string, util.GitHubVersion, boolean]> =
|
const CHECK_ACTION_VERSION_TESTS: Array<[string, util.GitHubVersion, boolean]> =
|
||||||
[
|
[
|
||||||
["2.2.1", { type: util.GitHubVariant.DOTCOM }, true],
|
["2.2.1", { type: util.GitHubVariant.DOTCOM }, true],
|
||||||
["2.2.1", { type: util.GitHubVariant.GHEC_DR }, true],
|
["2.2.1", { type: util.GitHubVariant.GHE_DOTCOM }, true],
|
||||||
["2.2.1", { type: util.GitHubVariant.GHES, version: "3.10" }, false],
|
["2.2.1", { type: util.GitHubVariant.GHES, version: "3.10" }, false],
|
||||||
["2.2.1", { type: util.GitHubVariant.GHES, version: "3.11" }, false],
|
["2.2.1", { type: util.GitHubVariant.GHES, version: "3.11" }, false],
|
||||||
["2.2.1", { type: util.GitHubVariant.GHES, version: "3.12" }, false],
|
["2.2.1", { type: util.GitHubVariant.GHES, version: "3.12" }, false],
|
||||||
["3.2.1", { type: util.GitHubVariant.DOTCOM }, true],
|
["3.2.1", { type: util.GitHubVariant.DOTCOM }, true],
|
||||||
["3.2.1", { type: util.GitHubVariant.GHEC_DR }, true],
|
["3.2.1", { type: util.GitHubVariant.GHE_DOTCOM }, true],
|
||||||
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.10" }, false],
|
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.10" }, false],
|
||||||
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.11" }, false],
|
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.11" }, false],
|
||||||
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.12" }, false],
|
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.12" }, false],
|
||||||
@@ -458,7 +458,7 @@ const CHECK_ACTION_VERSION_TESTS: Array<[string, util.GitHubVersion, boolean]> =
|
|||||||
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.20" }, true],
|
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.20" }, true],
|
||||||
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.21" }, true],
|
["3.2.1", { type: util.GitHubVariant.GHES, version: "3.21" }, true],
|
||||||
["4.2.1", { type: util.GitHubVariant.DOTCOM }, false],
|
["4.2.1", { type: util.GitHubVariant.DOTCOM }, false],
|
||||||
["4.2.1", { type: util.GitHubVariant.GHEC_DR }, false],
|
["4.2.1", { type: util.GitHubVariant.GHE_DOTCOM }, false],
|
||||||
["4.2.1", { type: util.GitHubVariant.GHES, version: "3.19" }, false],
|
["4.2.1", { type: util.GitHubVariant.GHES, version: "3.19" }, false],
|
||||||
["4.2.1", { type: util.GitHubVariant.GHES, version: "3.20" }, false],
|
["4.2.1", { type: util.GitHubVariant.GHES, version: "3.20" }, false],
|
||||||
["4.2.1", { type: util.GitHubVariant.GHES, version: "3.21" }, false],
|
["4.2.1", { type: util.GitHubVariant.GHES, version: "3.21" }, false],
|
||||||
|
|||||||
14
src/util.ts
14
src/util.ts
@@ -556,17 +556,13 @@ const CODEQL_ACTION_WARNED_ABOUT_VERSION_ENV_VAR =
|
|||||||
let hasBeenWarnedAboutVersion = false;
|
let hasBeenWarnedAboutVersion = false;
|
||||||
|
|
||||||
export enum GitHubVariant {
|
export enum GitHubVariant {
|
||||||
/** [GitHub.com](https://github.com) */
|
DOTCOM,
|
||||||
DOTCOM = "GitHub.com",
|
GHES,
|
||||||
/** [GitHub Enterprise Server](https://docs.github.com/en/enterprise-server@latest/admin/overview/about-github-enterprise-server) */
|
GHE_DOTCOM,
|
||||||
GHES = "GitHub Enterprise Server",
|
|
||||||
/** [GitHub Enterprise Cloud with data residency](https://docs.github.com/en/enterprise-cloud@latest/admin/data-residency/about-github-enterprise-cloud-with-data-residency) */
|
|
||||||
GHEC_DR = "GitHub Enterprise Cloud with data residency",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type GitHubVersion =
|
export type GitHubVersion =
|
||||||
| { type: GitHubVariant.DOTCOM }
|
| { type: GitHubVariant.DOTCOM }
|
||||||
| { type: GitHubVariant.GHEC_DR }
|
| { type: GitHubVariant.GHE_DOTCOM }
|
||||||
| { type: GitHubVariant.GHES; version: string };
|
| { type: GitHubVariant.GHES; version: string };
|
||||||
|
|
||||||
export function checkGitHubVersionInRange(
|
export function checkGitHubVersionInRange(
|
||||||
@@ -1109,7 +1105,7 @@ export function checkActionVersion(
|
|||||||
// and should update to CodeQL Action v4.
|
// and should update to CodeQL Action v4.
|
||||||
if (
|
if (
|
||||||
githubVersion.type === GitHubVariant.DOTCOM ||
|
githubVersion.type === GitHubVariant.DOTCOM ||
|
||||||
githubVersion.type === GitHubVariant.GHEC_DR ||
|
githubVersion.type === GitHubVariant.GHE_DOTCOM ||
|
||||||
(githubVersion.type === GitHubVariant.GHES &&
|
(githubVersion.type === GitHubVariant.GHES &&
|
||||||
semver.satisfies(
|
semver.satisfies(
|
||||||
semver.coerce(githubVersion.version) ?? "0.0.0",
|
semver.coerce(githubVersion.version) ?? "0.0.0",
|
||||||
|
|||||||
@@ -29,6 +29,6 @@ outputs:
|
|||||||
proxy_urls:
|
proxy_urls:
|
||||||
description: A stringified JSON array of objects containing the types and URLs of the configured registries.
|
description: A stringified JSON array of objects containing the types and URLs of the configured registries.
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: "../lib/start-proxy-action.js"
|
main: "../lib/start-proxy-action.js"
|
||||||
post: "../lib/start-proxy-action-post.js"
|
post: "../lib/start-proxy-action-post.js"
|
||||||
|
|||||||
@@ -41,6 +41,6 @@ outputs:
|
|||||||
|
|
||||||
{ "code-scanning": "some-id", "code-quality": "some-other-id" }
|
{ "code-scanning": "some-id", "code-quality": "some-other-id" }
|
||||||
runs:
|
runs:
|
||||||
using: node24
|
using: node20
|
||||||
main: '../lib/upload-sarif-action.js'
|
main: '../lib/upload-sarif-action.js'
|
||||||
post: '../lib/upload-sarif-action-post.js'
|
post: '../lib/upload-sarif-action-post.js'
|
||||||
|
|||||||
Reference in New Issue
Block a user