Skip to content

Commit be1d349

Browse files
committed
ci: run CI and e2e on ubuntu-26.04, with infra-e2e importing kind images per platform
Docker 29 (ubuntu-26.04 runners) uses the containerd image store, where a pulled multi-platform image holds only the host platform; importing every platform into kind failed for the OAP image ("content digest ... not found"). Saved for one platform, the archive also lists the image's referrers, such as attestations, at its top level, and the containerd 1.7 kindest/node:v1.28.15 these cases pin imports each one as an image, which failed for the Rover image ("mismatched image rootfs and manifest layers"). infra-e2e now saves only the node platform and leaves the referrers out of the archive (apache/skywalking-infra-e2e#150, #151), so the e2e cases leave the ubuntu-24.04 pin #205 added. The CI and e2e jobs name ubuntu-26.04 rather than ubuntu-latest: ubuntu-latest jobs sat queued with no runner while jobs naming ubuntu-24.04 or ubuntu-26.04 started within seconds. The istio mesh and eBPF profiling specs accept `UNKNOWN` as the service the MESH header opens on (MESH_HEADER_SERVICES; MESH_SERVICES still lists only the real workloads). Since the e2e OAP pin moved past apache/skywalking#14135 (#204), OAP reads the Kubernetes metadata of a new pod address in the background, so bookinfo's first calls count under `UNKNOWN`; in the first minute of traffic that burst can rank first by calls per minute, and the header then picks it. It failed so on main at ed6171d (ubuntu-24.04) as well as here. A mesh whose calls all count under `UNKNOWN` still fails: the mesh spec requires every bookinfo peer in the service picker.
1 parent ed6171d commit be1d349

5 files changed

Lines changed: 24 additions & 14 deletions

File tree

‎.github/workflows/ci.yaml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
# container action that would otherwise sit behind the toolchain setup the
3333
# build job spends its first half-minute on.
3434
name: License header
35-
runs-on: ubuntu-latest
35+
runs-on: ubuntu-26.04
3636
timeout-minutes: 10
3737
steps:
3838
- uses: actions/checkout@v6
@@ -48,7 +48,7 @@ jobs:
4848
# the setup cost eight times over. Steps run cheapest-first so a lint or
4949
# type error reports before the package build starts.
5050
name: Build and check
51-
runs-on: ubuntu-latest
51+
runs-on: ubuntu-26.04
5252
timeout-minutes: 30
5353
steps:
5454
- uses: actions/checkout@v6
@@ -252,7 +252,7 @@ jobs:
252252
# `test/e2e/script/env` pins, on an ephemeral port, and stops it after. No
253253
# service container to declare and no port to collide with.
254254
name: BanyanDB client IT
255-
runs-on: ubuntu-latest
255+
runs-on: ubuntu-26.04
256256
timeout-minutes: 20
257257
steps:
258258
- uses: actions/checkout@v6
@@ -278,7 +278,7 @@ jobs:
278278
if: always() && !cancelled()
279279
name: Required
280280
needs: [license-header, build-and-check, banyandb-client-it]
281-
runs-on: ubuntu-latest
281+
runs-on: ubuntu-26.04
282282
timeout-minutes: 5
283283
steps:
284284
- name: Check upstream jobs

‎.github/workflows/e2e.yaml‎

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,7 @@ concurrency:
225225
jobs:
226226
e2e:
227227
name: ${{ matrix.case.name }}
228-
# Not ubuntu-latest: on ubuntu-26.04, kind cannot load the multi-platform
229-
# OAP image into its node (`ctr images import --all-platforms`: content
230-
# digest not found), so the kind cases fail before any test runs.
231-
runs-on: ubuntu-24.04
228+
runs-on: ubuntu-26.04
232229
timeout-minutes: 45
233230
strategy:
234231
# One case failing must not cancel the others: when several go red at
@@ -292,7 +289,7 @@ jobs:
292289
run: make -C test/e2e images
293290

