Skip to content

Commit 6bced9f

Browse files
Copiloteuropaul
authored andcommitted
Add Eden version selection based on PR target branch
- Add pr_base_ref capture in pr-gate.yml - Create eden-version-map.yml with branch-to-version mapping - Modify eden-trusted.yml to select Eden version dynamically - Map LTS branches (13.4-stable, 14.5-stable) to Eden 1.0.9 - Map all other branches to Eden 1.0.13 GH actions don't support dynamic workflow names, so we have to take a workaround through scripts. Signed-off-by: Paul Gaiduk <paulg@zededa.com>
1 parent 99cc7d4 commit 6bced9f

File tree

3 files changed

+152
-11
lines changed

3 files changed

+152
-11
lines changed

.github/eden-version-map.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright (c) 2025, Zededa, Inc.
2+
# SPDX-License-Identifier: Apache-2.0
3+
---
4+
# Eden version mapping for different EVE branches
5+
# Maps EVE base branch names to Eden workflow versions
6+
# Format:
7+
# branch-name:
8+
# eden_version: "<version>"
9+
10+
# LTS releases (13.4 and 14.5) use older Eden version
11+
13.4-stable:
12+
eden_version: "1.0.9"
13+
14+
14.5-stable:
15+
eden_version: "1.0.9"
16+
17+
# Default mapping for all other branches (master, development branches, etc.)
18+
default:
19+
eden_version: "1.0.13"

.github/workflows/eden-trusted.yml

