Skip to content

Commit c724f57

Browse files
committed
Initial commit
1 parent f5c5592 commit c724f57

17 files changed

Lines changed: 1287 additions & 1 deletion

.github/workflows/baseline.yml

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
name: Generate baseline
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
srcml_version:
7+
description: "Override srcml release version (default: read from config)"
8+
required: false
9+
default: ""
10+
kernel_tag:
11+
description: "Override Linux kernel tag (default: read from config)"
12+
required: false
13+
default: ""
14+
dry_run:
15+
description: "Build the archive but skip publishing a release / opening a PR"
16+
required: false
17+
default: "false"
18+
19+
permissions:
20+
contents: write
21+
pull-requests: write
22+
23+
concurrency:
24+
group: baseline-${{ inputs.srcml_version }}-${{ inputs.kernel_tag }}
25+
cancel-in-progress: false
26+
27+
jobs:
28+
generate:
29+
runs-on: ubuntu-latest
30+
timeout-minutes: 300
31+
steps:
32+
- uses: actions/checkout@v4
33+
34+
- name: Install host deps
35+
run: |
36+
sudo apt-get update
37+
sudo apt-get install -y zstd git curl ca-certificates jq
38+
39+
- name: Install mikefarah yq
40+
run: |
41+
sudo curl -fsSL -o /usr/local/bin/yq \
42+
https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
43+
sudo chmod +x /usr/local/bin/yq
44+
yq --version
45+
46+
- name: Resolve config
47+
id: cfg
48+
run: |
49+
set -euo pipefail
50+
SV="$(yq -p toml '.srcml.version' config/baseline.toml)"
51+
OS="$(lsb_release -rs)"
52+
KR="$(yq -p toml '.kernel.repo' config/baseline.toml)"
53+
KT="$(yq -p toml '.kernel.tag' config/baseline.toml)"
54+
FLAGS="$(yq -p toml -r '.srcml_flags | join(" ")' config/baseline.toml)"
55+
56+
# dispatch overrides
57+
[ -n "${{ inputs.srcml_version }}" ] && SV="${{ inputs.srcml_version }}"
58+
[ -n "${{ inputs.kernel_tag }}" ] && KT="${{ inputs.kernel_tag }}"
59+
60+
TAG="baseline-linux-${KT}-srcml-${SV}"
61+
62+
{
63+
echo "srcml_version=$SV"
64+
echo "srcml_os=$OS"
65+
echo "kernel_repo=$KR"
66+
echo "kernel_tag=$KT"
67+
echo "srcml_flags=$FLAGS"
68+
echo "release_tag=$TAG"
69+
echo "xml_name=${TAG}.xml"
70+
echo "zst_name=${TAG}.xml.zst"
71+
echo "manifest_name=${TAG}.manifest.json"
72+
echo "log_name=${TAG}.generate.log"
73+
} >> "$GITHUB_OUTPUT"
74+
75+
- name: Install pinned srcml release
76+
env:
77+
SV: ${{ steps.cfg.outputs.srcml_version }}
78+
OS: ${{ steps.cfg.outputs.srcml_os }}
79+
run: |
80+
set -euxo pipefail
81+
URL="https://github.com/srcML/srcML/releases/download/v${SV}/srcml_${SV}-1_ubuntu${OS}_amd64.deb"
82+
curl -fsSL -o srcml.deb "$URL"
83+
sudo apt-get install -y ./srcml.deb
84+
srcml --version
85+
86+
- name: Clone Linux kernel
87+
env:
88+
KR: ${{ steps.cfg.outputs.kernel_repo }}
89+
KT: ${{ steps.cfg.outputs.kernel_tag }}
90+
run: |
91+
set -euxo pipefail
92+
git clone --depth 1 --branch "$KT" "$KR" linux
93+
94+
- name: Generate baseline archive
95+
id: gen
96+
env:
97+
SRCML_BIN: srcml
98+
SRCML_FLAGS: ${{ steps.cfg.outputs.srcml_flags }}
99+
INPUT_DIR: linux
100+
OUTPUT_XML: ${{ steps.cfg.outputs.xml_name }}
101+
OUTPUT_ZST: ${{ steps.cfg.outputs.zst_name }}
102+
LOG_FILE: ${{ steps.cfg.outputs.log_name }}
103+
run: ./scripts/generate_baseline.sh
104+
105+
- name: Emit manifest
106+
id: manifest
107+
env:
108+
SV: ${{ steps.cfg.outputs.srcml_version }}
109+
KT: ${{ steps.cfg.outputs.kernel_tag }}
110+
FLAGS: ${{ steps.cfg.outputs.srcml_flags }}
111+
RAW: ${{ steps.gen.outputs.raw_bytes }}
112+
ZST: ${{ steps.gen.outputs.zst_bytes }}
113+
SHA: ${{ steps.gen.outputs.sha256 }}
114+
ZST_NAME: ${{ steps.cfg.outputs.zst_name }}
115+
MANIFEST_NAME: ${{ steps.cfg.outputs.manifest_name }}
116+
run: |
117+
jq -n \
118+
--arg srcml_version "$SV" \
119+
--arg kernel_tag "$KT" \
120+
--arg flags "$FLAGS" \
121+
--arg asset_name "$ZST_NAME" \
122+
--arg bytes_raw "$RAW" \
123+
--arg bytes_zst "$ZST" \
124+
--arg sha256 "$SHA" \
125+
--arg generated_at "$(date --iso-8601=seconds)" \
126+
--arg runner_os "$(lsb_release -ds 2>/dev/null || uname -a)" \
127+
'{
128+
srcml_version:$srcml_version,
129+
kernel_tag:$kernel_tag,
130+
flags:$flags,
131+
asset_name:$asset_name,
132+
bytes_raw:($bytes_raw|tonumber),
133+
bytes_compressed:($bytes_zst|tonumber),
134+
sha256:$sha256,
135+
generated_at:$generated_at,
136+
runner_os:$runner_os
137+
}' > "$MANIFEST_NAME"
138+
cat "$MANIFEST_NAME"
139+
140+
- name: Upload scratch artifact (dry_run path)
141+
if: ${{ inputs.dry_run == 'true' }}
142+
uses: actions/upload-artifact@v4
143+
with:
144+
name: baseline-dry-run-${{ steps.cfg.outputs.release_tag }}
145+
path: |
146+
${{ steps.cfg.outputs.zst_name }}
147+
${{ steps.cfg.outputs.manifest_name }}
148+
${{ steps.cfg.outputs.log_name }}
149+
retention-days: 14
150+
151+
- name: Publish GitHub Release
152+
if: ${{ inputs.dry_run != 'true' }}
153+
env:
154+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
155+
TAG: ${{ steps.cfg.outputs.release_tag }}
156+
SV: ${{ steps.cfg.outputs.srcml_version }}
157+
KT: ${{ steps.cfg.outputs.kernel_tag }}
158+
ZST_NAME: ${{ steps.cfg.outputs.zst_name }}
159+
MANIFEST_NAME: ${{ steps.cfg.outputs.manifest_name }}
160+
LOG_NAME: ${{ steps.cfg.outputs.log_name }}
161+
run: |
162+
set -euxo pipefail
163+
if gh release view "$TAG" >/dev/null 2>&1; then
164+
gh release upload "$TAG" "$ZST_NAME" "$MANIFEST_NAME" "$LOG_NAME" --clobber
165+
else
166+
gh release create "$TAG" \
167+
--title "Baseline: linux $KT / srcml $SV" \
168+
--notes "Baseline srcML archive. srcml=$SV, kernel=$KT. See $MANIFEST_NAME for sha256 and flags." \
169+
--latest=false \
170+
"$ZST_NAME" "$MANIFEST_NAME" "$LOG_NAME"
171+
fi
172+
173+
- name: Write pointer update
174+
if: ${{ inputs.dry_run != 'true' }}
175+
env:
176+
TAG: ${{ steps.cfg.outputs.release_tag }}
177+
run: |
178+
yq -i -p toml -o toml '.current_baseline_release = strenv(TAG)' config/baseline.toml
179+
180+
- name: Open baseline pointer PR
181+
if: ${{ inputs.dry_run != 'true' }}
182+
uses: peter-evans/create-pull-request@v6
183+
with:
184+
commit-message: "chore: point baseline to ${{ steps.cfg.outputs.release_tag }}"
185+
branch: baseline-pointer/${{ steps.cfg.outputs.release_tag }}
186+
title: "Update baseline pointer → ${{ steps.cfg.outputs.release_tag }}"
187+
body: |
188+
Automated PR to update `config/baseline.toml` → `current_baseline_release`.
189+
190+
- srcml version: ${{ steps.cfg.outputs.srcml_version }}
191+
- kernel tag: ${{ steps.cfg.outputs.kernel_tag }}
192+
- release tag: ${{ steps.cfg.outputs.release_tag }}
193+
194+
Release assets are published. Merge to make downstream runs use this baseline.
195+
add-paths: |
196+
config/baseline.toml
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
name: Full-pipeline self-test
2+
3+
# Exercises the whole regression pipeline:
4+
# 1. Build srcml from source on ubuntu-latest via the ci-ubuntu cmake workflow preset.
5+
# 2. Collect the .deb produced by CPack.
6+
# 3. Call this repo's reusable regression-test.yml against the current baseline.
7+
#
8+
# Requires: a baseline release must already be published (run baseline.yml first).
9+
10+
on:
11+
workflow_dispatch:
12+
inputs:
13+
srcml_ref:
14+
description: "srcML git ref to build (tag, branch, or SHA)"
15+
required: false
16+
default: "v1.1.0"
17+
baseline_release_tag:
18+
description: "Override current_baseline_release (leave empty to use config)"
19+
required: false
20+
default: ""
21+
fail_on_regression:
22+
description: "Fail the workflow if the regression test reports failures"
23+
required: false
24+
type: boolean
25+
default: true
26+
27+
permissions:
28+
contents: read
29+
30+
concurrency:
31+
group: full-pipeline-${{ github.ref }}-${{ inputs.srcml_ref }}
32+
cancel-in-progress: true
33+
34+
jobs:
35+
build-srcml:
36+
runs-on: ubuntu-latest
37+
timeout-minutes: 60
38+
outputs:
39+
artifact_name: ${{ steps.upload.outputs.artifact-name }}
40+
steps:
41+
- name: Checkout srcML source
42+
uses: actions/checkout@v4
43+
with:
44+
repository: srcML/srcML
45+
ref: ${{ inputs.srcml_ref }}
46+
path: srcML
47+
48+
- name: Install build dependencies
49+
run: |
50+
sudo apt-get update
51+
sudo apt-get install -y \
52+
antlr libantlr-dev libantlr-java \
53+
libarchive-dev libcurl4-openssl-dev \
54+
libxml2-dev libxml2-utils libxslt1-dev \
55+
cmake ninja-build g++ dpkg-dev
56+
57+
- name: Run cmake ci-ubuntu workflow preset
58+
id: cmake_workflow
59+
working-directory: srcML
60+
continue-on-error: true
61+
run: |
62+
set -euxo pipefail
63+
cmake --workflow --preset ci-ubuntu
64+
65+
- name: Locate .deb artifacts
66+
id: locate
67+
run: |
68+
set -euo pipefail
69+
# ci-ubuntu uses ci-sibling-build -> build dir is srcML-build/ alongside srcML/
70+
BUILD_DIR="srcML-build"
71+
DIST_DIR="${BUILD_DIR}/dist"
72+
if [ ! -d "$DIST_DIR" ]; then
73+
echo "::error::CPack output directory not found: $DIST_DIR"
74+
echo "cmake workflow outcome: ${{ steps.cmake_workflow.outcome }}"
75+
ls -la "$BUILD_DIR" || true
76+
exit 1
77+
fi
78+
ls -la "$DIST_DIR"
79+
80+
mkdir -p installer
81+
# srcml_*.deb is required; srcml-dev_*.deb is optional
82+
if ! compgen -G "${DIST_DIR}/srcml_*.deb" > /dev/null; then
83+
echo "::error::no srcml_*.deb produced by CPack"
84+
exit 1
85+
fi
86+
cp "${DIST_DIR}"/srcml_*.deb installer/
87+
cp "${DIST_DIR}"/srcml-dev_*.deb installer/ 2>/dev/null || true
88+
ls -la installer/
89+
echo "deb_count=$(ls installer/*.deb | wc -l)" >> "$GITHUB_OUTPUT"
90+
91+
- name: Upload installer artifact
92+
id: upload
93+
uses: actions/upload-artifact@v4
94+
with:
95+
name: srcml-installer-from-source
96+
path: installer/
97+
if-no-files-found: error
98+
99+
regression:
100+
needs: build-srcml
101+
uses: ./.github/workflows/regression-test.yml
102+
with:
103+
srcml-installer-artifact-name: srcml-installer-from-source
104+
baseline-release-tag: ${{ inputs.baseline_release_tag }}
105+
fail-on-regression: ${{ inputs.fail_on_regression }}
106+
artifact-name: full-pipeline-regression-results

0 commit comments

Comments
 (0)