294291
- name: ${{ matrix.case.name }}
295-
uses: apache/skywalking-infra-e2e@68bbdec303cf2d3df9f2353f970f91938b52f674
292+
uses: apache/skywalking-infra-e2e@ed91851a723f7d09e99742f28835ee91758e0c2b
296293
with:
297294
e2e-file: $GITHUB_WORKSPACE/${{ matrix.case.config }}
298295
# Container logs land here. On a red run they answer the first
@@ -330,7 +327,7 @@ jobs:
330327
name: E2E Required
331328
if: always() && !cancelled()
332329
needs: [e2e]
333-
runs-on: ubuntu-latest
330+
runs-on: ubuntu-26.04
334331
steps:
335332
- name: Assert every case passed
336333
run: |

‎test/e2e/playwright/specs/fixture.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,19 @@ export const MESH_PEERS = ['productpage', 'reviews', 'details'];
148148
*/
149149
export const MESH_SERVICES = [...MESH_PEERS, 'ratings', 'istio-ingressgateway'];
150150

151+
/**
152+
* The services the MESH layer header may open on: MESH_SERVICES plus OAP's
153+
* `UNKNOWN`. OAP reads the Kubernetes metadata of a new pod address in the
154+
* background rather than waiting for it (apache/skywalking#14135), so
155+
* bookinfo's first calls count under `UNKNOWN`, and in the first minute of
156+
* traffic that burst can rank above every workload.
157+
*
158+
* Only for the header's pick. A mesh whose calls ALL count under `UNKNOWN`
159+
* must still fail, and it does on mesh.spec.ts's roster check, which requires
160+
* every MESH_PEERS workload.
161+
*/
162+
export const MESH_HEADER_SERVICES = [...MESH_SERVICES, 'UNKNOWN'];
163+
151164
/**
152165
* The SAME workload in the MESH_DP layer, which names services
153166
* `<workload>.<namespace>`. ALS produces both sets, and they are not

‎test/e2e/playwright/specs/istio-profiling/ebpf.spec.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717

1818
import { test, expect } from '../support/diagnostics.js';
19-
import { MESH_LAYER, MESH_SERVICES } from '../fixture.js';
19+
import { MESH_LAYER, MESH_HEADER_SERVICES } from '../fixture.js';
2020

2121
// Profiling pages, which exist only where rover does.
2222
//
@@ -43,7 +43,7 @@ test('the eBPF profiling page mounts and resolves a service', async ({ page, pag
4343
// ours.
4444
const selected = page.locator('.service-row .svc-name');
4545
await expect(selected).toBeVisible({ timeout: 60_000 });
46-
await expect(selected).toHaveText(new RegExp(`^(${MESH_SERVICES.join('|')})$`));
46+
await expect(selected).toHaveText(new RegExp(`^(${MESH_HEADER_SERVICES.join('|')})$`));
4747

4848
expect(pageErrors, 'an uncaught error during mount blanks the page').toEqual([]);
4949
});

‎test/e2e/playwright/specs/istio/mesh.spec.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { test, expect } from '../support/diagnostics.js';
1919
import {
2020
MESH_LAYER,
2121
MESH_PEERS,
22-
MESH_SERVICES,
22+
MESH_HEADER_SERVICES,
2323
MESH_DP_LAYER,
2424
MESH_DP_SUFFIX,
2525
} from '../fixture.js';
@@ -41,7 +41,7 @@ test('the mesh layer lists services built from Envoy access logs', async ({ page
4141
// member of the known set instead.
4242
const selected = page.locator('.service-row .svc-name');
4343
await expect(selected).toBeVisible({ timeout: 45_000 });
44-
await expect(selected).toHaveText(new RegExp(`^(${MESH_SERVICES.join('|')})$`));
44+
await expect(selected).toHaveText(new RegExp(`^(${MESH_HEADER_SERVICES.join('|')})$`));
4545

4646
// The roster itself is the real assertion: every one of these exists only
4747
// because OAP analysed Envoy access logs into mesh entities. No agent

0 commit comments

Comments
 (0)