Lines changed: 128 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
pr_id: ${{ steps.extract.outputs.pr_id }}
2929
original_run_id: ${{ steps.extract.outputs.original_run_id }}
3030
pr_sha: ${{ steps.extract.outputs.pr_sha }}
31+
pr_base_ref: ${{ steps.extract.outputs.pr_base_ref }}
3132
hv: ${{ steps.extract.outputs.hv }}
3233
arch: ${{ steps.extract.outputs.arch }}
3334
platform: ${{ steps.extract.outputs.platform }}
@@ -64,7 +65,7 @@ jobs:
6465
if: ${{ steps.check_gate.outputs.skip_run == 'false' }}
6566
env:
6667
RUN_CONTEXT_FILE: ${{ env.RUN_CONTEXT_FILE }}
67-
REQUIRED_FIELDS: pr_id, original_run_id, pr_sha, hv, arch, platform, gate_run_id, gate_status_name
68+
REQUIRED_FIELDS: pr_id, original_run_id, pr_sha, pr_base_ref, hv, arch, platform, gate_run_id, gate_status_name
6869
run: |
6970
if [[ ! -f "$RUN_CONTEXT_FILE" ]]; then
7071
echo "$RUN_CONTEXT_FILE file not found"
@@ -95,7 +96,7 @@ jobs:
9596
if: ${{ steps.check_gate.outputs.skip_run == 'false' }}
9697
id: extract
9798
env:
98-
FIELDS: pr_id, original_run_id, pr_sha, hv, arch, platform, gate_run_id, gate_status_name
99+
FIELDS: pr_id, original_run_id, pr_sha, pr_base_ref, hv, arch, platform, gate_run_id, gate_status_name
99100
run: |
100101
# Extract fields from the JSON file
101102
for field in $(echo "$FIELDS" | tr ',' ' '); do
@@ -175,18 +176,134 @@ jobs:
175176
}
176177
177178
179+
select_eden_version:
180+
name: Select Eden Version
181+
runs-on: ubuntu-latest
182+
needs: context
183+
if: needs.context.outputs.skip_run == 'false'
184+
outputs:
185+
eden_version: ${{ steps.select.outputs.eden_version }}
186+
steps:
187+
- name: Checkout repository
188+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
189+
190+
- name: Select Eden version based on target branch
191+
id: select
192+
env:
193+
BASE_REF: ${{ needs.context.outputs.pr_base_ref }}
194+
run: |
195+
MAPPING_FILE=".github/eden-version-map.yml"
196+
197+
if [[ ! -f "$MAPPING_FILE" ]]; then
198+
echo "::error::Eden version mapping file not found: $MAPPING_FILE"
199+
exit 1
200+
fi
201+
202+
echo "PR target branch: $BASE_REF"
203+
204+
# Try to get the mapping for the specific branch
205+
eden_version=$(yq eval ".\"$BASE_REF\".eden_version" "$MAPPING_FILE")
206+
207+
# If no specific mapping exists, use the default
208+
if [[ "$eden_version" == "null" || -z "$eden_version" ]]; then
209+
echo "No specific mapping found for branch '$BASE_REF', using default"
210+
eden_version=$(yq eval '.default.eden_version' "$MAPPING_FILE")
211+
fi
212+
213+
# Verify that we have valid values
214+
if [[ "$eden_version" == "null" || -z "$eden_version" ]]; then
215+
echo "::error::Failed to determine eden_version for branch '$BASE_REF'"
216+
exit 1
217+
fi
218+
219+
echo "Selected Eden version: $eden_version"
220+
221+
echo "eden_version=$eden_version" >> "$GITHUB_OUTPUT"
222+
223+
178224
tests:
179225
name: ${{ needs.context.outputs.eden_parent_job_title }}
180-
needs: context
226+
needs: [context, select_eden_version]
181227
if: needs.context.outputs.skip_run == 'false'
182-
uses: lf-edge/eden/.github/workflows/test.yml@1.0.13
183-
secrets: inherit
184-
with:
185-
eve_image: "evebuild/pr:${{ needs.context.outputs.pr_id }}"
186-
eve_log_level: "debug"
187-
eve_artifact_name: "eve-${{ needs.context.outputs.hv }}-${{ needs.context.outputs.arch }}-${{ needs.context.outputs.platform }}"
188-
artifact_run_id: ${{ needs.context.outputs.original_run_id }}
189-
eden_version: "1.0.13"
228+
runs-on: ubuntu-latest
229+
steps:
230+
- name: Trigger Eden tests via repository dispatch
231+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
232+
env:
233+
EDEN_VERSION: ${{ needs.select_eden_version.outputs.eden_version }}
234+
EVE_IMAGE: "evebuild/pr:${{ needs.context.outputs.pr_id }}"
235+
EVE_ARTIFACT_NAME: "eve-${{ needs.context.outputs.hv }}-${{ needs.context.outputs.arch }}-${{ needs.context.outputs.platform }}"
236+
ARTIFACT_RUN_ID: ${{ needs.context.outputs.original_run_id }}
237+
with:
238+
script: |
239+
const [owner, repo] = 'lf-edge/eden'.split('/');
240+
const dispatchResponse = await github.rest.actions.createWorkflowDispatch({
241+
owner,
242+
repo,
243+
workflow_id: 'test.yml',
244+
ref: process.env.EDEN_VERSION,
245+
inputs: {
246+
eve_image: process.env.EVE_IMAGE,
247+
eve_log_level: 'debug',
248+
eve_artifact_name: process.env.EVE_ARTIFACT_NAME,
249+
artifact_run_id: process.env.ARTIFACT_RUN_ID,
250+
eden_version: process.env.EDEN_VERSION
251+
}
252+
});
253+
254+
// Wait briefly for the workflow run to be created
255+
await new Promise(resolve => setTimeout(resolve, 2000));
256+
257+
// Get the workflow run that was just triggered
258+
const { data: runs } = await github.rest.actions.listWorkflowRuns({
259+
owner,
260+
repo,
261+
workflow_id: 'test.yml',
262+
branch: process.env.EDEN_VERSION,
263+
per_page: 1
264+
});
265+
266+
const triggeredRunId = runs.workflow_runs[0]?.id;
267+
if (triggeredRunId) {
268+
core.setOutput('eden_run_id', triggeredRunId);
269+
console.log(`Triggered Eden workflow run ID: ${triggeredRunId}`);
270+
} else {
271+
console.log('Warning: Could not retrieve triggered workflow run ID');
272+
}
273+
});
274+
275+
// Wait for the Eden workflow to complete
276+
console.log('Waiting for Eden workflow to complete...');
277+
let workflowCompleted = false;
278+
let conclusion = null;
279+
const maxWaitTime = 4 * 60 * 60 * 1000; // 4 hours
280+
const pollInterval = 30000; // 30 seconds
281+
const startTime = Date.now();
282+
283+
while (!workflowCompleted && (Date.now() - startTime) < maxWaitTime) {
284+
const { data: run } = await github.rest.actions.getWorkflowRun({
285+
owner,
286+
repo,
287+
run_id: triggeredRunId
288+
});
289+
290+
if (run.status === 'completed') {
291+
workflowCompleted = true;
292+
conclusion = run.conclusion;
293+
console.log(`Eden workflow completed with conclusion: ${conclusion}`);
294+
} else {
295+
console.log(`Eden workflow status: ${run.status}, waiting...`);
296+
await new Promise(resolve => setTimeout(resolve, pollInterval));
297+
}
298+
}
299+
300+
if (!workflowCompleted) {
301+
core.setFailed('Eden workflow did not complete within the timeout period');
302+
} else if (conclusion !== 'success') {
303+
core.setFailed(`Eden workflow completed with conclusion: ${conclusion}`);
304+
}
305+
306+
core.setOutput('eden_conclusion', conclusion);
190307
191308
finalize:
192309
name: Finalize Eden Runner status

