Skip to content

Commit f5e3cad

Browse files
Merge branch 'main' into knewbury01/cds-util
2 parents fafeffd + adffbe9 commit f5e3cad

File tree

93 files changed

+7234
-4061
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+7234
-4061
lines changed

.github/workflows/code_scanning.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ on:
1010
- cron: '39 12 * * 2'
1111
workflow_dispatch:
1212

13+
env:
14+
CODEQL_ACTION_DIFF_INFORMED_QUERIES: false
15+
1316
jobs:
1417
analyze-javascript:
1518
name: Analyze

.github/workflows/run-codeql-unit-tests-javascript.yml

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -77,48 +77,28 @@ jobs:
7777
run: |
7878
qlt query run install-packs
7979
80-
- name: Ensure presence of cds shell command
81-
run: |
82-
if ! command -v cds &> /dev/null
83-
then
84-
## Workaround for https://github.tools.sap/cap/issues/issues/17840
85-
npm install -g @sap/[email protected]
86-
fi
80+
- name: Setup Node.js for CDS compilation
81+
uses: actions/setup-node@v4
82+
with:
83+
node-version: '18'
84+
cache: 'npm'
85+
cache-dependency-path: 'extractors/cds/tools/package-lock.json'
8786

88-
# Compile .cds files to .cds.json files.
87+
- name: Verify Node.js and npm tools
88+
run: |
89+
echo "Node.js version: $(node --version)"
90+
echo "npm version: $(npm --version)"
91+
echo "npx version: $(npx --version)"
92+
# Verify npx can access @sap/cds-dk without installing globally
93+
echo "Testing npx access to @sap/cds-dk..."
94+
npx --yes --package @sap/cds-dk@latest cds --version || echo "CDS will be installed per-project as needed"
95+
96+
# Compile .cds files to .cds.json files using the dedicated test script
8997
- name: Compile CAP CDS files
9098
run: |
91-
for test_dir in $(find . -type f -name '*.expected' -exec dirname {} \;);
92-
do
93-
# The CDS compiler produces locations relative to the working directory
94-
# so we switch to the test directory before running the compiler.
95-
pushd $test_dir
96-
for cds_file in $(find . -type f \( -iname '*.cds' \) -print)
97-
do
98-
echo "I am compiling $cds_file"
99-
_out_path="${cds_file}.json"
100-
cds compile $cds_file \
101-
--locations \
102-
--to json \
103-
--dest "$_out_path" \
104-
2> "$cds_file.err"
105-
# Check if the output is a regular file or a (sub)directory, where
106-
# files generated in an output directory will need to have the file
107-
# extension changed from '.json' to '.cds.json', but we don't need
108-
# to rename anything if the cds compiler just generated a single
109-
# '.cds.json' file.
110-
if [ -d "$_out_path" ]
111-
then
112-
for json_file in $(find "$_out_path" -type f \( -iname '*.json' \) -print)
113-
do
114-
_new_path="${json_file%.json}.cds.json"
115-
echo "Renaming CDS compiler generated JSON file $json_file to $_new_path"
116-
mv "$json_file" "$_new_path"
117-
done
118-
fi
119-
done
120-
popd
121-
done
99+
# Use the dedicated CDS compilation script that includes proper version resolution
100+
# This script follows the same logic as the CDS extractor's resolveCdsVersions function
101+
./extractors/cds/tools/workflow/cds-compilation-for-actions.sh
122102
123103
- name: Run test suites
124104
id: run-test-suites
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
name: "Update the CodeQL CLI dependencies"
2+
3+
on:
4+
workflow_dispatch:
5+
# nightly runs to update the CodeQL CLI dependencies
6+
schedule:
7+
- cron: '30 0 * * *'
8+
9+
permissions:
10+
contents: write
11+
pull-requests: write
12+
13+
jobs:
14+
update-codeql:
15+
name: Update CodeQL CLI dependencies
16+
runs-on: ubuntu-latest
17+
18+
steps:
19+
- name: Checkout repository
20+
uses: actions/checkout@v4
21+
22+
- name: Check latest CodeQL CLI version and update qlt.conf.json
23+
id: check-version
24+
env:
25+
GH_TOKEN: ${{ github.token }}
26+
run: |
27+
echo "Checking latest CodeQL CLI version"
28+
current_version=$(jq .CodeQLCLI qlt.conf.json -r)
29+
latest_version=$(gh release list --repo github/codeql-cli-binaries --json 'tagName,isLatest' --jq '.[] | select(.isLatest == true) | .tagName')
30+
echo "Current CodeQL CLI version: $current_version"
31+
echo "Latest CodeQL CLI version: $latest_version"
32+
33+
# Remove 'v' prefix if present for comparison with current version
34+
latest_clean=$(echo "$latest_version" | sed 's/^v//')
35+
36+
if [ "$latest_clean" != "$current_version" ]; then
37+
echo "Updating CodeQL CLI from $current_version to $latest_clean"
38+
echo "update_needed=true" >> $GITHUB_OUTPUT
39+
echo "latest_version=$latest_clean" >> $GITHUB_OUTPUT
40+
echo "latest_version_tag=$latest_version" >> $GITHUB_OUTPUT
41+
42+
# Update qlt.conf.json with all properties
43+
echo "Updating qlt.conf.json with all properties for version $latest_clean"
44+
jq --arg cli_version "$latest_clean" \
45+
--arg std_lib "codeql-cli/$latest_version" \
46+
--arg bundle "codeql-bundle-$latest_version" \
47+
'.CodeQLCLI = $cli_version | .CodeQLStandardLibrary = $std_lib | .CodeQLCLIBundle = $bundle' \
48+
qlt.conf.json > qlt.conf.json.tmp && mv qlt.conf.json.tmp qlt.conf.json
49+
50+
echo "Updated qlt.conf.json contents:"
51+
cat qlt.conf.json
52+
else
53+
echo "CodeQL CLI is already up-to-date at version $current_version."
54+
echo "update_needed=false" >> $GITHUB_OUTPUT
55+
fi
56+
57+
- name: Install QLT
58+
if: steps.check-version.outputs.update_needed == 'true'
59+
id: install-qlt
60+
uses: advanced-security/codeql-development-toolkit/.github/actions/install-qlt@main
61+
with:
62+
qlt-version: 'latest'
63+
add-to-path: true
64+
65+
- name: Install CodeQL
66+
if: steps.check-version.outputs.update_needed == 'true'
67+
id: install-codeql
68+
shell: bash
69+
run: |
70+
echo "Installing CodeQL"
71+
qlt codeql run install
72+
echo "-----------------------------"
73+
echo "CodeQL Home: $QLT_CODEQL_HOME"
74+
echo "CodeQL Binary: $QLT_CODEQL_PATH"
75+
76+
- name: Upgrade CodeQL pack lock files
77+
if: steps.check-version.outputs.update_needed == 'true'
78+
shell: bash
79+
run: |
80+
echo "Upgrading CodeQL pack lock files"
81+
echo "Finding all directories with qlpack.yml files..."
82+
83+
# Find all directories containing qlpack.yml files
84+
find . -name "qlpack.yml" -type f | while read -r qlpack_file; do
85+
pack_dir=$(dirname "$qlpack_file")
86+
echo "Upgrading pack in directory: $pack_dir"
87+
88+
# Change to the directory and run codeql pack upgrade
89+
cd "$pack_dir"
90+
$QLT_CODEQL_PATH pack upgrade
91+
cd - > /dev/null
92+
done
93+
94+
echo "Finished upgrading all CodeQL pack lock files"
95+
96+
- name: Create Pull Request
97+
if: steps.check-version.outputs.update_needed == 'true'
98+
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
99+
with:
100+
title: "Upgrade CodeQL CLI dependency to ${{ steps.check-version.outputs.latest_version_tag }}"
101+
body: |
102+
This PR upgrades the CodeQL CLI version to ${{ steps.check-version.outputs.latest_version_tag }}.
103+
104+
**Changes made:**
105+
- Updated `CodeQLCLI` to `${{ steps.check-version.outputs.latest_version }}`
106+
- Updated `CodeQLStandardLibrary` to `codeql-cli/${{ steps.check-version.outputs.latest_version_tag }}`
107+
- Updated `CodeQLCLIBundle` to `codeql-bundle-${{ steps.check-version.outputs.latest_version_tag }}`
108+
- Upgraded all CodeQL pack lock files using `codeql pack upgrade`
109+
commit-message: "Upgrade CodeQL CLI dependency to ${{ steps.check-version.outputs.latest_version_tag }}"
110+
delete-branch: true
111+
branch: "codeql/upgrade-to-${{ steps.check-version.outputs.latest_version_tag }}"

