Level 2: Apache Contributor Onboarding
Level 1 gave you a Tez you can build, test, and run a DAG on. This level
turns that capability into merged code. You will learn how Apache Tez is actually contributed to
today — which is not the JIRA-plus-.patch-file folklore that most "Apache workflow" write-ups
still describe. Modern Tez is a GitHub pull-request project that keeps JIRA as its issue tracker:
you file (or find) a TEZ-XXXX issue on issues.apache.org, open a PR on github.com/apache/tez
whose title is the JIRA key, and a committer squash-merges it after Yetus precommit goes green
and a human reviews it.
This is deliberately a workflow level. The changes are surgical — a Javadoc fix, an input validation guard, a missing test. Nothing here will surprise a reviewer. That is the point: you drill the mechanics now, against the real repository, so that Levels 3–9 can be about the engine.
Ground truth. Everything in this level is checked against a current
apache/tezcheckout: the rootpom.xmlmodule list,.asf.yaml,.github/workflows/build.yml, theJenkinsfile,dev-support/tez-personality.sh, andgit log. Where this page says "run this," run it against your own clone and trust its output over any text — the code moves between branches.
Learning Objectives
By the end of Level 2 you must be able to:
- Describe the real Tez contribution model end-to-end: JIRA issue → fork → branch → commit
(
TEZ-XXXX: …) → GitHub PR → GitHub Actions + Jenkins/Yetus precommit → review → squash-merge. - Navigate every top-level module in the root
pom.xmland say what each is for and what it depends on. - Create an Apache JIRA account, find a
Minor/Trivialunassigned issue, and comment on it without stepping on another contributor. - Write a commit and PR title in the enforced
TEZ-XXXX: Descriptionform (verified againstgit log). - Run the same gates precommit runs —
spotless,checkstyle,apache-rat,spotbugs, and the scoped unit tests — locally, so CI is green on the first push. - Read a Yetus/GitHub Actions failure and map each check back to the local command that reproduces it.
- Review a PR the way a committer does: correctness, test coverage, compatibility, style, diagnostics.
The Modern Tez Contribution Model
Apache projects vary widely in mechanics. Do not assume the "email a patch to the list" model — Tez
does not work that way anymore. Read .asf.yaml in the repo root and you can see the current
setup encoded directly:
sed -n '/^github:/,/^notifications:/p' .asf.yaml
The load-bearing lines:
.asf.yaml setting | What it means for you |
|---|---|
features: { wiki: false, issues: false, projects: false } | GitHub Issues are off. Bugs and tasks live in Apache JIRA (TEZ-XXXX), not GitHub. |
enabled_merge_buttons: { squash: true, merge: false, rebase: false } | Every PR is squash-merged. Your commit history inside the PR does not survive; the squash subject does. |
notifications: { pullrequests: issues@tez.apache.org, jira_options: link label worklog } | PRs are announced to issues@ and auto-linked to the JIRA issue named in the title. |
rulesets … restrict_force_push, restrict_deletion | master and release/* are protected. You never push to them; you push to your fork and open a PR. |
So the pieces you must internalize:
| Artifact | What it is | Where |
|---|---|---|
| JIRA issue | A bug, improvement, task, or sub-task — the unit of "what should change." Keyed TEZ-XXXX. | issues.apache.org/jira/projects/TEZ |
| Pull request | Your proposed change against master, from a branch on your fork. | github.com/apache/tez |
| Commit / PR title | TEZ-XXXX: Description. The JIRA key links the two systems. | Enforced by convention; visible in git log. |
| Yetus precommit | The Jenkins job that runs compile, unit tests, checkstyle, spotbugs, javadoc, shellcheck, codespell on your diff and comments the result on the PR. | Jenkinsfile + dev-support/tez-personality.sh |
| GitHub Actions build | A cross-platform compile matrix (.github/workflows/build.yml). | .github/workflows/ |
dev@tez.apache.org | Where design and release discussion happens. Not where you submit code. | lists.apache.org/list.html?dev@tez.apache.org |
There is no .github/pull_request_template.md in the repo — confirm with ls .github (you will
see only workflows/). Tez does not auto-populate a PR checklist, which means the discipline is on
you: a clear title, a description of the problem and fix, a note of how you tested, and a link to
the JIRA. Governance context — the PMC, meritocracy, how committership is earned — is covered in
committer-mindset and
pmc-responsibilities; for contribution mechanics, this
page is enough.
JIRA still matters
The JIRA key is the spine of the whole flow. It names your branch, prefixes your commit, titles your
PR, and (via jira_options: link) gets back-linked from the PR automatically. File issues and read
existing ones as covered in jira-review and
design-via-jira.
The PR Lifecycle
flowchart TD
A["Find or file a TEZ-XXXX JIRA issue"] --> B["Comment: 'I'm looking into this'"]
B --> C["Fork apache/tez; clone; add upstream remote"]
C --> D["git checkout -b TEZ-XXXX from up-to-date master"]
D --> E["Make the surgical change (+ test)"]
E --> F["mvn spotless:apply"]
F --> G["Local gates: checkstyle, apache-rat, spotbugs, scoped tests"]
G --> H["git commit -m 'TEZ-XXXX: Description'"]
H --> I["git push origin TEZ-XXXX; open PR against master"]
I --> J["GitHub Actions build matrix + Jenkins/Yetus precommit"]
J -->|red| G
J -->|green| K["Committer review"]
K -->|changes requested| E
K -->|approved| L["Committer squash-merges to master"]
L --> M["JIRA moved to Resolved/Fixed, fixVersion set"]
The state machine in words:
- Claim. Find a
Minor/Trivial, unassigned issue with no open PR, and comment before you start. Etiquette is in community-interaction. - Fork and branch from an up-to-date
master. Branch name is conventionally the JIRA key (TEZ-XXXX) — you will see this exact convention in the merged history. - Change exactly what the issue asks — plus a test. Scope creep is the #1 reason first PRs stall.
- Format and gate locally.
mvn spotless:applyfirst (it fixes import order, trailing whitespace, license headers, and the final newline automatically), then the checks below. - Commit with a
TEZ-XXXX: Descriptionsubject. You do not need to squash your own commits — the committer squashes at merge — but keep them coherent. - Push and open a PR against
master. Title itTEZ-XXXX: Description; write a body even though no template forces you to. - CI. GitHub Actions compiles across a Java 21/25 × Ubuntu/macOS matrix; Jenkins runs Yetus, which posts a per-check comment (with emoji votes) on the PR.
- Review and merge. Address every comment with new commits. A committer squash-merges once green and approved, and moves the JIRA to Resolved.
The CI checks you will see
Two systems run. Map each to the local command that reproduces it:
| Check | Where it runs | What it verifies | Local equivalent |
|---|---|---|---|
| build matrix | GitHub Actions (build.yml) | mvn clean install -DskipTests compiles on Java 21 & 25, Ubuntu & macOS | mvn clean install -DskipTests -Dmaven.javadoc.skip=true |
| compile / javac | Yetus | Your diff compiles with strict -Ptest-patch lint | mvn compile -Ptest-patch |
| unit | Yetus | The affected modules' tests pass | mvn test -pl <module> -am |
| checkstyle | Yetus | Style rules in tez-build-tools/.../checkstyle/checkstyle.xml | mvn checkstyle:check -pl <module> |
| spotbugs | Yetus | No new static-analysis bugs | mvn compile spotbugs:spotbugs -Pspotbugs -pl <module> |
| javadoc | Yetus | Javadoc still builds | mvn javadoc:javadoc -pl <module> |
| spotless (validate) | Maven validate phase | Import order, whitespace, license header, final newline | mvn spotless:check / fix with mvn spotless:apply |
| apache-rat | Maven verify | Every source file carries the ASF license header | mvn apache-rat:check |
| shellcheck / codespell | Yetus | Shell scripts and .md/.txt are clean | only triggered when you touch those files |
Running spotless:apply + checkstyle:check + the scoped tests before you push is the single
biggest lever on review speed. Quality expectations are in
patch-quality.
Source Areas to Inspect
You do not need to read these end-to-end; you need to know they exist and what they govern.
| File / dir | Why it matters |
|---|---|
pom.xml (root) | The <modules> list (build order), <dependencyManagement>, plugin config for spotless/checkstyle/rat. |
.asf.yaml | The whole contribution model in ~50 lines — merge buttons, issue tracker, branch protection. |
.github/workflows/build.yml | The GitHub Actions compile matrix. |
Jenkinsfile | The Yetus precommit pipeline (Docker, Yetus rel/0.15.1, personality). |
dev-support/tez-personality.sh | Which Yetus tests fire for which file types (.java → javac+spotbugs+checkstyle+javadoc). |
tez-build-tools/src/main/resources/checkstyle/checkstyle.xml | The actual style rules (LineLength max 120, naming, Javadoc). |
tez-build-tools/src/main/resources/checkstyle/suppressions.xml | Which checks are relaxed where (e.g. JavadocPackage off for tests). |
dev-support/spotless/license.java | The canonical ASF header spotless enforces on every .java. |
Apache Tez JIRA Structure
Issues are typed and prioritised. As a Level 2 contributor you work only the bottom of the priority table.
| Type | Description | Priority | Meaning | |
|---|---|---|---|---|
| Bug | A defect in behavior | Blocker | Prevents a release | |
| Improvement | Enhancement to existing behavior | Critical | Data loss / correctness risk | |
| New Feature | Something that does not exist yet | Major | Important, not release-blocking | |
| Task | Non-code work (docs, release) | Minor | Small issue or improvement | |
| Sub-task | Part of a larger issue | Trivial | Typo, cosmetic, cleanup |
For Level 2: work only
MinorandTrivialissues until you have at least three accepted PRs. Do not pick upMajor+ work yet — you will get it wrong in ways that burn reviewer trust.
Components point you at a module: Tez (core/DAG), Tez UI, Test, and area labels that map onto
the modules in Lab 2.1. Browse recent issues with
project = TEZ ORDER BY updated DESC to see what active work actually looks like.
Deliverables
Demonstrate all of the following before advancing to Level 3:
-
An Apache JIRA account, and one
Minor/Trivialissue you have studied and commented on. -
A fork of
apache/tezwith anupstreamremote and aTEZ-XXXXtopic branch off an up-to-datemaster(Lab 2.1, Lab 2.2). -
A module map you built yourself from the root
pom.xml, with each module's role and its inter-module dependencies (Lab 2.1). -
A clean local
mvn spotless:check,mvn checkstyle:check, andmvn apache-rat:checkon your change. -
A commit whose subject is
TEZ-XXXX: Description, matching the form ingit log. -
A walked bug fix with a reproducing unit test in the
TestTezIdsstyle (Lab 2.3). - A completed review of the flawed example patch — you found every flaw a committer would flag (Lab 2.4).
Common Mistakes
| Mistake | Consequence | Fix |
|---|---|---|
Assuming the old .patch-to-JIRA flow | You attach a diff nobody looks at; the repo expects a PR | Open a GitHub PR against master; JIRA is the tracker, GitHub is the code. |
| Filing a bug on GitHub Issues | It cannot be filed — issues are disabled | File on Apache JIRA (TEZ-XXXX). |
Commit subject fix bug or TEZ-1234. … | Doesn't match the enforced TEZ-XXXX: form; breaks JIRA linkage | git commit -m "TEZ-XXXX: Short imperative description". |
| Formatting churn in unrelated lines | Noisy diff; reviewer asks for a re-roll | Run mvn spotless:apply, then commit only intended lines. |
Skipping spotless:apply | Spotless fails in the validate phase before tests even run | Always spotless:apply before committing. |
| No test with a bug fix | Reviewer blocks: Tez expects a test that fails before, passes after | Add a reproducing test (Lab 2.3). |
| Claiming an issue silently | Duplicate work, community friction | Comment on the JIRA before you start. |
| Force-pushing over review history | Reviewers lose the thread | Add new commits during review; the committer squashes at merge. |
How to Verify Success
# Your branch is clean relative to master and contains only intended changes
git fetch upstream
git diff upstream/master --stat # only the files you meant to touch
# The full local gate, on the module you changed
mvn spotless:check -pl <module>
mvn checkstyle:check -pl <module>
mvn apache-rat:check -pl <module>
mvn test -pl <module> -am -Dtest=<RelevantTestClass>
# Your commit subject matches the enforced form
git log -1 --pretty=%s # -> TEZ-XXXX: Description
PR Profile: Level 2 Graduate
A Level 2 graduate can credibly open these PRs end-to-end, with green CI on the first or second push:
| PR type | Example (real, from history) | Test requirement |
|---|---|---|
| Config/constant fix | TEZ-4683: Fix tez framework mode config name — one-character constant bug | None (constant); explain in the PR why not |
| Javadoc improvement | Add a missing @param/@throws to a public API method | None; must pass checkstyle Javadoc rules |
| Input-validation fix | Make a fromString throw IllegalArgumentException instead of swallowing and returning null | A reproducing test (Lab 2.3) |
| Security/robustness guard | TEZ-4699: Add canonical path checks in CSVResult — guard + new test | A test that fails before, passes after |
| Style/cleanup | Fix unused imports or LineLength across a module | mvn checkstyle:check -pl <module> |
You are not yet ready to submit changes to the state machines, the shuffle path, the AM scheduling, or the wire/protobuf formats — those are Levels 3–9. What you are ready for is the thing most contributors get wrong: a clean, focused, tested, correctly-titled PR that a committer can squash-merge without a five-round back-and-forth.