.github/workflows/pr-gate.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ jobs:
4545
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
4646
run: |
4747
pr_id=$(gh api /search/issues -X GET -f q="type:pr is:open repo:${GH_REPO} sha:${{ github.event.workflow_run.head_sha }}" -q '.items[0].number')
48+
pr_base_ref=$(gh pr view "$pr_id" --json baseRefName -q '.baseRefName')
4849
echo "pr_id=$pr_id" >> "$GITHUB_OUTPUT"
4950
echo "pr_sha=${{ github.event.workflow_run.head_sha }}" >> "$GITHUB_OUTPUT"
5051
echo "original_run_id=${{ github.event.workflow_run.id }}" >> "$GITHUB_OUTPUT"
52+
echo "pr_base_ref=$pr_base_ref" >> "$GITHUB_OUTPUT"
5153
5254
- name: Gather Context (pull_request_review)
5355
id: from_review
@@ -60,13 +62,15 @@ jobs:
6062
echo "pr_id=${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT"
6163
echo "pr_sha=$pr_sha" >> "$GITHUB_OUTPUT"
6264
echo "original_run_id=$original_run_id" >> "$GITHUB_OUTPUT"
65+
echo "pr_base_ref=${{ github.event.pull_request.base.ref }}" >> "$GITHUB_OUTPUT"
6366
6467
- name: Promote Context for Local Use
6568
id: meta
6669
run: |
6770
echo "pr_id=${{ steps.from_run.outputs.pr_id || steps.from_review.outputs.pr_id }}" >> "$GITHUB_OUTPUT"
6871
echo "pr_sha=${{ steps.from_run.outputs.pr_sha || steps.from_review.outputs.pr_sha }}" >> "$GITHUB_OUTPUT"
6972
echo "original_run_id=${{ steps.from_run.outputs.original_run_id || steps.from_review.outputs.original_run_id }}" >> "$GITHUB_OUTPUT"
73+
echo "pr_base_ref=${{ steps.from_run.outputs.pr_base_ref || steps.from_review.outputs.pr_base_ref }}" >> "$GITHUB_OUTPUT"
7074
7175
- name: Check Review Decision
7276
id: reviews
@@ -123,6 +127,7 @@ jobs:
123127
echo '{ "pr_id": "${{ steps.meta.outputs.pr_id }}",
124128
"original_run_id": "${{ steps.meta.outputs.original_run_id }}",
125129
"pr_sha": "${{ steps.meta.outputs.pr_sha }}",
130+
"pr_base_ref": "${{ steps.meta.outputs.pr_base_ref }}",
126131
"hv": "${{ matrix.hv }}",
127132
"arch": "${{ matrix.arch }}",
128133
"platform": "${{ matrix.platform }}",

0 commit comments

Comments
 (0)