# Onboard Contributor

> Guide a new contributor through the rundeck OSS repo. Use when someone is getting started with the project, asking how to build/test/contribute, or setting up their development environment.

- Skill: `rundeck/onboard-contributor` (Agent Skill)
- Install (CLI): `npx skillmds@latest add rundeck/onboard-contributor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/rundeck/onboard-contributor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: rundeck (https://skillmd.com/u/rundeck)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/rundeck/onboard-contributor

---


# Onboard Contributor

Guides new contributors (external or internal) through the rundeck OSS development environment.

## When to Use

- New contributor asking how to get started
- Questions about building or running the project
- Questions about how to contribute a plugin, bug fix, or feature
- Setting up a development environment

## Process

### Phase 1: Environment Check

Check the contributor's environment:

```bash
java -version   # Must be Java 17
node -v         # Check .nvmrc for required version
./gradlew --version
```

If Java is wrong: suggest `jenv`, `sdkman`, or `asdf`.
If Node is wrong: suggest `nvm use` (after checking `.nvmrc`).

### Phase 2: Project Overview

Explain the structure:

```
rundeck/
├── rundeckapp/       Main Grails application (controllers, services, Vue frontend)
├── core/             Core Java library (plugin interfaces, shared utilities)
├── functional-test/  Selenium and API functional tests
├── grails-webhooks/  Webhooks plugin
└── gradle.properties All dependency versions defined here
```

Key points:
- **Backend**: Grails 7 / Spring Boot 3 / Groovy 4 — use `@CompileStatic` on all classes
- **Frontend**: Vue 3 + TypeScript in `rundeckapp/grails-spa/packages/ui-trellis/`
- **Tests**: Spock for backend, Jest for frontend, Selenium for E2E
- **Migrations**: Liquibase in `rundeckapp/grails-app/migrations/` — never modify existing ones

### Phase 3: First Build

```bash
# Full build, skip tests for speed (~4-8 min)
./gradlew build -x check

# If it fails, try cleaning first
./gradlew clean && ./gradlew build -x check
```

### Phase 4: Running Tests

```bash
# Backend unit tests
./gradlew test

# Frontend unit tests
UI=rundeckapp/grails-spa/packages/ui-trellis
npm run --prefix "$UI" ci:test:unit

# Specific test class
./gradlew test --tests "com.example.MySpec"
```

### Phase 5: Making a Contribution

**For a bug fix:**
1. Write a failing test that reproduces the bug (Spock for backend, Jest for frontend)
2. Fix the bug
3. Verify the test now passes
4. Run `./gradlew build -x check` to verify compilation

**For a new plugin:**
- Use the `create-plugin` skill

**For a new API endpoint:**
- Use the `create-api-endpoint` skill

**PR conventions:**
- Include tests for all new behavior
- All PRs must pass CI before merge
- See `CONTRIBUTING.md` in the repo root for the full contribution guide

### Phase 6: Code Standards Summary

| Standard | Rule |
|---|---|
| Groovy classes | `@CompileStatic` required (or `@GrailsCompileStatic` for Grails artifacts) |
| Tests | Spock only — no new JUnit |
| Vue components | Options API default, scoped styles, `data-testid` in tests |
| DB migrations | Never modify existing — create new ones |
| Strings in Vue | Always use `$t()` — no hardcoded English |
| OkHttp responses | Must be closed or body consumed |

## Checklist

- [ ] Java 17 confirmed
- [ ] Node.js version matches `.nvmrc`
- [ ] `./gradlew build -x check` passes
- [ ] Contributor knows where controllers, services, Vue components live
- [ ] Contributor understands test requirements (Spock, Jest, Selenium)
- [ ] Contributor knows the plugin development path (if applicable)

