mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-04 19:28:46 +01:00
Merge current master lifecycle and CI fixes into Claude behavior
Co-Authored-By: Paperclip <noreply@paperclip.ing> * codex/claude-runner-protocol: fix(grok): avoid routine wakes for proactive admission (#16422) feat(ci): profile full CODEOWNER PR suites in Honeycomb (#16378) test: bound command snapshot forwarding checks (#16421) fix(agents): report actionable lifecycle failure steps (#16418)
This commit is contained in:
commit
bd3ceab2b2
50 files changed
+1630
-60
No files matched your search
@@ -0,0 +1,41 @@
|
||||
name: CI profile
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: [PR]
|
||||
types: [completed]
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
pull-requests: read
|
||||
|
||||
jobs:
|
||||
export:
|
||||
if: >-
|
||||
github.repository == 'paperclipai/paperclip' &&
|
||||
github.event.workflow_run.event == 'pull_request' &&
|
||||
startsWith(github.event.workflow_run.display_title, 'CI profile · PR #')
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
# This environment permits only the master branch. Do not use a repository
|
||||
# secret: an in-repository PR must not be able to request this credential.
|
||||
environment: ci-profiling
|
||||
steps:
|
||||
# workflow_run is privileged. Never check out its head SHA or run code
|
||||
# from downloaded artifacts. This checkout is the trusted default branch.
|
||||
- name: Checkout trusted exporter
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
ref: ${{ github.sha }}
|
||||
persist-credentials: false
|
||||
sparse-checkout: scripts/ci-profile
|
||||
|
||||
- name: Export selected complete CI attempt
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
HONEYCOMB_CI_API_KEY: ${{ secrets.HONEYCOMB_CI_API_KEY }}
|
||||
HONEYCOMB_CI_DATASET: paperclip-ci
|
||||
HONEYCOMB_TEAM: paperclip
|
||||
HONEYCOMB_ENVIRONMENT: test
|
||||
run: node scripts/ci-profile/export.mjs
|
||||
@@ -8,6 +8,8 @@ on:
|
||||
value: ${{ jobs.gate.outputs.runner }}
|
||||
full_ci:
|
||||
value: ${{ jobs.gate.outputs.full_ci }}
|
||||
profile_ci:
|
||||
value: ${{ jobs.gate.outputs.profile_ci }}
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
@@ -22,6 +24,7 @@ jobs:
|
||||
outputs:
|
||||
runner: ${{ steps.route.outputs.runner }}
|
||||
full_ci: ${{ steps.scope.outputs.full_ci }}
|
||||
profile_ci: ${{ steps.profile.outputs.profile_ci }}
|
||||
|
||||
steps:
|
||||
- name: Validate PR identity and select runner
|
||||
@@ -35,6 +38,7 @@ jobs:
|
||||
EVENT_REPOSITORY: ${{ github.repository }}
|
||||
EVENT_REPOSITORY_ID: ${{ github.repository_id }}
|
||||
EVENT_ACTION: ${{ github.event.action }}
|
||||
EVENT_LABEL_NAME: ${{ github.event.label.name }}
|
||||
EVENT_PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
EVENT_PR_AUTHOR_ID: ${{ github.event.pull_request.user.id }}
|
||||
EVENT_SENDER_ID: ${{ github.event.sender.id }}
|
||||
@@ -76,7 +80,10 @@ jobs:
|
||||
[[ "$EVENT_REPOSITORY_ID" == '1170821064' ]] || fail_closed 'unexpected repository ID'
|
||||
[[ "$EVENT_BASE_REPOSITORY_ID" == '1170821064' ]] || fail_closed 'unexpected base repository ID'
|
||||
[[ -n "$EVENT_BASE_REF" ]] || fail_closed 'missing base branch'
|
||||
[[ "$EVENT_ACTION" =~ ^(opened|reopened|synchronize)$ ]] || fail_closed 'unsupported pull_request action'
|
||||
[[ "$EVENT_ACTION" =~ ^(opened|reopened|synchronize|labeled)$ ]] || fail_closed 'unsupported pull_request action'
|
||||
if [[ "$EVENT_ACTION" == 'labeled' && "${EVENT_LABEL_NAME:-}" != 'profile-ci' ]]; then
|
||||
fail_closed 'only the profile-ci label can request a profiling run'
|
||||
fi
|
||||
|
||||
jq -e '
|
||||
type == "array" and
|
||||
@@ -215,6 +222,31 @@ jobs:
|
||||
echo "runner=$aws_runner" >> "$GITHUB_OUTPUT"
|
||||
echo '::notice title=AWS CI routing::Using an ephemeral RunsOn Fleet runner'
|
||||
|
||||
- name: Authorize CODEOWNERS CI profiling
|
||||
id: profile
|
||||
shell: bash
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
PROFILE_REQUESTED: ${{ contains(github.event.pull_request.labels.*.name, 'profile-ci') }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if [[ "$PROFILE_REQUESTED" != 'true' ]]; then
|
||||
echo 'profile_ci=false' >> "$GITHUB_OUTPUT"
|
||||
exit 0
|
||||
fi
|
||||
# Fetch only from canonical master, never the PR ref. Pin both the
|
||||
# authorization program and CODEOWNERS to the same trusted revision.
|
||||
if ! TRUSTED_PROFILE_SHA="$(gh api /repos/paperclipai/paperclip/git/ref/heads/master --jq .object.sha)" ||
|
||||
[[ ! "$TRUSTED_PROFILE_SHA" =~ ^[0-9a-f]{40}$ ]] ||
|
||||
! gh api -H 'Accept: application/vnd.github.raw+json' \
|
||||
"/repos/paperclipai/paperclip/contents/scripts/ci-profile/authorize.mjs?ref=$TRUSTED_PROFILE_SHA" \
|
||||
> "$RUNNER_TEMP/ci-profile-authorize.mjs"; then
|
||||
echo 'profile_ci=false' >> "$GITHUB_OUTPUT"
|
||||
exit 0
|
||||
fi
|
||||
export TRUSTED_PROFILE_SHA
|
||||
node "$RUNNER_TEMP/ci-profile-authorize.mjs"
|
||||
|
||||
- name: Select PR CI scope
|
||||
id: scope
|
||||
shell: bash
|
||||
@@ -223,6 +255,7 @@ jobs:
|
||||
EVENT_NAME: ${{ github.event_name }}
|
||||
EVENT_BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
||||
EVENT_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||
PROFILE_CI: ${{ steps.profile.outputs.profile_ci }}
|
||||
STACK_JSON: ${{ toJSON(github.event.pull_request.stack) }}
|
||||
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
|
||||
run: |
|
||||
@@ -293,6 +326,11 @@ jobs:
|
||||
reason='release notes only'
|
||||
fi
|
||||
|
||||
if [[ "${PROFILE_CI:-false}" == 'true' ]]; then
|
||||
full_ci='true'
|
||||
reason='profile-ci requests the complete PR suite'
|
||||
fi
|
||||
|
||||
echo "full_ci=$full_ci" >> "$GITHUB_OUTPUT"
|
||||
echo "::notice title=PR CI scope::$reason; full_ci=$full_ci"
|
||||
|
||||
@@ -11,6 +11,11 @@ permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
|
||||
# Test reporters write local artifacts only. The workflow_run exporter owns
|
||||
# the Honeycomb credential, so fork PRs cannot execute with it.
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE_DIR: ${{ github.workspace }}/.ci-profile
|
||||
|
||||
concurrency:
|
||||
group: pr-${{ github.event.pull_request.number }}
|
||||
cancel-in-progress: true
|
||||
@@ -24,6 +29,10 @@ jobs:
|
||||
runs-on: ${{ needs.gate.outputs.runner }}
|
||||
timeout-minutes: 10
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: policy
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
@@ -31,6 +40,20 @@ jobs:
|
||||
persist-credentials: false
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Select compatible Node test command
|
||||
run: |
|
||||
# A rerun can use this trusted workflow with a pre-feature checkout.
|
||||
if [[ -f scripts/ci-profile/node-test.mjs ]]; then
|
||||
echo 'CI_NODE_TEST=scripts/ci-profile/node-test.mjs' >> "$GITHUB_ENV"
|
||||
else
|
||||
echo 'CI_NODE_TEST=--test' >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
- name: Block manual lockfile edits
|
||||
if: >-
|
||||
github.head_ref != 'chore/refresh-lockfile' &&
|
||||
@@ -76,28 +99,28 @@ jobs:
|
||||
run: node ./scripts/check-no-git-push.mjs
|
||||
|
||||
- name: Test no-git-push check
|
||||
run: node --test ./scripts/check-no-git-push.test.mjs
|
||||
run: node "$CI_NODE_TEST" ./scripts/check-no-git-push.test.mjs
|
||||
|
||||
- name: Validate feature module boundaries
|
||||
run: pnpm check:module-boundaries
|
||||
|
||||
- name: Test feature module boundary check
|
||||
run: node --test ./scripts/check-module-boundaries.test.mjs
|
||||
run: node "$CI_NODE_TEST" ./scripts/check-module-boundaries.test.mjs
|
||||
|
||||
- name: Test PR quality-gate scripts
|
||||
run: node --test '.github/scripts/tests/*.test.mjs'
|
||||
run: node "$CI_NODE_TEST" '.github/scripts/tests/*.test.mjs'
|
||||
|
||||
- name: Test general-server shard partition
|
||||
run: node --test ./scripts/__tests__/run-vitest-stable-shard.test.mjs
|
||||
run: node "$CI_NODE_TEST" ./scripts/__tests__/run-vitest-stable-shard.test.mjs
|
||||
|
||||
- name: Test e2e shard partition
|
||||
run: node --test ./scripts/__tests__/e2e-shard.test.mjs
|
||||
run: node "$CI_NODE_TEST" ./scripts/__tests__/e2e-shard.test.mjs
|
||||
|
||||
- name: Test release verify workflow wiring
|
||||
run: node --test ./scripts/__tests__/release-verify-workflow.test.mjs ./scripts/cloud-source-verification.test.mjs ./scripts/standard-image-contract.test.mjs
|
||||
run: node "$CI_NODE_TEST" ./scripts/__tests__/release-verify-workflow.test.mjs ./scripts/cloud-source-verification.test.mjs ./scripts/standard-image-contract.test.mjs
|
||||
|
||||
- name: Test standalone package build concurrency
|
||||
run: node --test ./scripts/__tests__/build-standalone-concurrency.test.mjs
|
||||
run: node "$CI_NODE_TEST" ./scripts/__tests__/build-standalone-concurrency.test.mjs
|
||||
|
||||
- name: Validate release package manifest
|
||||
run: node ./scripts/release-package-map.mjs check
|
||||
@@ -113,6 +136,17 @@ jobs:
|
||||
- name: Validate dependency resolution
|
||||
run: pnpm install --resolution-only --ignore-scripts --no-frozen-lockfile
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
typecheck_release_registry:
|
||||
name: Typecheck + Release Registry
|
||||
needs: [gate]
|
||||
@@ -120,12 +154,21 @@ jobs:
|
||||
runs-on: ${{ needs.gate.outputs.runner }}
|
||||
timeout-minutes: 20
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: Typecheck + Release Registry
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Setup Node.js for pnpm bootstrap
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
||||
with:
|
||||
@@ -283,6 +326,17 @@ jobs:
|
||||
- name: Verify release registry test coverage
|
||||
run: pnpm run test:release-registry
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
general_tests:
|
||||
name: General tests (${{ matrix.group_label }})
|
||||
needs: [gate]
|
||||
@@ -398,12 +452,21 @@ jobs:
|
||||
- group: general-workspaces-c
|
||||
group_label: workspaces-c
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: General tests (${{ matrix.group_label }})
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Setup Node.js for pnpm bootstrap
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
||||
with:
|
||||
@@ -456,6 +519,17 @@ jobs:
|
||||
pnpm test:run:general -- --group '${{ matrix.group }}'
|
||||
fi
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
docker_context_integrity:
|
||||
name: Docker context integrity
|
||||
needs: gate
|
||||
@@ -463,6 +537,10 @@ jobs:
|
||||
runs-on: ${{ needs.gate.outputs.runner }}
|
||||
timeout-minutes: 15
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: Docker context integrity
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
@@ -472,6 +550,11 @@ jobs:
|
||||
# Not every runner the gate can select ships the Buildx plugin —
|
||||
# the image-build workflows set it up explicitly, so this lane does
|
||||
# too rather than failing before it checks anything.
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4
|
||||
|
||||
@@ -485,6 +568,17 @@ jobs:
|
||||
- name: Run generated-file drift checks against the Docker build context
|
||||
run: docker buildx build --file .github/docker-context-checks.Dockerfile .
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
verify:
|
||||
# Preserve the legacy required-check name while the underlying work runs in parallel.
|
||||
name: verify
|
||||
@@ -558,12 +652,21 @@ jobs:
|
||||
command: test:typescript:vitest --shard=2/2
|
||||
release_crate: true
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: Verify Paperclip Runner (${{ matrix.lane_label }})
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Setup Node.js for pnpm bootstrap
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
||||
with:
|
||||
@@ -732,6 +835,17 @@ jobs:
|
||||
# read the shard flag as a test filter.
|
||||
run: pnpm --filter @paperclipai/paperclip-runner ${{ matrix.command }}
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
build:
|
||||
name: Build
|
||||
needs: [gate]
|
||||
@@ -739,12 +853,21 @@ jobs:
|
||||
runs-on: ${{ needs.gate.outputs.runner }}
|
||||
timeout-minutes: 20
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: Build
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Setup Node.js for pnpm bootstrap
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
||||
with:
|
||||
@@ -948,6 +1071,17 @@ jobs:
|
||||
fi
|
||||
node scripts/verify-grok-npm-install.mjs
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
verify_serialized_server:
|
||||
name: Verify serialized server suites (${{ matrix.shard_label }})
|
||||
needs: [gate]
|
||||
@@ -994,12 +1128,21 @@ jobs:
|
||||
shard_count: 9
|
||||
shard_label: 9/9
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: Verify serialized server suites (${{ matrix.shard_label }})
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Setup Node.js for pnpm bootstrap
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
||||
with:
|
||||
@@ -1046,6 +1189,17 @@ jobs:
|
||||
- name: Run serialized server test shard
|
||||
run: pnpm test:run:serialized -- --shard-index ${{ matrix.shard_index }} --shard-count ${{ matrix.shard_count }}
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
canary_dry_run:
|
||||
name: Canary Dry Run
|
||||
needs: [gate]
|
||||
@@ -1053,12 +1207,21 @@ jobs:
|
||||
runs-on: ${{ needs.gate.outputs.runner }}
|
||||
timeout-minutes: 20
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: Canary Dry Run
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Setup Node.js for pnpm bootstrap
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
||||
with:
|
||||
@@ -1234,6 +1397,16 @@ jobs:
|
||||
# build` output, which the Build lane also produces, so it moved there:
|
||||
# see "Verify built-in Grok from a clean public npm install" in `build`.
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
e2e_shards:
|
||||
name: e2e shard (${{ matrix.shard_label }})
|
||||
@@ -1281,12 +1454,21 @@ jobs:
|
||||
shard_count: 8
|
||||
shard_label: 8/8
|
||||
|
||||
env:
|
||||
PAPERCLIP_CI_PROFILE: ${{ needs.gate.outputs.profile_ci }}
|
||||
PAPERCLIP_CI_PROFILE_JOB: e2e shard (${{ matrix.shard_label }})
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CI profile
|
||||
continue-on-error: true
|
||||
if: env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
run: node scripts/ci-profile/initialize.mjs
|
||||
|
||||
- name: Setup Node.js for pnpm bootstrap
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
|
||||
with:
|
||||
@@ -1376,6 +1558,17 @@ jobs:
|
||||
tests/e2e/test-results/
|
||||
retention-days: 14
|
||||
|
||||
- name: Upload CI profile timings
|
||||
continue-on-error: true
|
||||
if: always() && env.PAPERCLIP_CI_PROFILE == 'true'
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||
with:
|
||||
name: ci-profile-${{ github.run_attempt }}-${{ github.job }}-${{ strategy.job-index || 0 }}
|
||||
path: .ci-profile/*.ndjson
|
||||
include-hidden-files: true
|
||||
if-no-files-found: warn
|
||||
retention-days: 14
|
||||
|
||||
e2e:
|
||||
# Preserve the legacy required-check name while the specs run sharded
|
||||
# across the matrix above (same pattern as the `verify` aggregate).
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
name: PR
|
||||
run-name: >-
|
||||
${{ contains(github.event.pull_request.labels.*.name, 'profile-ci') && (github.event.action != 'labeled' || github.event.label.name == 'profile-ci') && format('CI profile · PR #{0}', github.event.pull_request.number) || '' }}
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, labeled]
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
@@ -10,6 +13,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
ci:
|
||||
if: github.event.action != 'labeled' || github.event.label.name == 'profile-ci'
|
||||
# Master requires CODEOWNERS review for .github/**, including this workflow.
|
||||
# The AWS runner group permits pr-trusted.yml@refs/heads/master.
|
||||
uses: paperclipai/paperclip/.github/workflows/pr-trusted.yml@master
|
||||
Reference in new issue
Block a user