A step-by-step guide to using Milestones, Epics, Issues, Labels, and Merge Requests to run structured, trackable projects in the classroom.
When students work on multi-week team projects, good planning structure is often as important as the code itself. GitLab's built-in planning tools mirror how agile software teams work in industry — teaching students to use them is as valuable as the project itself.
Time-boxed goals with a start and due date. Represent a sprint checkpoint or project phase.
Large themes or feature areas spanning multiple issues. Appear on the Roadmap as a Gantt chart.
Individual tasks, features, or bugs. The atomic unit of work — assigned, labeled, and linked.
Tags applied to issues and MRs for categorisation — type, priority, and status.
The code submission. Linked to issues via closing keywords — merged MRs close linked issues automatically.
A visual Gantt chart of all epics on a timeline. Shows plan distribution across the semester.
A team of four students is building a simple web application over 8 weeks. The project has three major feature areas: user authentication, a data dashboard, and an API layer.
This guide uses that project as the running example. By the end you'll have a complete planning structure that works for any team project of similar scope.
For an 8-week project, a sensible milestone structure mapped to grading checkpoints:
Create milestones at the group level for team projects so they apply across all student subgroups.
M2 – Core Features.Labels let you categorize, filter, and visualise work. Set up your label system before students start writing issues — retrofitting labels later is tedious. Use three categories: type, priority, and status.
Type labels
Status labels
Priority labels
Create labels at the group level so they are available in all student projects.
status:: and priority:: prefixes create scoped labels — GitLab enforces that only one label per scope can be applied at a time, preventing issues from being marked both status::to-do and status::in-progress simultaneously.For the CS301 example project:
Epics are created at the group level, not inside individual projects.
Issues are the atomic unit of work. Each issue should represent a single, completable task — small enough to finish in a day or two, large enough to be meaningful. Require students to write issues before they write code.
A well-written issue includes: a clear, action-oriented title; a description with acceptance criteria ("this is done when..."); an assignee; a label (type + status + priority); a milestone; and a parent epic.
When a student opens a merge request for their work, they should reference the issue it resolves. GitLab will automatically close the issue when the MR is merged, keeping the plan and the codebase in sync.
Include one of these keywords followed by the issue number in the MR title or description:
| Keyword | Effect |
|---|---|
Closes #42 | Closes the issue when the MR is merged into the default branch |
Fixes #42 | Same as Closes — preferred for bugs |
Resolves #42 | Same as Closes |
Implements #42 | Links the MR to the issue without auto-closing it |
Closes #12, #14, #17. All three issues will close when the MR is merged.With milestones, epics, issues, and labels in place, GitLab gives you several views to track team progress without asking for separate status reports.
The planning structure you've set up makes grading planning and process — not just the final code — straightforward and objective.