# Add Signer CI

> Prepare CI workflows for a new signer backend contributed via a fork PR. Use when asked to "add a signer to CI", "wire up CI for a new signer", "prepare the fork external live tests", or when a new signing backend needs its workflow matrices, env vars, and publish entries added.

- Skill: `solana-foundation/add-signer-ci` (Agent Skill)
- Install (CLI): `npx skillmds@latest add solana-foundation/add-signer-ci`
- Raw SKILL.md: https://api.skillmd.com/api/skills/solana-foundation/add-signer-ci/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: solana-foundation (https://skillmd.com/u/solana-foundation)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/solana-foundation/add-signer-ci

---


# Add Fork Signer to CI

Prepare CI workflows for a new signer being added via a fork PR. This is a two-phase process because fork PRs can't use repository secrets, so `fork-external-live-manual.yml` (which runs from `main`'s YAML) must be updated on `main` first.

If any of these are unknown, ask the user for: signer display name, Rust feature name, Rust integration test function name, TypeScript package name (if any), and required environment variable names.

## Phase 1 — Our Preparatory PR (merged to `main`)

This is what YOU do. Read each file first, then make edits matching existing patterns exactly.

### 1. `.github/workflows/fork-external-live-manual.yml`

**a) Rust test step env vars** (`Run Rust external live integration tests` → env block):
Add the signer's env vars after the last existing signer's env vars, before `SOLANA_RPC_URL`.

**b) Rust test step tests array** (same step → `tests=()` bash array):
Add the Rust integration test function name to the array.

**c) TypeScript test step env vars** (`Run TypeScript external live integration tests` → env block):
Add the signer's env vars (if the signer has a TypeScript package).

**d) TypeScript test step packages array** (same step → `packages=()` bash array):
Add the TypeScript package name (if applicable).

### 2. `.github/workflows/ci.yml` — env vars ONLY

**Integration test env vars** (`rust-integration-test` job → env block):
Add the signer's env vars after the last existing signer's env vars, before `SOLANA_RPC_URL`.

**DO NOT** add to the `backend` matrix or `test` matrix. The Rust feature and test don't exist on `main` yet — adding them would break CI. Those go in Phase 2.

## Phase 2 — Fork Contributor Adds to Their PR

Tell the fork contributor (in a PR comment or issue) to add these to their branch alongside the signer code:

### 1. `.github/workflows/ci.yml`

**a) Unit test backend matrix** (`rust-test` job → `strategy.matrix.backend`):
Add the Rust feature name to the backend array, before `all`.

**b) Integration test matrix** (`rust-integration-test` job → `strategy.matrix.test`):
Add the integration test function name to the test array.

### 2. `.github/workflows/typescript-ci.yml` (if TS package exists)

**a) Unit test matrix** (`typescript-test-unit` job → `strategy.matrix.package`):
Add the TypeScript package name.

**b) Integration test matrix** (`typescript-test-integration` job → `strategy.matrix.package`):
Add the TypeScript package name.

**c) Integration test env vars** (integration test step → env block):
Add a comment header and the signer's env vars.

### 3. `.github/workflows/typescript-publish.yml` (if TS package exists)

**a) `PUBLISH_PACKAGES` env list**:
Add the package name in dependency order (before `keychain` umbrella).

**b) GitHub Release `packages` array** (in the `actions/github-script` step):
Add `@solana/keychain-<name>` to the array.

**c) Publish summary table**:
Add a row for the new package.

## Merge Order

1. Merge Phase 1 PR → `main` is ready with secrets wired up
2. Trigger `Fork External Live Tests` workflow with the fork PR number → integration tests run with secrets
3. Merge the fork PR (Phase 2 changes included alongside the code)

## GitHub Secrets Reminder

After updating CI files, the following secrets must be configured:

- **Repository level** (Settings → Secrets → Actions): for `ci.yml` workflows
- **`external-live-tests` environment** (Settings → Environments → external-live-tests → Secrets): for `fork-external-live-manual.yml`

Both locations need the same secret names configured.

## Verification

After making Phase 1 changes:
1. Confirm `fork-external-live-manual.yml` has the new env vars and test entries (Rust and TS if applicable)
2. Confirm `ci.yml` has the new env vars but NOT the matrix additions
3. Confirm CI passes (no references to nonexistent features)

