From glean-pack
CI/CD for Glean connectors with automated indexing tests and search quality validation. Trigger: "glean CI", "glean GitHub Actions", "glean connector CI/CD".
How this skill is triggered — by the user, by Claude, or both
Slash command
/glean-pack:glean-ci-integrationThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Set up CI/CD for Glean enterprise search integrations: run unit tests with mocked search and indexing responses on every PR, validate connector document transforms and search quality against a staging Glean instance on merge to main. Glean indexes content across SaaS tools, so CI pipelines focus on connector data transforms, indexing API calls, and search relevance regression testing.
Set up CI/CD for Glean enterprise search integrations: run unit tests with mocked search and indexing responses on every PR, validate connector document transforms and search quality against a staging Glean instance on merge to main. Glean indexes content across SaaS tools, so CI pipelines focus on connector data transforms, indexing API calls, and search relevance regression testing.
# .github/workflows/glean-ci.yml
name: Glean CI
on:
pull_request:
paths: ['src/connectors/**', 'tests/**']
push:
branches: [main]
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npm test -- --reporter=verbose
integration-tests:
if: github.ref == 'refs/heads/main'
needs: unit-tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npm run test:integration
env:
GLEAN_API_KEY: ${{ secrets.GLEAN_API_KEY }}
GLEAN_DOMAIN: ${{ secrets.GLEAN_DOMAIN }}
// tests/glean-service.test.ts
import { describe, it, expect, vi } from 'vitest';
import { indexDocuments, searchDocuments } from '../src/glean-service';
vi.mock('../src/glean-client', () => ({
GleanClient: vi.fn().mockImplementation(() => ({
indexDocuments: vi.fn().mockResolvedValue({ indexed: 3, failed: 0 }),
search: vi.fn().mockResolvedValue({
results: [
{ title: 'Onboarding Guide', datasource: 'confluence', url: 'https://wiki.co/onboard' },
{ title: 'Deploy Process', datasource: 'notion', url: 'https://notion.so/deploy' },
],
totalResults: 2,
}),
getDatasources: vi.fn().mockResolvedValue(['confluence', 'notion', 'gdrive']),
})),
}));
describe('Glean Service', () => {
it('indexes documents and returns count', async () => {
const result = await indexDocuments([
{ title: 'Doc 1', body: 'Content', datasource: 'custom' },
]);
expect(result.indexed).toBe(3);
expect(result.failed).toBe(0);
});
it('searches across datasources', async () => {
const results = await searchDocuments('onboarding');
expect(results.totalResults).toBe(2);
expect(results.results[0].datasource).toBe('confluence');
});
});
// tests/integration/glean.integration.test.ts
import { describe, it, expect } from 'vitest';
const hasKey = !!process.env.GLEAN_API_KEY;
describe.skipIf(!hasKey)('Glean Live API', () => {
it('searches enterprise content', async () => {
const res = await fetch(`https://${process.env.GLEAN_DOMAIN}-be.glean.com/api/v1/search`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.GLEAN_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ query: 'test', pageSize: 1 }),
});
expect(res.status).toBe(200);
const body = await res.json();
expect(body).toHaveProperty('results');
});
});
| CI Issue | Cause | Fix |
|---|---|---|
401 Unauthorized | Invalid API token or wrong domain | Verify token at admin.glean.com |
| Indexing returns 0 documents | Document format doesn't match schema | Validate document structure against Glean connector spec |
| Search quality regression | Index not yet updated | Add wait between indexing and search quality checks |
| Datasource not found | Connector not configured in staging | Set up test datasource in Glean admin before CI runs |
| Rate limit (429) | Too many indexing calls | Batch documents (max 100 per call) and add throttling |
For deployment patterns, see glean-deploy-integration.
npx claudepluginhub fleet-to-force/claude-code-plugins-plus --plugin glean-packGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Synthesizes the current conversation into a structured spec (PRD) and publishes it to the project issue tracker with a ready-for-agent label, without interviewing the user.
3plugins reuse this skill
First indexed Jul 10, 2026