extractors/cds/tools/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ node dist/cds-extractor.js /path/to/source/root
6363

6464
## Development
6565

66+
> **⚠️ IMPORTANT NOTE**: Any changes to the CDS extractor's compilation task behavior (including how and where `cds compile` commands are executed, project detection logic, or output file generation patterns) **MUST** be reflected in the `extractors/cds/tools/test/cds-compilation-for-actions.test.sh` script. The `.github/workflows/run-codeql-unit-tests-javascript.yml` workflow executes this script during the "Compile CAP CDS files" step to simulate the CDS extractor's compilation process for unit tests. If the script and extractor implementations diverge, the `CodeQL - Run Unit Tests (javascript)` workflow will fail on PRs, causing status check failures. Always review and update the test script when modifying compilation behavior to maintain consistency between local testing and CI/CD environments.
67+
6668
### Project Structure
6769

6870
```text

extractors/cds/tools/cds-extractor.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
logPerformanceTrackingStop,
1818
setSourceRootDirectory,
1919
} from './src/logging';
20-
import { installDependencies } from './src/packageManager';
20+
import { cacheInstallDependencies } from './src/packageManager';
2121
import { validateArguments } from './src/utils';
2222

2323
// Validate the script arguments.
@@ -99,7 +99,7 @@ try {
9999
for (const [projectDir, project] of dependencyGraph.projects.entries()) {
100100
cdsExtractorLog(
101101
'info',
102-
`Project: ${projectDir}, Status: ${project.status}, CDS files: ${project.cdsFiles.length}, Compilations to run: ${project.cdsFilesToCompile.length}`,
102+
`Project: ${projectDir}, Status: ${project.status}, CDS files: ${project.cdsFiles.length}, Compilation targets: ${project.compilationTargets.length}`,
103103
);
104104
}
105105
} else {
@@ -151,7 +151,7 @@ try {
151151
}
152152

153153
logPerformanceTrackingStart('Dependency Installation');
154-
const projectCacheDirMap = installDependencies(dependencyGraph, sourceRoot, codeqlExePath);
154+
const projectCacheDirMap = cacheInstallDependencies(dependencyGraph, sourceRoot, codeqlExePath);
155155
logPerformanceTrackingStop('Dependency Installation');
156156

157157
// Check if dependency installation resulted in any usable project mappings

0 commit comments

Comments
 (0)