Skip to main content
Introduction to Devops

Continuous Integration Best Practices and CI/CD Pipelines

Published: 2026-08-14
Level: postgraduate
Audience: Postgraduate students of software engineering and delivery

Prerequisite Knowledge

This lecture builds on the following concepts from earlier lectures. If any feel unfamiliar, review the linked notes before proceeding.

Previously Covered in This Subject

  • Continuous integration and its best practices — 10.6 Continuous Integration (Lecture 10)
  • Unit testing — 10.2 Unit Testing: Testing Pieces Instead of the Whole (Lecture 10)
  • Code inspection and the quality gate — 10.4 Continuous Code Inspection and 10.5 SonarQube: Automating Continuous Code Inspection (Lecture 10)
  • Mid-semester exam format and logistics — 10.1 Mid-Semester Exam: Format, Logistics, and Preparation (Lecture 10)
  • git revert as the safe undo — 9.11 git revert: Undoing in Production (Lecture 9)
  • Feature branches and merge conflicts — 9.9 Branching: Feature Branches and the Merge Workflow and 9.7 The Classic Merge Conflict (Lecture 9)
  • Cloud as a catalyst — 7.1 Cloud as a Catalyst for DevOps (Lecture 7)
  • Value stream maps and waste — 3.3 Value Stream Maps (Lecture 3)
  • DevOps as culture and the tools landscape — 3.1 What Is DevOps? (Lecture 3) and 5.1 The DevOps Tool Landscape (Lecture 5)

Continuous Integration Best Practices and CI/CD Pipelines

11.1 Recap: The CI Best Practices Covered So Far

11.1.1 Where We Left Off

Hook: If a broken build stays broken for a whole working day, how much new code do you think piles up on top of it before anyone finds the mistake? The two practices below exist to keep that pile small.

The previous session covered the prerequisites for continuous integration and then started the list of best practices. Two of those practices are already on the table, and they set the tone for everything that follows:

  • Keep the build and test process short. A short build-and-test loop gives fast feedback. When a check-in breaks something, you find out quickly, while the change is still small and easy to trace. The longer the loop, the more code piles up between a mistake and its discovery. This is not a vague preference: the standard guidance is that the pre-check-in build and the commit-stage build should each run in at most ten minutes, with about five minutes as a comfortable target and ninety seconds as the ideal. Once the loop grows beyond that, real behavioral damage shows up: developers stop running the full build before checking in, they check in less often (because nobody wants to sit around waiting for a long build), and several commits pile up between two builds, so nobody can tell which check-in broke the build. A short loop also makes reverting cheap, because the last known-good revision is only minutes old.
  • Manage your development workspace like a production environment. Treat your local workspace as the equivalent of a production environment. The point is that what works locally should be what works when the code ships, so your local setup has to mirror production closely. The practical version of this rule is to use the same automated processes on a developer machine that the continuous integration server and production use: the same build script, the same test commands, the same deployment steps. When teams skip this, they get the classic "it works on my machine" syndrome — the code passes locally and fails everywhere else, because the local database, middleware, or configuration silently differs from every other environment. Careful configuration management is the supporting discipline: source code, test data, database scripts, build scripts, and deployment scripts all live in version control, and the starting point for any new work is the latest known-good revision — the one that passed all automated tests on the CI server.

Scope: These two practices are the foundation, not the whole story. A fast build is useless if it runs on a machine that looks nothing like production, and a production-like workspace is useless if the build takes so long that nobody uses it. The two must hold together; the four new practices in this session build on top of them.

Recap + bridge: Two CI best practices are already in place: keep the build-test loop short (fast feedback, small batches, cheap reverts) and treat the local workspace like production (same automated processes everywhere, known-good starting point). This session adds four more practices: don't check in on a broken build, commit locally and let the pipeline take the code to production, wait for the commit test to pass before moving on, and always be prepared to revert. We then work through a realistic Friday-evening scenario, and finish with the mid-semester examination material: the generic CI/CD pipeline concept and a full walkthrough of last year's question paper.

Real-world connection: The payoff of these two practices at scale is not hypothetical. HP's LaserJet firmware division ran with roughly four hundred developers across the US, Brazil, and India, and before continuous integration was adopted, only about 5% of their time went into new features — the rest was absorbed by branch management, manual testing, and planning. After they committed to trunk-based development, heavy automated testing, and a shared build, the team went from about twenty commits per day performed by a single "build boss" to over one hundred commits per day by individual developers, and time spent on innovation rose from 5% to 40% of developer time. The first step on that road was exactly what these two practices describe: a fast, automated build-test loop running against a common, production-like setup.

11.2 Don't Check In on a Broken Build

11.2.1 The Rule and Why It Exists

Hook: Imagine a building site where the foundation is cracked, and the workers keep pouring concrete for the upper floors anyway. How much of that building would you trust to stand? A broken code base is exactly the same situation, and it is why the first rule of continuous integration is blunt: never add new code on top of a broken build.

The next practice is don't check in on a broken build. The very first intention of introducing continuous integration was to keep the application always in a stable, workable state. If a committed change fails the build, the product is no longer in that state. Checking in more code on top of that broken build directly violates the first rule of keeping the application always in a working condition.

This rule is called the cardinal sin of continuous integration in the literature: when a build breaks, the developer responsible is expected to be right there, fixing it. Anyone else checking in during that window triggers new builds on top of a known-failing state, muddies the water, and makes the fix harder — the exact opposite of what the team needs. The rule protects not just the code base but also the person trying to repair it: they need a clear run at the problem, not a stream of new commits compounding the failure.

11.2.2 What Goes Wrong When You Do

The professor walks through three concrete consequences of committing on a broken build:

  1. You are growing the code base on an unstable product. The application is not in a working state, and you are adding new code on top of it. Each check-in makes the broken foundation larger. In the building-site analogy, you are not just piling floors on a cracked foundation — you are also making it harder to find which slab is cracked, because the rubble is now bigger.
  2. The fix takes much longer. If a new check-in or build trigger happens during the broken state, your code base has already increased. Finding out where the problem was triggered, isolating that issue, and fixing it across a larger code base will definitely take more time. The failure was cheap to fix at the moment it happened — a two-line mistake in the change that broke the build — but it becomes expensive once ten more commits sit on top of it, because the failing change is buried under unrelated work.
  3. The team stops caring. Frequent broken builds encourage the team not to care much about the working condition of the application. The discipline that CI is supposed to create quietly erodes, and the stable-state rule becomes a memory. This is the most dangerous consequence of the three: once a red build is normal, developers stop reacting to it, the build stays red for days, and CI degenerates into a notification service for a product that never works.

Pitfalls to avoid:

  • "It is just one small commit — it will not matter." The size of the commit does not matter; what matters is that a second change is landing while the first is already known to fail. Each such commit multiplies the investigation work for the person fixing the build.
  • "I will wait for the other person's fix and check in after it." If you have a change ready while the build is red, you wait until the build is green again — you do not check in immediately after the fix lands without confirming the build passes with your change too.
  • "The build is red every afternoon anyway." A build that is chronically broken is a symptom that the team has already drifted into consequence three. The recovery is a reset: get the build green, then restart the discipline of the stable state.

There is a second, practical benefit hidden in this practice: traceability. Because every change flows through the pipeline, you can easily audit which commit failed a particular build and who made that commit. Everyone can be traceable. This audit trail is a core reason the pipeline exists at all — if you see a problem in any later stage, you can immediately find which check-in caused it, because every build is tied to the revision that produced it.

Exam note: a likely problem-statement question describes a team that always checks its code into an unstable application. Your suggestion is to make them follow the continuous integration process — build the software and make sure it is always in a working state — and to name the tools available for the job. One or two tool names (Jenkins, CircleCI, TeamCity) are enough; there will be no questions on Jenkins pipelines or jobs this time, since that material comes in the next session.

Real-world connection: The strictest teams in the industry treat a broken pipeline like a stopped production line. In the HP LaserJet example, the group created a culture that halted all work the moment a developer broke the deployment pipeline, so the system was brought back to green fast. The T2 and R2 reference texts put the same idea in the form of a universal team rule: if any part of the pipeline fails — even a deployment to an environment — the whole team owns that failure, and they stop and fix it before doing anything else. That is consequence three turned upside down: instead of the team learning to tolerate red, the team learns that red halts everyone, so fixing it becomes the highest priority on the project.

11.3 Commit Locally, Then Let the Pipeline Carry It to Production

11.3.1 The Pipeline Path

Hook: What is the fastest way to put a fix into production — editing a file on the production server directly, or going through the whole build, test, and deploy pipeline? The instinct says "directly," and the answer is still: the pipeline. Every single time.

The practice is commit locally, then direct to production — which is really a rule about never adding code directly to production. Code should always travel via the proper pipeline:

  1. Commit locally on your machine.
  2. Push to the GitHub repositories (the source control system).
  3. Continuous integration triggers automatically and runs the subsequent process: build process, testing, continuous code inspection, and continuous testing on different environments.
  4. The pipeline then pushes the result to production.

Every small commit and every small change should follow this same process. There is no shortcut route from an editor straight into production. Notice what the practice does not say: it does not say "commit directly to production," and it does not say "push to production yourself." Your machine is the starting line of the journey, not the destination — you commit locally, and from that moment the pipeline owns the trip.

Think of the route as a one-way street with a single gate. Every change, whether it is a one-line typo fix or a new feature, queues at the same gate, passes through the same checks, and arrives in production only when the checks say it is fit. There is no staff entrance, no window to climb through, and no exception for urgency — the gate does not know or care how urgent the change is.

11.3.2 Why Every Commit Takes the Same Route

The reason for this uniformity is that the pipeline is the only place where the build, the tests, and the inspections happen in a controlled, repeatable way. If one commit were allowed to bypass the pipeline, the stable-state guarantee would be gone, and nobody would know what actually made it into production and under what conditions it was tested.

Pitfalls to avoid:

  • The emergency hotfix: a customer-facing bug appears, and someone edits the production server "just this once." That change has never been built by the pipeline, never inspected, never tested in another environment — and it silently becomes the new production baseline that everyone else's work is measured against. If the next deploy overwrites it, the fix is lost and the incident returns.
  • The direct push: pushing from your local machine straight to the remote production branch skips the automatic build, inspection, and staging tests. The commit may be perfect — but nobody knows that, because the pipeline's evidence was never collected.
  • Environment drift: if different commits are allowed to take different routes, the environments themselves start drifting (one got the pipeline's artifact, another got a hand-edited copy), and comparing behavior across environments becomes meaningless.

The uniformity also preserves the audit trail from the previous section: because every change is carried by the pipeline, every change is traceable. If a production incident is later traced to a specific build, you can walk backwards — which pipeline run produced that build, which commit started it, and who pushed it — instead of guessing which of several ad-hoc routes the change may have taken.

Recap + bridge: Commit locally, then let the pipeline carry the code to production — never add code directly to production. The pipeline is the single controlled, repeatable place where build, tests, and inspections happen; a bypass would destroy both the stable-state guarantee and the traceability that goes with it. This is also the mental model behind the generic four-phase CI/CD flow in section 11.8 — the route every commit must take is exactly that flow.

Real-world connection: Delivery teams model this journey with a value stream map — a chart of everything that happens to a change between "concept" and "cash," showing both the working time and the waiting time at each step. The pipeline portion of that map, from check-in to release, is deliberately automated so that builds pass through it many times, gaining confidence at each gate. In the reference literature, the pipeline is described as "an automated manifestation of your process for getting software from version control into the hands of your users" — and the whole point is that every change, urgent or not, takes exactly that path, which is what makes the process repeatable enough to trust.

11.4 Wait for the Commit Test to Pass Before Moving On

11.4.1 The Check-In Owner Watches the Build

Hook: You just pressed "commit." How long do you wait before starting your next task — ten seconds, ten minutes, or until the build result is actually in? The rule this section adds is the strictest of the four: you wait until the commit test passes, and you do not leave for home before that.

The next practice is wait for the commit test to pass before moving on. At the time of check-in, the particular team member who checked in the code is responsible for monitoring the build progress. The rule is blunt: never go home with a broken build. Monitor the progress, and if the build is broken, take the subsequent actions — which we get to in the next section.

The level of attention this practice expects is specific. While the commit-stage build for your check-in is running, you are not free to begin a new feature, walk out for lunch, or sit in a meeting — you stay close enough to know the outcome within seconds of the build finishing. The commit stage is designed to run in minutes precisely so this is practical: the wait is a short one, and the feedback is worth it. If the commit succeeds, and only then, you are free to move on to the next task. If it fails, you are on the spot, with the fresh context still in your head, ready to determine what went wrong.

11.4.2 Why Ownership Matters

This practice assigns accountability to the person who caused the change. The author has the freshest context about what they changed, so they are the best person to react the moment a build fails, instead of leaving the discovery to someone else the next morning.

Pitfalls to avoid:

  • Starting the next task immediately. The build is a shared team resource; the moment your check-in lands, every teammate is waiting on its result. Starting new work while it runs means the failure, when it comes, arrives in the middle of something else — the slowest possible reaction time.
  • "I will check the result after lunch." If the commit fails, the cost of the fix grows while you are away: your context cools, other developers may check in on top of the broken state, and the team loses the fast-feedback advantage that CI exists to create.
  • Going home with a red build. This is the blunt line in the practice: never go home with a broken build. It is not about staying late — it is about not leaving the team (and your future self, on Monday morning) with a known-broken state to discover later. Section 11.5 and 11.6 show the escape hatch: revert the change so the build is green before you leave.

Recap + bridge: Wait for the commit test to pass before moving on. The person who made the check-in owns the build until it passes — fresh context makes them the cheapest person to react to a failure, and "never go home with a broken build" forces the loop to close before the day ends. What you do when the build does fail is the subject of the next two sections: be prepared to revert (11.5), and know exactly when reverting beats fixing (11.6 and 11.7).

Real-world connection: This ownership rule scales directly to very large organizations. At Google, any developer's commit runs against suites of hundreds of thousands of automated tests; if the change passes, it merges into trunk automatically, and if the pipeline breaks, engineers are expected to fix it right away because nobody else can commit while it is red. Google's engineers describe the informal pact behind it: everyone knows that one day they will break someone else's project by accident, and the next day they may be the one broken — so the person who caused the failure is the person who stays with it until it is green.

11.5 Always Be Prepared to Revert

11.5.1 When to Revert

Hook: Pilots are trained to assume that every landing might go wrong and to be ready to abort it and "go around" for another try. The same mindset applies to check-ins: assume your change might break something that takes more than a few minutes to fix, and know exactly how to roll back to the last known-good revision.

The last of the four new practices is always be prepared to revert to the previous revision. If, due to some constraints or issues, the build got broken and the team does not know the exact solution at that moment, it is always good to come back to the previous version and keep the application in a working state rather than leaving a broken build sitting there.

Notice the two conditions in the rule. First, the build is broken. Second, the team does not know the exact solution at that moment — not "the fix is impossible," just "the fix is not in reach right now." Under those conditions, the decision is already made: return to the previous revision, which you know is good precisely because the team's discipline (section 11.2) means nobody checked in on top of a broken build, so the previous revision is the last verified-green state. Reverting is what version control exists for; a revision control system that gives you the history of every change is also the tool that lets you step back to any point in that history.

The preparation part of the practice matters as much as the action: be prepared. You should know, before the failure happens, which revision the team will revert to, and whether your uncommitted local work can be preserved through the rollback. A team that decides on the revert strategy while the build is already broken is a team that will hesitate, and hesitation keeps the application in a broken state longer.

11.5.2 Reverting Is Not Giving Up

Reverting is a temporary fallback, not a defeat. The broken changes do not vanish — they stay in the developer's local system — and the team keeps a shippable state while the problem is investigated calmly. The next section shows exactly when reverting is the right call, and the section after that shows how a team avoids living in revert mode forever.

Scope and pitfalls:

  • Scope: Revert when the build is broken and the fix is not in immediate reach. Revert is not the first move when the fix is a two-line change you can see right now — in that case, fix it directly. It is the fallback for "I cannot solve this in the next few minutes," not a substitute for attempting the fix.
  • Leaving the failed changes behind: the revert only works if your work-in-progress stays safe. Distributed version control makes this natural — you can keep commits in your local repository without pushing them to anyone — and on any system you must make sure the broken changes remain on your local machine, ready to be fixed with fresh context later.
  • Reverting from memory: never rely on remembering which revision to go back to; the pipeline and the repository record it. The last revision that passed the build is the answer, and the CI history shows it.
  • Treating revert as failure: teams that see revert as a personal defeat will hesitate, leave the build red, and drift back into the "team stops caring" spiral from section 11.2. Reverting is a normal, practiced maneuver — the pilot's go-around, not the pilot's crash.

Recap + bridge: Always be prepared to revert to the previous revision. When the build is broken and the fix is not within immediate reach, step back to the last known-good revision, keep the broken changes safe locally, and return the team to a shippable state. Reverting is a temporary fallback — and the obvious next question is: if everyone reverts every time, how does the team ever make progress? The time-boxing rule in section 11.7 is the answer to that question.

Real-world connection: Automated pipelines make reverting almost free in practice. When deployment and release are automated, stepping back to an earlier version is exactly as easy as stepping forward — the worst case is that you find a critical bug in the new release, at which point you revert to the earlier version that does not contain it while you fix the new release offline. Google's release engineers make rolling back easy on purpose, because when the pipeline is broken, developers can no longer commit; the fastest way to unblock the team is a clean rollback, not a heroic overnight fix.

11.6 The Friday 5:30 p.m. Broken-Build Scenario

11.6.1 Three Options on a Friday Evening

Now we apply the practices to a realistic scenario. It is Friday, 5:30 p.m. — the end of the work week, and the weekend is about to start. You are on the verge of going home, and the commit you just made got broke: the build failed. You have three options:

  1. Stay late and try to fix it — fix first, go home after some extra timeline.
  2. Revert the changes — roll back to the previous working revision.
  3. Leave the broken build — go home and deal with it on Monday.

When asked which option to pick, the class converged quickly: revert. One student noted that fixing takes time, so revert; another said revert immediately — that is what is followed; another said it depends on the use case, but revert seems fine. The professor agreed with all of them: in this scenario, revert the changes and go home.

Worked trace — the three options, decided:

The scenario: Friday, 5:30 p.m., build broken by your commit, weekend starting, teammates leaving.

  • Option 1 — stay late and fix it. You begin debugging at 5:45 p.m. with cooling context and no teammates left to ask. A fix that would take twenty minutes on Wednesday morning can take two hours on a Friday evening — and if the problem is subtle, you go home at 9 p.m. with nothing shipped and a worse mood. Outcome: high time cost, uncertain result, personal time lost.
  • Option 2 — revert the changes. You roll back to the previous revision in source control. The build goes green again in minutes (the pipeline reruns against the known-good revision), the team leaves on a working state, and your failed changes stay in your local system, ready to be fixed with fresh context on Monday. Outcome: minutes of effort, working product, zero lost weekend.
  • Option 3 — leave the broken build. You walk out at 5:30 p.m. with the build red. Saturday and Sunday pass; Monday morning your memory of Friday's work is stale, the fix now takes much longer than it would have, and every teammate arriving to a red build knows who left it that way. Outcome: deferred pain, worse fix, damaged standing.

Decision: in this scenario, revert. Reverting restores the working state in minutes; the changes are not lost, only parked locally. Sense-check: the choice satisfies every rule from 11.2–11.5 at once — no code on top of a broken build (the revert removes the broken commit), a stable product over the weekend, and the author still owns the fix, just with fresh context later.

Q: The commit you made breaks the build at 5:30 p.m. on Friday. What is the right option: stay late, revert, or leave the broken build? A: Revert immediately. Fixing takes time and context; reverting restores the working state in minutes. Some students added that the choice depends on the use case, but for the standard Friday-evening case, revert seems fine and everyone was in line.

11.6.2 What Happens If You Leave It Until Monday

Why is leaving the broken build so bad? Walk through the weekend:

  • Say Saturday and Sunday you had some function at home, or a plan to go out somewhere. By Monday your memory is no longer fresh on what exactly you worked on Friday.
  • It will then take significantly more time to understand the problem and fix it.
  • Everyone will yell at you at the workplace. And if, by any chance, you get late on Monday, you should be ready to answer any number of calls from other team members, because they all know the build is broken.
  • Thanks to the pipeline, the audit is easy: you can find out because of which commit this particular build failed and who did that commit. Everyone is traceable.
  • And not the least: your name will be in mud. People will yell at you and conclude that you just work incorrectly and do not follow the best practices.

The weekend is an expensive place to store a problem. Context decays fast: two days away from the code is enough for the details of a Friday change to blur. The reference literature states the same cost explicitly — if you leave the build broken and return on Monday, your memory of the changes is no longer fresh, it takes significantly longer to understand and fix the problem, and if you are not the first person back fixing it, your name is mud with the rest of the team. And the damage is worse in distributed teams: teammates in another time zone may have their entire day's work blocked by a build that you left red on their side of the planet.

11.6.3 Staying Late vs. Check-In Early

What about option one — staying late to fix the build after working hours? The professor does not recommend it: extending work hours is a bad habit, and once you get that habit you ultimately lose your personal time, including family time. His own preference is clear — it is not his cup of tea; whatever the justification, he would rather not be in a position of staying late to fix issues.

The preventive rule that makes staying late unnecessary: check in early so you can have helping hands around. If a problem shows up while teammates are still present, you can dig into the issue together. Concretely, make a rule of checking in no later than one hour before you end your work. For example, if 6 p.m. is your end timeline, your check-in should be completed before 5 p.m.; after 5 p.m. you should not check in.

The professor's stance, preserved: staying late to fix builds is a bad habit — once acquired, it eats personal time and family time. His preference is to never be in that position at all, and the tool that avoids it is the check-in cutoff: complete your check-in no later than one hour before your workday ends, so that any problem appears while teammates are still around to help.

And even with a broken build at the end of the day, the best solution in this scenario is to revert in your source control: go to the previous version, keep the previous version active, and all the changes you made stay in your local system, ready to be fixed with fresh context tomorrow.

11.6.4 A Note on Flexible Work Hours

The professor also shared a personal stance on work-hour tracking, because it connects to how teams think about check-in discipline. Some people hate swipe in and swipe out, arguing that what matters is the work you deliver, not the hours you pass in the building. One experienced engineer described a workplace where there was no swipe system for him at all — he had a great bond with his manager, checked in late whenever comfortable, completed his job, and approved around 20 to 25 days of time cards each month. He later moved to a company that also had no swiping; the month they introduced swipe in and swipe out, he switched jobs the next month. His takeaway: how you like to work, and how your workplace treats that choice, varies a lot — but the pipeline rules themselves stay the same regardless of your hours.

Recap + bridge: When the Friday 5:30 p.m. commit breaks the build, revert immediately — fixing takes time and context, reverting restores the working state in minutes, and the failed changes stay safe locally. Leaving the build broken costs you context, time, and standing; staying late to fix it is a bad habit that the one-hour check-in cutoff prevents. The scenario naturally raises one more question, answered in the next section: if "revert" is the standard answer, what stops a team from reverting forever and never making progress?

11.7 The Time-Boxing Rule: Revert Smartly, Keep Progress

11.7.1 The Question That Drove the Rule

Hook: If the standard answer to every broken build is "revert," what stops a team from reverting forever — undoing every change the moment it looks difficult, and never shipping anything? There has to be a rule that keeps both goals alive: the product stays working, and the team still makes progress.

There is an obvious objection to "always revert": if everyone just follows revert blindly — revert, revert, revert, every time — how can the team ever make progress? One student jokingly suggested the answer is to find a new manager; the professor laughed and admitted his own history puts him in exactly that category of frequent reverters. But the serious answer is the time-boxing rule.

11.7.2 The 10-15 Minute Time Box

Whenever a build fails, the team should first try their level best to fix the issue within a fixed timeline of about 10 to 15 minutes. If, within that time period, there is no scope and no chance of getting it fixed, then — and only then — go ahead and revert to the previous version. This should be a universal rule in the team: first the time box, then the revert.

The rule has two halves, and both halves are mandatory. The first half forces an attempt: before any revert, you genuinely try to fix the failure, and you give that attempt a bounded window of roughly ten to fifteen minutes. The second half caps the attempt: when the window closes without a fix, you revert — you do not extend the window "just five more minutes" indefinitely. Ten minutes is a deliberate size: it is enough time to land the small fixes that are actually easy (a one-line correction, a missed import, a wrong flag), and short enough that a genuinely difficult problem cannot consume the afternoon.

Q: What will happen if you try to revert every time? How can you make progress? A: Follow the time-boxing rule. Give yourself a 10 to 15 minute timeline to try to fix the issue. If in that time you see no chance of getting it fixed, revert to the previous version. The time box guarantees progress is always attempted, and the revert guarantees the application never stays broken.

11.7.3 Why the Rule Works

The time box gives every failure a small, honest attempt at a real fix, so the team does not lose the habit of solving problems — and the revert caps the damage when the problem is beyond the current context. Progress happens in two ways: fixes that are achievable in minutes land, and everything else rolls back cleanly so the next attempt starts from a working state. This is the practice that keeps "be prepared to revert" from turning into "never fix anything."

Scope and pitfalls:

  • Scope: the time box applies to fixing a broken build, not to feature development. It is a failure-response rule, and treating it as a general "spend fifteen minutes, then give up" habit for feature work would be a misreading.
  • The ten-minute window is a team rule, not a personal mood. Experienced teams even police it for each other — a common practice is to revert anyone's build that has been broken for ten minutes or more, with or without the owner's consent.
  • Don't quietly extend the window. The boundary exists so that "I need a little more time" cannot grow into "I have been debugging since Friday." If the window closes, revert; you can always attempt the fix again from a green baseline.
  • Don't comment out the failing test to make the build pass. A tempting way to "fix" within the time box is to disable the failing test. That is a different violation: a test that stops failing by disappearing is a test that stops protecting the team, and commented-out tests accumulate silently. If the test is genuinely wrong, change it deliberately; if the code is genuinely wrong, fix the code.

Recap + bridge: The time-boxing rule answers the "revert every time" objection: try to fix the build for 10 to 15 minutes; if there is no chance of success within that window, revert to the previous version. Attempts protect the team's problem-solving habit, reverts protect the working state, and the two together guarantee progress. This closes the best-practices block of the lecture — and the next section zooms out to the machine that carries all of these practices: the generic CI/CD pipeline.

Real-world connection: The reference literature states the same rule almost word for word as a recommended team rule: when the build breaks on check-in, try to fix it for ten minutes; if you are not finished after that, revert to the previous version from your version control system, with a little leeway only if you are mid-way through a local build that may already contain the fix. Large organizations institutionalize the "first the time box, then the revert" pattern through gated commits — the pipeline refuses to accept a change that does not build and pass tests — so the discipline is enforced by the machine instead of by willpower.

11.8 The CI/CD Pipeline: A Generic Four-Phase Flow

11.8.1 The Big Picture

Hook: What actually happens between the moment a developer commits code and the moment that code runs in production? If you cannot draw that journey as one simple picture, you do not yet have a mental model of CI/CD — and this section gives you the picture that the exam expects.

With the best practices done, we move to the generic CI/CD pipeline concept — the mental model behind all of it. The one-line picture: you need a source code, a continuous integration system, and a path to production. The continuous integration software pushes the code to subsequent staging, acceptance testing, or functional testing environments; if every test conducted there gives a result of green — a pass — your code moves to the production environment. That final move is what we call continuous deployment.

The whole journey, in one pass:

IDE (write code)
         │ commit
         ▼
      pre-commit unit test ──fail──► go back, refactor
         │ pass
         ▼
      source code management (GitHub)
         │ push triggers CI automatically
         ▼
      compile ──► code inspection ──► quality gate ──► subsequent testing
                                                        │
                                                        ▼
                                              artifact repository (store the package)
                                                        │
                                                        ▼
                           same artifact through functional / UAT / end-to-end testing
                                                        │ all green
                                                        ▼
                                              production deployment

This single picture contains four concepts, each of which is one phase of the flow: continuous integration (phase 2 — everything between the commit and the stored artifact), continuous delivery (phase 3 — testing that same artifact through the next environments), and continuous deployment (phase 4 — the automatic push to production), with phase 1 being the developer's own local write-commit-unit-test loop. In the reference model of the deployment pipeline, these same stages appear as the commit stage (compile, unit tests, code analysis, build installers), the automated acceptance test stages, and the release stage — the pipeline is "an automated manifestation of your process for getting software from version control into the hands of your users."

11.8.2 Phase 1 — Write, Commit, Unit Test

The first phase starts with the developer writing code in any IDE — Visual Studio or any other you like. Then the developer commits that code. Once they commit, the pre-commit test happens, which is your unit test in this case:

  • If the unit test fails, the developer has to go back and refactor the code to clear that unit test.
  • If the unit test passes, the developer pushes the code to source code management (the source control repository).

This phase is deliberately the developer's own loop: the unit tests are fast enough to run locally, so the cheapest place to catch a problem is here, on the developer's machine, before anyone else sees the change. A unit test (a test that checks one small piece of the application in isolation — a single function or a small group of them, without the database, filesystem, or network) is the right tool at this stage because it runs in seconds. The commit-stage test suite in the reference model has the same shape: fast, primarily unit-level tests that the developer also runs before checking in.

11.8.3 Phase 2 — Continuous Integration: Compile, Inspect, Gate, Test

Once the code commit has happened, the continuous integration pipeline triggers automatically. Its steps, in order:

  1. Compile the code.
  2. Code inspection — check whether any code-level defects are present.
  3. Quality gate — if all threshold values are intact with this new code commit, the quality gate gives a green pass. The quality gate is the guard that decides whether this change is healthy enough to move forward.
  4. Subsequent testing — functional testing, capacity testing, or whatever testing is part of your project.
  5. Store the artifact — the package that got built is stored in an artifact repository.

This is the core continuous integration phase: the machine compiles the committed code, inspects it for code-level defects (duplicated code, security warnings, complexity, test coverage), checks the quality thresholds, runs the project's tests, and — only if everything is green — saves the produced package, the artifact, into an artifact repository such as JFrog. Note the word "automatic": no human triggers these steps; the commit itself triggers them. The quality gate deserves special attention because it is the guard: it holds the threshold values (for example, "test coverage must not drop below 80%" or "no new critical defects"), and a commit that breaks a threshold fails the gate even if every test passes.

11.8.4 Phase 3 — Continuous Delivery: Test the Same Artifact

The third concept is continuous delivery: the same artifact that was stored in the artifact repository should go further and follow the testing on the next environments — functional testing, user acceptance testing, and end-to-end testing. The word "same" matters: you do not rebuild between environments; the identical package travels through each test stage.

Why "same artifact" is non-negotiable: every rebuild is a chance for the package to change. Different compiler versions, updated libraries, or changed binaries between environments produce artifacts that differ from the one you tested — and then the tests prove nothing about what ships. The reference texts call this out as a core deployment-pipeline practice: build your binaries once, store them in the artifact repository, and reuse them without re-creating them at the point of use; some implementations even store hashes of the binaries at creation time and verify the bytes are identical at every later stage. Testing the exact artifact that will be deployed is what gives the team real confidence that production will behave like the tested environments.

11.8.5 Phase 4 — Continuous Deployment to Production

The fourth and last concept: if all testing is clear, that particular increment is pushed to the deployment production environment. That is continuous deployment — the automatic release of a fully tested increment.

The distinction between phases 3 and 4 is where many students lose marks. Continuous delivery means the tested artifact is ready to go to production — the team can release at any moment, and often a human presses the final button. Continuous deployment means the release itself is automatic: when the tests pass, the increment goes to production with no manual step in between. In this lecture's generic flow, phase 3 ends with the same artifact proven green across functional, UAT, and end-to-end testing, and phase 4 is the automatic push that follows.

11.8.6 The Whole Flow in One Pass

So the generic flow is: IDE → commit → pre-commit unit test → source code management → automatic compile → code inspection → quality gate → subsequent testing → artifact repository → same artifact through functional, UAT, and end-to-end testing → production deployment. This is the generic workflow people generally opt for, and it is the mental picture to carry into the exam.

Worked trace — one commit through all four phases:

Take a concrete change: a developer fixes a login bug in a web application.

  • Phase 1: The developer edits the login component in Visual Studio, runs the unit tests locally, sees them pass, and commits the fix. The pre-commit unit test is green, so the commit is pushed to the GitHub repository.
  • Phase 2: The commit automatically triggers the CI pipeline. The code compiles. Code inspection (for example SonarQube) finds no new code-level defects. The quality gate checks its thresholds — test coverage, complexity, duplicate code — and stays green. The project's functional and capacity tests run against the build. The resulting package is stored in the artifact repository as, say, login-fix-v1.2.3.
  • Phase 3: That exact package, login-fix-v1.2.3 — not a freshly rebuilt copy — is deployed to the functional testing environment, then to user acceptance testing, then to end-to-end testing. It passes all three; the same bytes are verified at each stage.
  • Phase 4: All testing is clear, so the increment is automatically pushed to the production environment.

Sense-check: the trace uses one artifact end to end (no rebuild between environments), every stage gate was passed before the next stage ran, and production received exactly the package that the tests approved — the three properties that define the generic pipeline.

Recap + bridge: The generic CI/CD pipeline is a four-phase flow: developer write-commit-unit-test loop, automatic continuous integration (compile → inspect → quality gate → test → store artifact), continuous delivery (the same artifact through functional, UAT, and end-to-end testing), and continuous deployment (automatic push to production). The next section shows how this backbone stays the same while the testing and deployment technologies change across application types — and which tools fill each stage.

Real-world connection: This generic flow is the pattern that real delivery teams reproduce with different tooling: a commit stage that compiles, unit-tests, analyzes, and assembles binaries; automated acceptance stages that exercise the same binaries in production-like environments; and a release stage that deploys them. Modern CI servers visualize exactly this — every check-in down one side, every pipeline stage it passed or failed, so a problem in acceptance testing can be traced to the precise commit that caused it. Whether the deployment target is a hosting server, Kubernetes, Docker, or a cloud platform, the four-phase shape is the same; only the tools inside the stages change.

11.9 Pipeline Variations by Application Type and the Tool Landscape

11.9.1 Web Applications

If you are building a web application, you typically need a CI server such as Jenkins, and your acceptance tests should follow on browsers, because a web application depends on different browsers. The testing tools differ from other application types, but the CI backbone is the same.

A web app is judged by how it behaves in the user's browser — Chrome, Firefox, Safari, Edge — and each browser can render and execute the same page differently. So the acceptance tests for a web application are browser-driven: the tests drive the application through real browser sessions, catching layout and behavior differences that a headless check would miss. The CI server that runs those tests is the same Jenkins (or any CI tool) used everywhere; what changes is the test tooling attached to it.

11.9.2 Mobile Applications

For mobile applications, you want to run this testing on physical mobile devices rather than browsers. The testing approach will be different and the coding approach will be different, but continuous integration stays the same: the same CI server (Jenkins, for example), with different tools and technologies used to perform those subsequent tests.

A mobile app depends on the physical device — its operating system version, screen size, memory, and sensor behavior — so the honest test environment is a device, not a desktop browser emulation. The CI backbone does not care: the same server triggers the same build on every commit, and the same stages (compile, inspect, gate, test, store artifact) run with mobile test tools swapped in for browser tools.

11.9.3 Microservices and Containers

For a microservice-based solution, you definitely introduce the Docker container — containerized solutions — and deployment happens on either Docker or Kubernetes, because your solution is a microservice and you want to deploy it into a containerized environment. Again, continuous integration can be the same and the source code repository can be the same; only the deployment and testing technologies differ. This is the generic pipeline for microservices on Kubernetes. If you are working with Azure — cloud solutions with a microservice architecture on Kubernetes — this is the generic scenario to picture.

A microservice (a small, independently deployable service that handles one piece of business functionality and talks to other services over a network) is packaged with its own runtime into a Docker container — a lightweight, self-contained package holding the service and everything it needs to run. Kubernetes (the container orchestration platform that schedules, scales, and manages those containers) is the deployment target for containerized microservices. The pipeline itself is unchanged: same CI server, same repository, same commit-stage stages. What differs is the last mile — instead of deploying a binary to a hosting server, the pipeline builds a container image, stores it, tests the same image, and deploys it into a Kubernetes cluster.

11.9.4 Tools at Each Stage

The tool landscape for the whole pipeline, as covered:

  • Continuous integration / build: Jenkins, Bamboo, CircleCI, TeamCity — pick whichever you are comfortable with; one or two names are enough in an answer.
  • Artifact repository: JFrog — one student confirmed it is the artifact repository in their setup, and that is correct.
  • Code inspection: SonarQube — used to inspect code-level defects.
  • Continuous feedback: Slack, Outlook, and similar tools.
  • Deployment targets: a hosting server, Kubernetes, Azure, AWS with S3 buckets and EC2 instances, Docker, or any other cloud platform.

Real-world: this slide-level landscape is exactly how real teams split the pipeline — the CI server, the artifact store, the inspection tool, and the deployment target are independent choices per project. AWS S3 (Amazon's object storage service) often holds build artifacts or static assets, while EC2 (Amazon's virtual servers) hosts application instances; these are interchangeable pieces in the deployment-target slot, not fixed requirements.

Pitfalls for the exam answer:

  • Mixing the slots. Saying "Jenkins stores the artifacts" or "SonarQube builds the code" loses marks — each tool has a stage: Jenkins builds, JFrog stores, SonarQube inspects.
  • Overloading the answer. One or two CI tool names are enough; the professor explicitly said so. A long list without per-stage structure adds noise, not marks.
  • Forgetting the feedback slot. Continuous feedback (Slack, Outlook, Teams) is a pipeline stage too, and it is easy to drop in a hurry.

Exam note: revise the CI/CD pipeline overview material — the generic pipeline idea and the tools available at each stage. This overview is a recommended revision aid because it carries the basic knowledge you need to start, and it also helps if you have not yet implemented CI/CD in your own project: it shows what each stage is for and what a real pipeline looks like before you have built one yourself.

Real-world connection: Containerized microservices on Kubernetes is the default architecture for modern cloud teams — the reference text's description of a deployment pipeline that runs whole applications in production-like environments maps directly onto this scenario, with Docker images playing the role of the "binaries" that are built once and promoted unchanged through every environment. The independence of the tool slots is what makes the ecosystem flexible: an organization can keep Jenkins and JFrog while moving its deployment target from a hosting server to AWS, without redesigning the pipeline.

11.10 Last Year's Paper: Keeping the Application in a Releasable State

11.10.1 The Question

We now walk through last year's question paper, question by question. The very first question: "The team is interested in keeping the application in a releasable state. The team has created branches to develop different features. What are the techniques one can use in such a situation to keep the application in a releasable state?"

This question carries a specific structure that the examiner chose deliberately: the situation is given (branches exist, one per feature), the goal is given (a releasable state), and the ask is for techniques — named practices, not vague good intentions.

11.10.2 The Clarification: Releasable, Not Just Working

The professor paused the class here for a terminology correction: he was not asking about a working state. He wanted a releasable state. The distinction is meaningful — an application can work and still not be fit to release; the question asks for the practices that keep the product always ready to ship.

Terminology correction — releasable vs. working: a working application runs without crashing; a releasable application is fit to ship — fully integrated, tested against the whole system, and ready for users. Working is a weaker condition than releasable: a half-finished feature branch can be "working" while master, the product, is not in a state anyone would release. The question is not "how do you keep the build green" but "how do you keep the product ready to ship at any moment."

11.10.3 Student Attempts and the Missing Term

The class offered plenty of correct concepts: pull requests and merging into the code base, regression testing before releasing from master, quality gates, frequent commits, automating the build process, keeping master stable, updating the master branch with every production release, and testing each feature fully. All of these ideas are right — and that is exactly the trap of this subject: whatever you write, it feels connected to the answer, but the examiner wants a best practice, a proper word. The word nobody said: branch by abstraction.

Q: The team wants a releasable state and has branches for different features. What techniques keep the application releasable? A: The named practice is branch by abstraction — the correct term the class missed. Students described the concept correctly (keep master stable, merge only fully tested code, test each feature fully) but never said the practice name, and the examiner wants the proper word. Keep the master branch stable and merge into it only when the code is fully tested — keep the feature branch as an abstract branch until it is ready. Other practices that could apply are the feature toggle (functional-level hiding of code) and breaking the requirement into such small components that every piece is releasable. But because the question says branches already exist, the best answer is branch by abstraction. The concept carries marks even if the name is missing — you will not get zero for describing the idea correctly.

11.10.4 The Three Techniques

The course covers three related techniques for keeping the product releasable:

  1. Branch by abstraction — develop each feature on its own branch; keep master stable and merge only fully tested code. This is the fit for the question, because the team already created branches.
  2. Feature toggle — functional-level hiding: ship the code with the feature hidden behind a switch until it is ready to be exposed.
  3. Small releasable pieces — break a requirement into such small components that every piece is independently releasable.

Worked trace — choosing the right technique for the question:

The question's setup: branches already exist, one per feature, and the product must stay releasable.

  • Option A — feature toggle: hide unfinished functionality behind a switch so the shipped code stays releasable. Sound practice — but the question already has branches, and a feature toggle is for hiding code on mainline, so it answers a different setup.
  • Option B — small releasable pieces: decompose each requirement so every piece ships independently. Also sound — but the question never asks about decomposition, and the branches already exist.
  • Option C — branch by abstraction: develop each feature on its own branch, keep master stable, and merge only fully tested code. This matches the question's own situation — branches already exist — and it names the practice the examiner expects.

Decision: branch by abstraction, because the question's constraint (branches already created) is exactly the situation this practice names. Sense-check: the choice uses the question's own wording as its justification — the technique that fits an existing-branches setup is the one that names how to run those branches safely.

11.10.5 How to Write the Answer

Exam note: a 4-mark question takes about four lines. Mention the practice name (branch by abstraction) plus its concept, and that is it. Keep it a simple theory answer, but stick to the points — do not write nonsense or irrelevant theory, or marks get deducted. And a general warning: in MCQ-style certification exams, all four options can look correct, but you have to choose the best suitable one — if you do not click the particular practice name, you score zero.

Real-world connection: The reference treatment of branch by abstraction describes it as the alternative to version-control branching for large-scale change: instead of merging a giant branch back at the end, you create an abstraction layer over the part to be changed, build the new implementation beside the old one, switch the abstraction to the new implementation when ready, and remove the old code. Teams like the ones that wrote the T2 and R2 texts use this pattern precisely to keep the application releasable while replacing large chunks of it — the same goal the exam question tests, and the reason the practice name, not just the idea, is what earns the marks.

11.11 Last Year's Paper: Compiling at Every Environment

11.11.1 The Question

Question two: "You joined a team where the source code is getting compiled at the development environment for unit test, the UAT environment for user acceptance testing, and then at the staging environment for the final system test. What is the problem with the current process? How can you improve it?"

Note what the setup describes: three environments — development, UAT (user acceptance testing, where users verify the software meets their needs), and staging (the environment that mirrors production) — and at each one, the source code is compiled again. The question asks you to name the problem this creates and to propose the improvement.

11.11.2 Why the Current Process Is Slow and Risky

Students spotted the issues quickly: it is platform dependent and it is time taking. The professor sharpened both points:

  • Time to market suffers. Every time, for all subsequent testing on subsequent environments, you are rebuilding the code. Building takes time, and each rebuild delays your time to market.
  • Every build creates a different artifact. Whenever you compile code on a different environment, factors intervene: the compiler versions in use, any changes in libraries, and changes in binaries. Compatibility issues will occur between environments.
  • Confidence drops. How can you bring confidence to your team members that the code will definitely work on the production environment if it was never tested as the exact thing that will ship? If you do the testing on the same artifact that will be deployed, that pushes confidence that this particular code will work even on the production environment.

Q: The source code is compiled at the dev environment, at UAT, and at staging, each time for the next test. What is the problem, and why is it time taking? A: The compilation should happen only once. Rebuilding at every environment is slow and risky: every rebuild consumes time, delays time to market, and produces a new artifact that may differ because of compiler versions, libraries, and binaries — compatibility issues appear. Rebuilding per environment also destroys confidence: testing the exact artifact that will ship is what convinces the team the code will work in production. The fix is to build once and promote the same artifact through every environment.

11.11.3 The Fix: Build Once, Promote the Artifact

The proven way: pack the code as an artifact once, and let the same artifact face each subsequent environment — UAT and staging included. You compile once, store the artifact, and test that same artifact in every environment, then promote it toward production. This is the concrete expression of the continuous delivery phase of the pipeline.

"Promote" is the operational word: the artifact does not get rebuilt or repackaged between environments; it is promoted — marked as passing each stage and moved to the next. This is exactly the "same artifact" rule from section 11.8: the package that passes user acceptance testing is byte-for-byte the package that later reaches production, so the testing evidence applies to the shipped product. If a difference ever sneaks in between environments (a recompiled jar, a different dependency resolution), the promotion chain is broken and the confidence argument collapses.

Worked trace — the broken process vs. the fixed one:

Three environments: dev, UAT, staging. The product is a Java web application built with a Maven-style build.

  • Current (broken) process: compile #1 on the dev machine for unit tests → compile #2 on the UAT server for user acceptance testing → compile #3 on the staging server for the final system test. Three compilations, each with its own compiler installation, library cache, and binary set. Each compile adds, say, 10 to 15 minutes of build time plus debugging of environment-specific differences; the same code can fail on UAT because it picked up a newer library that dev never saw. Time to market stretches by every rebuild, and production gets a fourth compilation whose outcome nobody has ever tested.
  • Fixed process: compile once on the CI server → store the single artifact in the artifact repository → promote that exact artifact to dev, then UAT, then staging, then production. One compilation; the same jar file (verified by its hash at each stage) faces every test. Time to market shrinks by all the duplicated builds, and the team's confidence rests on a real fact: the bytes that production will run are the bytes that passed every test.

Sense-check: the fixed process removes the three failure sources (time waste, artifact divergence, lost confidence) in one move — build once, promote the artifact.

11.11.4 Five Supporting Points for the Answer

When answering "how can you improve it," any five of the following points will do, with two to three lines per point:

  1. Build once and promote the same artifact through the environments (the core answer).
  2. Increase collaboration and remove waste — that in itself accelerates the timeline.
  3. Code inspection — code-level defects get easily addressed early.
  4. Automated testing — reduces the time to market.
  5. Continuous integration and continuous delivery as the overall process.

Exam note: two to three lines per point is more than enough. Stick to the points; if you write two or three lines that are totally irrelevant — blubbering around the terminology without sticking to the point — there will be a deduction.

Real-world connection: "Only build your binaries once" is a named practice in the deployment-pipeline literature, and real pipelines enforce it mechanically: binaries are created in the commit stage, stored with their metadata, and reused without re-creation at every point of use, with hash checks verifying that the promoted artifact is identical at every stage. The practice exists precisely because the textbook authors have seen bugs reach production from every one of the differences the professor listed — a different compiler version in a later stage, an unintended third-party library version, even a compiler configuration change.

11.12 Last Year's Paper: Technical Debt and the Quality Gate

11.12.1 The Question

Question three: "An organization has not yet implemented all DevOps practices. The team identifies the problem of increasing technical debt. Which DevOps practice will result in reducing the technical debt, and how?"

Hook: Borrowing money is fine — until the interest payments eat your salary. Software works the same way: taking a shortcut today ("ship it now, fix it later") is borrowing from the code base, and the interest is the growing cost of every future change.

Technical debt is the build-up of shortcuts and deferred quality in the code base. The term comes from Ward Cunningham, one of the creators of the wiki, who described it this way: when a team does not aggressively refactor its code base, the code becomes more difficult to change and to maintain over time, slowing down the rate at which the team can add new features. Like financial debt, it feels free at the moment you take it — the shortcut lets the feature ship today — but it accrues interest: each subsequent change now has to work around the shortcut, understand its mess, and spend extra effort that a clean code base would not demand.

11.12.2 The Answer: Code Inspection with Thresholds

The answer is code inspection — and under code inspection you mention your quality gate check. The practice that keeps debt in check is measuring it and refusing to let it grow.

Here is the mechanism, precisely: provide a threshold value for the quality gate — for example, technical debt should not be increased by so-and-so percentage. If a new code commit increases the debt beyond that threshold value, the quality gate fails it. The gate stops the change, and your team has to fix the debt first before the commit can move forward. This turns "we should reduce debt someday" into an automatic, per-commit guardrail.

Q: The organization faces increasing technical debt. Which DevOps practice reduces it, and how? A: Code inspection, with a quality gate. Set a threshold value — technical debt must not increase by more than X percent. If a new code commit pushes the debt past that threshold, the quality gate fails the commit and the team must fix it first.

Scope and pitfalls:

  • Scope: the quality gate contains debt — it stops it from growing — rather than magically removing what is already there. Existing debt needs a separate, deliberate reduction program (refactoring time, debt-sprint backlogs); the gate is the boundary that keeps the total from creeping upward again while that program runs.
  • Thresholds without measurement: you cannot gate what you do not measure. The quality gate needs concrete numbers — a debt ratio, test coverage, duplication, complexity — collected automatically by the inspection tool on every commit.
  • One gate, one number: a gate with a single threshold on one metric is enforceable; a gate with fifteen fuzzy criteria fails everything or nothing and quietly gets ignored.
  • The "someday" trap: without the gate, debt reduction is a promise. The gate is what converts the promise into an automatic decision that does not depend on anyone's mood on a given day.

Recap + bridge: Increasing technical debt is answered by the code inspection practice, specifically the quality gate: measure the debt, set a threshold, and fail any commit that pushes the debt past it. This is the same quality gate that appears in phase 2 of the generic CI/CD pipeline (section 11.8) — the guard that decides whether a change is healthy enough to move forward — now seen from the examiner's angle: it is the practice that keeps debt under control automatically.

Real-world connection: The quality gate is a daily, working mechanism in real pipelines. Code inspection tools (SonarQube being the best-known example) continuously report metrics such as test coverage, duplicated code, and maintainability, and CI servers treat violations of preset thresholds exactly the way they treat a failing test — the commit stage fails. The HP LaserJet story shows why this matters at scale: teams stuck in technical debt spend 20% of their time on detailed planning and 25% on porting code between branches, leaving only 5% for new features; a gate that refuses to let the debt grow is the precondition for ever escaping that ratio.

11.13 Last Year's Paper: Will AI and ML Aid DevOps?

11.13.1 The Question

Question four: "DevOps progress will be aided by AI and ML — do you agree with the statement? Write down two technical points that show why you agree or disagree." The professor clarified that this is not about MLOps as a discipline — it is asking whether AI/ML solutions change the way DevOps helps.

Hook: If a machine-learning model is just "more software," why does deploying it feel so different from deploying a web service? Because the model brings its own hungry demands — compute, data, retraining — that ordinary code never had, and DevOps is the discipline that feeds them.

Read the question carefully: it is not "is MLOps a thing?" and not "compare AI and DevOps." It is a yes/no opinion question with a specific format — take a position and back it with exactly two technical points. The professor's clarification matters for the answer: you are arguing that AI and ML solutions change how DevOps helps — the automation and infrastructure that DevOps provides become the enabler for ML workloads.

11.13.2 Two Technical Points for Agreeing

The class agreed, and the professor assembled the technical arguments:

  • AI/ML needs huge computational power. ML workloads demand more servers and more computational speed. Cloud as a catalyst — a topic already covered — matters here: with cloud you do not have to depend on ordering a server and waiting for it. ML is absolutely a research topic; there is a high chance that whatever work has been done has to be discarded. Waiting a long time for infrastructure that might be thrown away is not a solution.
  • ML needs lots of automation. The action still has to come from the human end; for prediction we can use ML. But building, training, and evaluating models is automation-hungry, and that is exactly what DevOps practices deliver.

Q: DevOps progress will be aided by AI and ML — do you agree? Give two technical points. A: Agree. First, ML needs huge computational power, so cloud as a catalyst is essential — you cannot wait for ordered servers when ML work may be discarded at any moment. Second, ML requires lots of automation; actions stay with humans, but prediction and pipelines can be automated. The result is MLOps: ML follows CI/CD pipelines, but with different terminology and technologies, as a multi-level pipeline rather than a single straightforward one.

11.13.3 MLOps: A Different, Multi-Level Pipeline

The professor closes the loop: this is why people have opted for DevOps practices for ML solutions — that is what we call MLOps. In MLOps, ML does follow a CI/CD pipeline, but the terminologies and technologies are different, and the pipeline is multi-level: it is not a single, straightforward pipeline. The extra levels reflect the extra stages an ML solution has — data, training, evaluation, and model deployment, on top of ordinary code.

Scope and pitfalls:

  • Do not answer with MLOps definitions. The question asks for two technical points on why AI/ML aids DevOps — name the compute demand and the automation demand, then you may close with MLOps as the natural consequence. Answering "MLOps is a discipline" without the two points misses the question's format.
  • Do not claim ML replaces the human. The action still comes from the human end; ML automates prediction, not judgment about what to build.
  • Do not forget the cloud link. The compute point only lands if you connect it to cloud as a catalyst — ordering physical servers for work that may be thrown away is the wrong mental model.

Recap + bridge: AI and ML aid DevOps — the two technical points are huge computational power (which makes cloud as a catalyst essential) and heavy automation needs (which DevOps practices supply). The consequence is MLOps: ML follows CI/CD pipelines with different terminology and technologies, as a multi-level pipeline whose extra levels reflect data, training, evaluation, and model deployment on top of ordinary code.

Real-world connection: MLOps is now a standard practice in industry: machine-learning teams version their data alongside their code, run training and evaluation as pipeline stages, and deploy models through the same gate structure as any service — but with extra stages for dataset validation, retraining triggers, and model-performance checks. The multi-level shape the professor describes is exactly what real ML platforms look like: a model pipeline (data → training → evaluation → deployment) that sits on top of the ordinary software pipeline, each level with its own tooling and its own gates.

11.14 Last Year's Paper: The Top Ten DevOps Tools

11.14.1 The Question

Question five is direct: "List the top ten DevOps tools and highlight and explain the tools." The professor's guidance: pick any three tools for continuous integration and explain how CI helps, then cover continuous monitoring, then continuous feedback.

Hook: "Top ten" sounds like you need to memorize a leaderboard. It is actually a permission slip: name any tools you know, as long as you explain what they do in the pipeline.

The question is open by design — "top ten" is not a fixed list, and no specific tool is mandatory. The professor's structure makes the answer easy to organize: three CI tools with a line of explanation each, one monitoring tool, one feedback tool, and the supporting explanation of how each helps. Ten names is the count; the categories are the marks.

11.14.2 Continuous Integration Tools

Any three CI tools work — Jenkins, CircleCI, TeamCity, Bamboo are all acceptable names. For each, explain how continuous integration helps: the automatic build and test of every commit keeps the application in a working state and gives fast feedback.

Worked mini-answer — the three-CI-tools block:

  • Jenkins — the most widely used open-source CI server: on every commit it checks out the code, compiles it, and runs the automated tests automatically, so the team knows within minutes whether the change broke anything.
  • CircleCI — a cloud-hosted CI service with the same job: each commit triggers a build and test run in the cloud, with fast feedback and no server to maintain.
  • TeamCity — a JetBrains CI server with strong build-metrics and reporting; every check-in is built and tested, and the results are shown on the team's build page.

What all three share is the CI core: automatic build + test per commit = working state + fast feedback. That shared explanation is what the examiner reads for.

11.14.3 Monitoring and Feedback Tools

For continuous monitoring, name your monitoring solution of choice. For continuous feedback, you can mention Slack or Teams. Even your GitHub integration counts: automating GitHub to integrate with your Slack or with your email will quickly give you the notification when your review comments are in — for example, whether your merge request was approved or not, and what comments you have received. You can immediately get that feedback instead of polling for it.

The mechanism worth explaining: continuous feedback is the automatic delivery of results to the people who need them. Without it, a developer must go check the CI page, poll the repository, or ask a teammate whether the review is done. With it, the notification arrives — a Slack message when the build turns red, an email when the merge request is approved, a Teams message with the review comments. The tool category exists precisely to close the loop that CI opens: CI produces the result, and feedback tools deliver the result to the human who must act on it.

Q: List the top ten DevOps tools and explain them. A: Pick three continuous integration tools (for example Jenkins, CircleCI, TeamCity) and explain how CI helps — automatic build and test of every commit keeps the application in a working state and gives fast feedback. Add continuous monitoring, and add continuous feedback — Slack, Teams, or GitHub integrated with Slack or email, which notifies you instantly about review comments and merge request approval status instead of you polling for them.

Pitfalls for the exam answer:

  • Listing without explaining. "Jenkins, CircleCI, TeamCity, Bamboo..." with no explanation earns no marks — the question says "highlight and explain," so each tool needs its role attached.
  • Ten CI tools in one category. Ten CI servers are not ten DevOps tools; the professor's structure (three CI + monitoring + feedback, plus the rest of the pipeline) is what makes the answer complete.
  • Forgetting feedback. The feedback category is easy to drop, and it is exactly the part that shows you understand the loop, not just the build.

Recap + bridge: The top-ten-tools answer is structured, not memorized: three CI tools (Jenkins, CircleCI, TeamCity, Bamboo — any three) explained as automatic build+test per commit, continuous monitoring, and continuous feedback (Slack, Teams, GitHub-to-Slack/email integration for review comments and merge-request status). This question connects straight back to the tool landscape of section 11.9 — the same categories, tested as a list.

Real-world connection: The feedback loop this question describes is how modern teams actually work: GitHub webhooks push merge-request events into Slack or email, so a developer gets notified the moment a review comment lands instead of checking the page repeatedly. Large organizations treat these integrations as part of the pipeline itself — the reference texts describe build status sent to lava lamps, wall monitors, and messaging channels, all serving the same goal: everyone can see the state of the build at a glance, and the people who must react are told the moment action is needed.

11.15 Last Year's Paper: Forty Engineers, Syncing Binaries and Libraries

11.15.1 The Scenario

Question six: "A 40-engineer team at a company is frequently facing sync issues of their product development binaries and libraries, as most of them are working on their local environment. You are a DevOps consultant. Address the above statement." Early student guesses were off-target: big team merge conflicts, "continuous integration is needed," "use Maven to align." The professor redirected: this is not related to continuous integration and not related to code review. It is strictly related to the binaries and libraries on which your application depends.

Hook: Forty engineers, forty laptops, forty slightly different copies of the same libraries. Every build is a lottery — which version of that logging library will today's machine pick?

The redirect is the heart of this question: the phrase "most of them are working on their local environment" is the clue, not the merge conflicts, not CI, not code review. A binary is the compiled, executable form of a program or library (a jar, a DLL, an executable); a library is a package of reusable code that the application depends on. The question is about how those artifacts are managed across machines.

11.15.2 The Real Problem: Manual Dependency Management

The problem is that the team is managing binaries and libraries manually, locally, per engineer. Each engineer's local environment drifts, and sharing the right versions of every dependency — including transitive dependencies (the dependencies of your dependencies) — breaks down. That manual management is exactly why they keep facing sync issues.

A dependency is anything your software needs in order to build or run — the application depends on its libraries, and each library may depend on further libraries of its own. Those second-level libraries are transitive dependencies: the dependencies of your dependencies. When forty engineers each download and store their libraries manually on their own machines, three things happen at once: machines drift (one has version 1.2, another 1.4), nobody has a single source of truth for "what versions does this product actually use," and the transitive graph — which library version goes with which — is reproduced from memory on every machine. The sync issues are not a bug; they are the predictable output of manual dependency management.

11.15.3 The Solution: Artifact Repository and Automated Builds

As a DevOps consultant you prescribe:

  1. Automate the build process — your build tool (for example Maven) automates the build and manages your application dependencies, including transitive dependencies, in a repeatable way.
  2. Use an artifact repository — maintain one repository where all binaries and libraries are part of the same repo, versioned and centralized, instead of living scattered across local machines.
  3. Make it automated — the retrieval and resolution of dependencies happens through the build tool against the artifact repository, so every engineer builds against the same known set of binaries.

The benefits to mention: consistent builds across 40 local environments, no manual syncing, and full traceability of which version of which library went into each build.

Worked trace — the diagnosis:

The setup: forty engineers, each building the product on their own local machine, each managing the product's binaries and libraries by hand. The symptom: frequent sync issues.

  • Wrong diagnosis 1 — merge conflicts: conflicts come from concurrent edits to the same files, but the question never says engineers edit the same files; it says they cannot keep binaries and libraries in sync. Different failure.
  • Wrong diagnosis 2 — CI is needed: continuous integration integrates code changes; it does not fix who-holds-which-copy-of-a-library. The build server itself would face the same library mismatch until the dependency source is centralized.
  • Wrong diagnosis 3 — use Maven to align: Maven is a build tool, and it does manage dependencies — but only when pointed at a real source of truth. Pointing forty machines at the public internet "latest version" still gives forty different builds. The missing piece is the central artifact repository.
  • Right diagnosis — manual dependency management: forty local environments, each with its own manual copies of binaries and libraries, including transitive dependencies reproduced by hand. The fix: automate the build (Maven), centralize the binaries (artifact repository), and let the build tool resolve every dependency — including transitive ones — from that repository.

Sense-check: the prescription removes the root cause (scattered manual copies) rather than the symptoms, and every one of the professor's benefits — consistent builds, no manual syncing, version traceability — follows directly from it.

Q: Forty engineers face sync issues of their product development binaries and libraries while working on local environments. What kind of problem is this, and what do you suggest? A: This is not a CI problem and not a code review problem — it is strictly binary and library management. The sync problem is about how binaries and libraries are handled, not about code integration. The team manages dependencies manually, and that is why they face sync issues. Automate the binaries and libraries with an artifact repository, and use the build process: the build tool automates the build and manages application dependencies, including transitive dependencies, centrally.

Scope and pitfalls:

  • Scope: this solution covers binary and library consistency. It does not replace code review, does not replace continuous integration, and does not fix merge conflicts — the professor explicitly separated those problems, and mixing them in an answer loses focus.
  • The internet is not a repository. Downloading "latest" versions at build time reproduces drift; the artifact repository pins the exact versions the organization has approved.
  • Versioning without traceability: storing libraries centrally without version labels gives you a pile, not a repository. Each artifact needs its version (for example nunit-2.5.5.dll), so a build report can name exactly what went in.
  • Repeatability as the test: if two engineers cannot produce identical binaries from the same repository state, the problem is still unsolved.

Recap + bridge: The forty-engineer sync problem is strictly binary and library management: manual, per-engineer dependency handling causes drift, especially through transitive dependencies. The prescription is an artifact repository plus an automated build tool (for example Maven) that resolves all dependencies from that central, versioned store — giving consistent builds, no manual syncing, and full traceability. This is the same artifact repository from the generic pipeline (11.8) and the same tool slot from the landscape (11.9), now tested as a dependency-management answer.

Real-world connection: Dependency mismanagement is so notorious it has a name — dependency hell (or DLL hell). Early Windows stored all shared libraries in one system directory without versioning, so new versions overwrote old ones and applications silently got whichever version loaded first; Java teams hit the diamond problem, where two libraries depend on different versions of the same third library and the application compiles but fails at run time. Artifact repositories and dependency-managing build tools are the industry's standard answer, and the reference texts recommend exactly what the professor prescribes: declare versions in the project's configuration, resolve them transitively, and control which versions are available through your organization's own artifact repository.

11.16 Last Year's Paper: Are DevOps and Agile the Same?

11.16.1 The Question

Question seven: "A company wants to transform their culture to DevOps, but in one department people think DevOps and Agile are all the same. What is your comment on it? Do you feel DevOps and Agile are the same?"

Hook: You can run a Scrum ceremony perfectly and still have a toxic wall between development and operations. Which of the two — the ceremony or the collaboration — is DevOps? The answer is in this question.

Notice the question's own wording does half the work: the company wants to transform their culture to DevOps. The word "culture" is the hint, and the department's error is to collapse DevOps into Agile, which lives at a different level.

11.16.2 The Answer: Process vs. Culture

The professor endorsed the class's answer: DevOps and Agile are not the same. Agile is a process — a way of working in iterations — while DevOps is a culture of collaboration between development and operations. A common way to put it: the DevOps process might look Agile, with some add-ons and amendments to it, but the two live at different levels. DevOps names the culture and collaboration model; Agile names the process rhythm inside it.

Dimension Agile DevOps
What it is A process — how you plan and iterate work (sprints, ceremonies, reviews) A culture — how development and operations teams collaborate
Primary concern Delivering software in iterative increments Keeping the delivery pipeline healthy end to end, from commit to production
Team shape Small cross-functional teams running iterations Development and operations working as one responsibility, not two silos
Relationship The process rhythm used inside the team The cultural envelope the process runs inside

The two are complementary, not competing: an organization can practice Agile perfectly — two-week sprints, planning poker, retrospectives — while development and operations still throw work over a wall at each other, which is the opposite of DevOps. And a team with a genuine DevOps culture will still run an Agile process. The confusion in the department comes from seeing the same meetings and the same rhythm and concluding that the names mean the same thing; what they are observing is one culture's process, not the culture itself.

Q: One department thinks DevOps and Agile are all the same. What is your comment? A: They are not the same. Agile is a process — how you plan and iterate; DevOps is a culture — how development and operations collaborate. The process might be Agile with some add-ons and amendments, but DevOps is the culture the organization is transforming toward, not just another process name. An Agile process can run inside a non-DevOps organization; DevOps is the cultural transformation that wraps the process.

Pitfalls for the exam answer:

  • "They are the same." The question is almost a trick — the department believes it, and the examiner wants the correction, not agreement.
  • "DevOps replaces Agile." They coexist; DevOps is not a new process to swap in for Scrum, it is the collaboration culture around the process.
  • Defining Agile only. Half an answer that describes sprints and iterations without ever naming the culture level misses the contrast the question is testing.

Recap + bridge: DevOps and Agile are not the same: Agile is a process (iterations, ceremonies, planning), DevOps is a culture (development and operations collaborating). The DevOps process may look Agile with amendments, but the levels differ — and that is the whole answer to the department's confusion.

Real-world connection: The process-versus-culture distinction shows up in how teams actually change. Organizations that only change their process adopt Scrum without touching the wall between development and operations — and keep suffering slow, high-risk releases. Organizations that transform their culture, as the reference texts describe, integrate operations into the daily work of development: operations engineers work inside delivery teams, deployments become shared responsibility, and the pipeline itself becomes the team's common product. The question's scenario — "transform their culture to DevOps" — is testing exactly this understanding: the goal is the culture, and Agile alone does not deliver it.

11.17 Last Year's Paper: Automation Tools vs. Bottlenecks

11.17.1 The Question

Question eight: "An organization has acquired the latest automation tools, hoping it will increase productivity by eliminating all bottlenecks. Being a DevOps specialist, comment on your view. Do you feel that bringing in the automation will help them increase productivity and eliminate all the bottlenecks?"

Hook: If you automate a broken process, do you get a fast broken process or a fixed one? A conveyor belt that moves garbage faster is still moving garbage.

This question reuses a misconception the course covered earlier in the semester, and the examiner expects you to recognize it: tools are not the transformation. The wording is deliberately inviting — "latest automation tools," "eliminating all bottlenecks," "increase productivity" — and the correct professional answer pushes back on the assumption.

11.17.2 The Misconception

The class leaned mostly toward yes — tools will help, processes get faster, test cases run automatically. But the professor flagged this as a misconception we have already covered: just by doing automation, do you feel your bottlenecks will be removed? No. Automation alone will not help much; DevOps is a culture that must be adopted, and the tools must be used with the best practices.

The trap is real because automation does help — test cases do run automatically, builds do get faster — and every one of those statements is true and still not the answer. The question asks whether automation eliminates all bottlenecks, and the correct answer is no, because the bottlenecks live in the process, and automation does not see processes; it executes them.

11.17.3 The Correction: Lean First, Then Automate

The key correction: if your process contains waste, and you apply automation tools to that process, you are automating the waste too — it stays inside the process. So the sequence matters: first perform value stream mapping and remove as much waste from your process as you can (become more lean), and only then start automating. Tools reduce bottlenecks only with the correct implementation — and correct implementation starts with a lean process.

Value stream mapping (drawing the complete journey of a piece of work through the organization — every step, every wait, every handoff — and marking how much time is value-added versus waiting or waste) is the diagnostic that makes the waste visible. The value stream map from the reference material tells the story in numbers: a product journey taking about three and a half months can contain waits of five days or more between stages, time that automation of individual steps would never recover, because the waits are structural. Automation applied before this mapping locks the waste in: the conveyor belt carries the garbage at high speed, and now it is harder to see that it was ever garbage.

Q: The organization acquired the latest automation tools expecting productivity to rise and bottlenecks to disappear. Will automation alone help? A: No — this is a misconception. Automation tools alone will not remove bottlenecks. If your process has waste and you automate it, the waste is included in the automated process. First perform value stream mapping and remove as much waste as possible; be more lean, and then automate. DevOps is a culture that must be adopted, and the best practices must be followed, or the tools just speed up the waste.

Scope and pitfalls:

  • Scope: the sequence is lean first, then automate. Automation is not optional — it is the necessary second half — but its value depends on what it automates.
  • "Tools = transformation." Buying the latest tools is a purchase, not a culture change; the professor's correction applies the earlier-semester lesson that DevOps is a culture to be adopted, with tools used alongside best practices.
  • Automating the bottleneck. An automated bottleneck is still a bottleneck — faster waste is not faster value. The map comes first so you know which step actually constrains the flow.
  • Dropping the lean step in the answer. The name "value stream mapping" and the order "remove waste, then automate" are the marks; describing only automation shows the misconception the question was designed to catch.

Recap + bridge: Automation tools alone will not eliminate bottlenecks — that is a misconception. If the process holds waste, automation includes the waste; the correct sequence is value stream mapping first, remove as much waste as you can (become lean), then automate. DevOps is a culture adopted with best practices, and tools used correctly inside that culture are what reduce bottlenecks.

Real-world connection: The lean-first principle is exactly how the deployment-pipeline literature justifies its own existence: much of the waste in releasing software is not slow builds but structural waits — testers waiting for good builds, developers receiving bug reports weeks late, builds waiting five days to reach a production-like environment. Automating individual steps without mapping the stream leaves those waits untouched, which is why value stream mapping is a standard starting exercise in DevOps transformations, and why "bring the pain forward" — testing early and often, not at the end — is one of the core delivery principles taught alongside it.

11.18 Last Year's Paper: Component-Based Architecture

11.18.1 The Question

Question nine is a direct question the professor did not need to touch in depth: for some application, the statements are given — there is one component for the login and sign-up page; once a person signs up, they can reserve a room according to their selection; and the app provides add-on services, like whether you want car hiring or not. Based on this component set, you are asked to draw the component-based architecture, draw the dependency graph and the pipeline, list the benefits of your component-based design, and show the upstream dependency.

Hook: Three features, three boxes — but which box is allowed to talk to which? Drawing the arrows between components is the answer to this question.

A component is a reasonably large piece of the application with a well-defined interface that can potentially be swapped for another implementation. The scenario names three components by their behavior: the login and sign-up page, the room reservation flow, and the add-on services (such as car hiring). The examiner wants to see that you can translate those statements into a component diagram with the dependency relationships drawn correctly.

11.18.2 What the Answer Must Show

For this kind of question, draw the components (login/sign-up, room reservation, add-on services) as boxes, connect them according to who depends on whom, and show the pipeline through which the components flow. For artifact versioning, use any version number format you are comfortable with — for example v1.2.3. The Set B version of the paper had the same question with a different application scenario, so practice the pattern rather than memorizing this one application.

The pattern to practice, on this scenario:

        ┌─────────────────────┐
              │  login/sign-up      │   component v1.2.3
              └──────────┬──────────┘
                         │  depends on (needs an authenticated user)
              ┌──────────▼──────────┐
              │  room reservation   │   component v1.2.3
              └──────────┬──────────┘
                         │  depends on
              ┌──────────▼──────────┐
              │  add-on services    │   component v1.2.3
              │  (e.g., car hiring) │
              └─────────────────────┘

The drawing has three parts: the boxes (the components), the arrows (the dependency graph — who needs whom), and the version labels (each component is independently versioned, for example v1.2.3). The pipeline part shows how the components flow: each component is built, tested, and stored as a versioned artifact in the artifact repository, and the application is assembled from the approved component versions.

11.18.3 Upstream and Downstream Dependencies

The essential understanding behind the question: what is an upstream dependency and what is a downstream dependency. In a dependency graph, the component that something else depends on is upstream; the component that relies on it is downstream. If you change an upstream component, every downstream component is affected — which is precisely why component-based design, with clear dependency graphs and versioned artifacts, keeps large applications manageable.

Scope and pitfalls:

  • Scope: upstream/downstream is about the dependency direction, not the direction of work or the direction of data. In this scenario, room reservation is downstream of login/sign-up; login/sign-up is upstream of room reservation. A change to the login component (an upstream change) forces re-testing of room reservation and add-on services (downstream effects).
  • Drawing arrows backwards. Arrows point from the dependent to the dependency (or equivalently, from downstream to upstream, depending on your convention) — the mistake that costs the marks is drawing data flow instead of dependency.
  • One component per feature, no relationships. Three unconnected boxes is not a dependency graph; the question explicitly asks for the graph, so the arrows are the deliverable.
  • Forgetting versioning. Any consistent scheme works (v1.2.3 is fine), but versioning must be shown, because the benefits you list (independent change, controlled upgrades) depend on versioned artifacts.

Recap + bridge: Component-based architecture questions follow one pattern: draw the components as boxes, connect them by dependency (upstream = what others depend on, downstream = what relies on it), show the pipeline the components flow through, version the artifacts (for example v1.2.3), and list the benefits — independent development, controlled impact of change, and manageable integration. The Set B paper reused the pattern with a different application, so the skill is the pattern, not the scenario.

Real-world connection: Component-based design is how the reference literature recommends keeping large applications manageable: components are independently deployable pieces with clear interfaces, teams develop them at different rates, and the deployment pipeline assembles the application from the approved versions of each component. The dependency direction is the critical fact — if an upstream component changes, every downstream component is affected, so versioned artifacts and clear dependency graphs are what let a large team change parts of the system without breaking the whole.

11.19 Last Year's Paper: Five Activities Version Control Can Manage

11.19.1 The Question

Question ten: "Mention any five project or product development activities which can be managed by version control system." The professor flagged a trap in the wording: the question says version control system, not source code version control system. Source code is not the only answer — any file can be version controlled.

Hook: Your application's source code is only a fraction of what your project actually is. The build definition, the test data, the deployment script, the documentation — every one of them changes, and every one of them needs history.

Version control (keeping a complete, recoverable history of every change to a set of files, so any earlier state can be inspected or restored) is not a source-code-only tool. The question's wording is the clue: it says version control system, and a version control system tracks files. Anything that changes, needs to be audited, or must be reproducibly rebuilt belongs in version control — the reference texts put it directly: everything needed to create, install, run, and test the application should be checked in, from code and tests to database scripts, build scripts, and deployment scripts.

11.19.2 The Five Activities — and More

The answers, which students called out one by one:

  1. Configuration as code — configurations can be version controlled.
  2. Test cases — your test cases live in version control.
  3. Documentation — documentation can be version controlled.
  4. Code — the source code itself, of course.
  5. Jenkins pipeline / deployment scripts — the pipeline definition and your deployment scripts can be version controlled.

The professor's verdict: that is the correct answer, and the general principle is simply — any file.

Pitfalls for the exam answer:

  • Answering "source code" five times. "Code, code, code, code, code" is the trap the wording laid: five different activities are asked for, and source code is only one of them.
  • Naming five tools instead of activities. "Git, GitHub, SVN..." does not answer "activities which can be managed" — the answer is what you put under version control, not which tool you use.
  • Stopping at five. Five is the minimum the question asks for; the principle behind it — any file that changes belongs in version control — is what the examiner rewards.

Recap + bridge: The trap in question ten is the wording — version control system, not source code version control system. The five activities: configuration as code, test cases, documentation, source code, and Jenkins pipeline or deployment scripts — with the general principle behind all of them: any file. This single principle reappears in the next lecture's material on pipeline definitions and is the foundation of pipeline as code and configuration as code.

Real-world connection: This is exactly how modern teams operate: pipeline as code, configuration as code, and infrastructure as code all lean on the version control system, not just the application source. The reference texts make the same point about the commit stage of the deployment pipeline — the build and deployment scripts are treated like the codebase itself: stored in version control, tested, and refactored, because a pipeline whose definition is not version controlled is a pipeline nobody can reproduce or audit.

11.20 Last Year's Paper: Many Developers, One Repository

11.20.1 The Question

The last question: "What challenges can arise as a result of multiple developers contributing to the same repository, and what tactics can be used to address them?" The answer: concurrent working, which produces conflicts.

Hook: Two developers fix two different bugs in the same file at the same time. Their changes are both correct — and they still cannot both land. That collision, and what to do about it, is the whole question.

The challenge is the direct product of concurrency: when several developers work on the same repository at the same time, their changes to shared files overlap, and the version control system cannot combine them without help. That overlap is a merge conflict — a situation where two changes touch the same lines (or the same logical region) of a file, and the tool needs a human to decide which version, or what combination, is correct.

11.20.2 Conflicts Need Manual Intervention

The first line of the answer should be clear: conflicts cannot be solved automatically. The tool will show you what the conflicts are, but resolving them needs a manual intervention. The tactics are the two places where you can perform that intervention.

The version control tool is a detective, not a judge: it compares the two change sets, identifies the exact lines where both authors edited the same region, and marks the conflict for the reader. What it cannot do is decide the intended meaning — the two edits may be semantically contradictory (both change the same function's behavior in different ways), and only a person who understands the intent can pick the right resolution. The professor's warning stands unqualified: conflicts cannot be solved automatically; manual intervention is always needed.

11.20.3 Where to Resolve Conflicts

  1. On your local system — resolve the conflicts with manual intervention on your local copy (as covered in the tutorial session).
  2. On the GitHub repository (the remote server) — you can also resolve those conflicts directly on GitHub.

Either way, manual intervention is required, plus a review of the conflict resolution. Frequent, small commits and quick merges reduce how often conflicts happen, but the resolution itself is always a human decision.

Worked trace — a conflict and its resolution:

Two developers, A and B, both start from the same repository state. The file settings.py contains the line max_users = 100 at line 10.

  • Concurrent working: developer A changes line 10 to max_users = 200 (a capacity fix). Developer B, at the same time, changes line 10 to max_users = 150 (a load-testing change). Both commit.
  • The merge: the version control system merges A's change, then tries to apply B's change. The tool detects that both authors edited line 10 and marks a conflict; it shows both versions side by side and asks for a decision. It cannot choose — both edits are syntactically valid.
  • Manual intervention: developer B opens the conflict markers, sees A's 200 and their own 150, and decides the correct value — say 200 with the load-test adjustment kept elsewhere — edits the file to that result, and completes the merge.
  • Where it happens: this editing can be done on B's local system with the repository tools, or directly on GitHub's conflict-resolution interface on the remote server. Either location, the decision itself is human, and the resolution gets reviewed by the team before it counts as done.

Sense-check: the trace shows the three facts the question tests — concurrent working produces conflicts, the tool only identifies them, and the resolution is a manual intervention that happens locally or on GitHub.

Q: What challenges arise when multiple developers contribute to the same repository, and what tactics address them? A: The challenge is conflicts, caused by concurrent working. Conflicts cannot be solved automatically — the tool shows you the conflicts, and you need manual intervention. Resolve them either on your local system or directly on the GitHub repository, the remote server, and review the resolution.

Scope and pitfalls:

  • Scope: manual intervention is required for resolving conflicts; it does not mean conflicts must happen. Frequent, small commits and quick merges keep overlaps small and rare, which is the preventive half of the answer.
  • "Let the tool resolve it." Auto-merge is not conflict resolution — the tool merges what it can merge and stops at what it cannot; the conflicting region is always the human's.
  • Resolving without reviewing. A conflict resolution is a code change like any other; skipping the review reintroduces exactly the mistakes the merge was trying to contain.
  • Ignoring the second location. "Local system" is the common answer; "directly on GitHub" is the second tactic the question's "tactics" (plural) expects.

Recap + bridge: Many developers, one repository — the challenge is conflicts from concurrent working, the hard fact is that conflicts cannot be solved automatically, and the tactics are the two places where manual intervention happens: your local system or the GitHub repository (the remote server), always followed by a review. This ties back to the branch-by-abstraction question (11.10): branches reduce conflicts by separating work, and the merge discipline of the Friday-scenario practices (11.6) keeps the conflicts that do occur small and cheap.

Real-world connection: The reference literature confirms both halves of the answer. Merge conflicts grow as branches and changes accumulate — integrating long-lived, rarely merged work becomes exponentially harder, which is why trunk-based development and daily check-ins exist: small, frequent merges keep conflicts small. And the resolution is documented as a human task: the revision control system merges what it can, and when it detects a change it cannot merge automatically, the developer is asked to resolve the conflict — the same manual intervention the professor's answer names, in the same two locations.

11.21 Exam Logistics, Marking, and Practical Details

11.21.1 The Paper: 30 Marks, One Set

The mid-semester paper is worth 30 marks in total. Last time, because of the huge crowd, two different sets of the exam were set up — Set A and Set B — and students got questions from either one. This time, the professor indicated, there are no multiple sets: everyone gets the same paper. The scope is the syllabus covered so far — the best practices. There are no questions on Jenkins jobs or pipelines; that belongs to the next session. The professor's promise: after this discussion, the upcoming exam will feel easier, because you will be in a position to think in the way the answers are expected.

The exam's boundaries, in one line: 30 marks, one set for everyone, open book, covering the best practices and the CI/CD pipeline concept — and explicitly not covering Jenkins jobs or pipelines, which arrive in the next session.

11.21.2 Open-Book Rules and Web References

This is an open-book exam — and as the professor put it, first exams are always difficult, or rather confusing sometimes; that is what open-book exams are meant for. The reference material includes some website links. Those references are purely for your in-depth understanding; you most likely will not need them during the examination, but you are allowed to refer to those web pages, and you can toggle between the browsers while doing so.

Q: Are we allowed to refer to the website links in the reference material during the exam? A: Yes. The references are purely for in-depth understanding; you will most likely not need them during the examination, but you are allowed to refer to those web pages, and you can toggle between browsers.

One joke deserves recording: asked whether the faculty should be available during the examination as a proctor, chatting in the exam chat box to say "read the question again," the professor laughed — the faculty who taught the syllabus is exactly who should be monitored, he said. And on hints for the upcoming exam: whatever was already shared is already too much extra help; if the same question were put in the exam, everyone would score full marks, the institute would surely notice, and he would be looking for another job.

Q: Can you give some hints for the upcoming exam? A: Whatever was already discussed is already too much extra help. If the same question were put in the exam, everyone would get a perfect score, the institute would surely notice, and there would be a job hunt in order. In seriousness: the walkthrough itself is the preparation.

11.21.3 Regular vs. Makeup Exams

Asked whether the difficulty level will be higher in the makeup exam: yes, as per the rules, makeups are a little bit tougher than the regulars — but it is not a huge difference. The makeup is a facility given to candidates who were not prepared and wanted extra time to prepare, so a slightly higher difficulty is expected. One firm rule: makeup question papers are never shared on any platform, ever; regular papers are always shared.

Q: Will the difficulty level be more in the makeup exam? A: A little bit, yes — makeups are slightly tougher than regulars, as per the rules, because the makeup is a facility for candidates who need extra time to prepare. The difference is not huge. Makeup question papers are never shared on any platform; regulars are always shared.

The professor's warning on first exams: first exams feel confusing, not necessarily hard — that is what open-book exams are designed to do. The defense is to re-read the question: an open-book paper rewards understanding the wording (as the releasable-state question showed) over recalling the page. And the makeup rule is firm: makeup papers are a little tougher and are never shared on any platform — so prepare for the regular, not for a second chance at the same questions.

11.21.4 Answer Scripts and Evaluation

Will students get the solutions after the exam so they can see where they went wrong? As per the rules, the answer scripts cannot be shared. But after the examination, during one of the sessions, the class can walk through the mid-semester paper and the points that were needed to cover. The hard copy will not be shared. The question papers and the evaluation happen through the teaching assistant — but the instructors will let the evaluators know how to evaluate and what to evaluate, and the evaluators are industry experts, so the marking follows the same expectations as the walkthrough.

Q: Will we get the solutions of the exam questions after the mid-semester so we can see where we got wrong? A: As per the rules, the answer script cannot be shared. But after the examination, during one of the sessions, we can walk through the mid-semester paper and the points that needed to be covered. The hard copy will not be shared, and the evaluation happens through the teaching assistant, who will be guided on what and how to evaluate.

11.21.5 Grading and Passing

On passing marks: the grading follows the overall marks formula you went through during the orientation program. It is relative — the grades are decided by the performance of the class: whoever scores the highest marks, based on that, the grading starts; it is cumulative. So everyone should pass without panic — and no, there should be no strike to redefine the criteria, and no plan where nobody writes more than 20 marks of questions so that everyone scores at least 10 or 15. That kind of scenario is a joke, not a strategy.

Q: What are the passing marks? A: The grading follows the overall marks formula from orientation. It is relative to the class performance: whoever scores the highest marks, the grading starts from there, and it is cumulative. Don't panic — you will be able to do it, and for this subject the exam is not as difficult as it feels.

Recap + bridge: The logistics in one pass: 30 marks, one set, open book, best-practices scope, no Jenkins pipeline questions; web references allowed during the exam; makeups are a little tougher and their papers are never shared; answer scripts are not handed back, but a walkthrough of the paper happens in a later session; grading is relative and cumulative, anchored by the class's highest score. The preparation is the walkthrough itself — the eleven questions of last year's paper just walked through are the practice the exam rewards.

Exam Guidance Summary

  • The paper: 30 marks total, one set this time (previously Sets A and B due to the crowd), open book, mid-semester scope covering the best practices and the CI/CD pipeline concept. No questions on Jenkins jobs or pipelines — that is the next session's material.
  • Expected question types: problem-statement questions (for example, a team always checking code into an unstable application — suggest following continuous integration and name one or two CI tools such as Jenkins, CircleCI, or TeamCity), plus the walkthrough topics from last year's paper: releasable state via branch by abstraction, build once and promote the artifact, technical debt via code inspection and quality gates, AI/ML aiding DevOps, top ten DevOps tools, binaries and libraries sync via artifact repositories, DevOps vs. Agile, automation without lean, component-based architecture with dependency graphs, five version-control activities, and merge conflicts.
  • Answer writing: a 4-mark question takes about four lines; two to three lines per point is enough. State the practice name and its concept; stick to the points; irrelevant theory or blubbering around a topic causes deductions. The concept alone earns marks, but the exact practice name is what MCQ-style exams require.
  • Open book and references: web links in the reference material are allowed during the exam; you can toggle between browsers; the links are for in-depth understanding and most likely will not be needed during the exam.
  • After the exam: answer scripts are not shared per the rules, but a walkthrough of the paper and the required points happens during a session; the evaluation is done through the teaching assistant, guided by the instructors, by industry-expert evaluators.
  • Regular vs. makeup: makeup exams are a little tougher; makeup question papers are never shared; regular papers are always shared.
  • Grading: relative and cumulative — based on the class performance, with the grading scale starting from the highest score; everyone can pass.
  • Study aid: the CI/CD pipeline overview material — the generic pipeline idea and the different tools — is the recommended revision resource, and it also helps if you have not yet implemented CI/CD in your own project.

Key Industry Applications

  • GitHub as the pipeline gate and audit trail: every commit is traceable — which commit failed a build and who made it (see 11.2).
  • CI servers: Jenkins, Bamboo, CircleCI, TeamCity — the continuous integration backbone for web, mobile, and microservice pipelines (11.9).
  • Artifact repositories: JFrog — central storage of build artifacts (11.8, 11.9).
  • Code inspection: SonarQube with quality gates and threshold values that block debt-increasing commits (11.9, 11.12).
  • Continuous feedback: Slack, Teams, Outlook/email, and GitHub integrated with Slack or email for instant review-comment and merge-request notifications (11.14).
  • Deployment targets: hosting servers, Kubernetes, Docker, Azure, AWS with S3 buckets and EC2 instances, and other cloud platforms (11.9).
  • Containerized microservices: Docker containers deployed on Docker or Kubernetes, with the same CI and source repository and only deployment/testing technologies differing (11.9).
  • Dependency management: build tools such as Maven, with an artifact repository, handling application and transitive dependencies across large teams (11.15).
  • MLOps: ML solutions follow multi-level CI/CD pipelines with their own terminology and technologies (11.13).
  • Version control beyond source code: configuration as code, test cases, documentation, and pipeline/deployment scripts all version controlled (11.19).

ITD Lecture 11 notes · Continuous Integration Best Practices and CI/CD Pipelines

Introduction to Devops· postgraduate· 2026-08-14

Sections Breakdown

1Recap: The CI Best Practices Covered So Far

Recap of the two CI best practices already in place - a short build-and-test loop and a production-like workspace - plus the preview of the four new practices this session adds.

2Don't Check In on a Broken Build

The cardinal sin of continuous integration: why never adding code on top of a broken build keeps the application stable, the three consequences of violating the rule, and the traceability the pipeline buys.

3Commit Locally, Then Let the Pipeline Carry It to Production

Why every change must travel the same route - commit locally, push, let the pipeline build, test, and inspect, then deploy - and what a bypass costs the stable-state guarantee.

4Wait for the Commit Test to Pass Before Moving On

The check-in owner monitors the commit-stage build and never goes home with a broken build; the author's fresh context makes them the cheapest person to react to a failure.

5Always Be Prepared to Revert

When the build is broken and the fix is not within immediate reach, step back to the last known-good revision; the broken changes stay safe locally, and reverting is a temporary fallback, not a defeat.

6The Friday 5:30 p.m. Broken-Build Scenario

A realistic Friday-evening decision: revert immediately rather than stay late or leave the build broken, plus the one-hour check-in cutoff and the professor's stance on flexible work hours.

7The Time-Boxing Rule: Revert Smartly, Keep Progress

The answer to the 'revert every time' objection: try to fix the build for 10 to 15 minutes, and only if the fix is out of reach within that window, revert to the previous version.

8The CI/CD Pipeline: A Generic Four-Phase Flow

The mental model the exam expects: the developer's write-commit-unit-test loop, continuous integration, continuous delivery of the same artifact, and continuous deployment to production.

9Pipeline Variations by Application Type and the Tool Landscape

How the same CI backbone serves web, mobile, and microservices applications - with Docker and Kubernetes in the last mile - and the tool landscape at each stage: Jenkins, JFrog, SonarQube, Slack.

10Last Year's Paper: Keeping the Application in a Releasable State

Question 1: with feature branches already created, the technique that keeps the application releasable is branch by abstraction - keep master stable and merge only fully tested code.

11Last Year's Paper: Compiling at Every Environment

Question 2: compiling the source at dev, UAT, and staging is slow and risky; build once and promote the same artifact through every environment, with five supporting points for the answer.

12Last Year's Paper: Technical Debt and the Quality Gate

Question 3: increasing technical debt is answered by code inspection with a quality gate - set a threshold and fail any commit that pushes the debt past it.

13Last Year's Paper: Will AI and ML Aid DevOps?

Question 4: two technical points for agreeing - ML needs huge computational power (cloud as a catalyst) and heavy automation - with MLOps as the multi-level pipeline that follows.

14Last Year's Paper: The Top Ten DevOps Tools

Question 5: structure the 'top ten tools' answer by category - three CI tools explained, continuous monitoring, and continuous feedback such as Slack or Teams.

15Last Year's Paper: Forty Engineers, Syncing Binaries and Libraries

Question 6: the sync problem is strictly binary and library management, not CI or code review; the fix is an artifact repository plus an automated build tool that resolves dependencies, including transitive ones, centrally.

16Last Year's Paper: Are DevOps and Agile the Same?

Question 7: Agile is a process and DevOps is a culture of collaboration between development and operations; the two live at different levels and coexist.

17Last Year's Paper: Automation Tools vs. Bottlenecks

Question 8: automation alone does not eliminate bottlenecks - automate a process with waste and the waste stays; value stream mapping and lean first, then automate.

18Last Year's Paper: Component-Based Architecture

Question 9: the component-diagram pattern - boxes for the components, arrows for dependency, versioned artifacts, and upstream versus downstream dependency.

19Last Year's Paper: Five Activities Version Control Can Manage

Question 10: the version-control trap - five activities beyond source code: configuration as code, test cases, documentation, code, and pipeline or deployment scripts; any file can be version controlled.

20Last Year's Paper: Many Developers, One Repository

Question 11: concurrent working produces conflicts that cannot be solved automatically - resolve them manually on the local system or directly on GitHub, then review.

21Exam Logistics, Marking, and Practical Details

The mid-semester exam in one place: 30 marks, one set, open book, scope and exclusions, web references, makeup rules, answer scripts, and relative grading.

22Exam Guidance Summary

The professor's consolidated exam strategy: paper format, expected question types, answer-writing rules, and the recommended revision aid.

23Key Industry Applications

Where the lecture's concepts meet real pipelines: GitHub as the audit trail, CI servers, artifact repositories, code inspection, feedback tools, and MLOps.

Postgraduate students of software engineering and delivery

Exam Revision Notes

Below is the distilled, exam-ready core. Every entry comes from the full explanation above. Use this section for rapid review; return to the main notes when a point needs more context.

Recap: The CI Best Practices Covered So Far

Must-know: Two CI best practices precede everything in this session: keep the build-and-test loop short (fast feedback, small batches, cheap reverts; about 10 minutes maximum, 90 seconds ideal) and treat the local workspace like production (same automated processes, known-good starting revision from version control).

⚠️ Top pitfall: Having a fast build that runs on a machine that looks nothing like production, or a production-like workspace with a build so slow nobody uses it — the two practices must hold together.

Self-check: Why does a long build-and-test loop make a broken build harder to trace?

Connects to: Section 11.2, Section 11.3, Section 11.4, Section 11.5

Don't Check In on a Broken Build

Must-know: Don't check in on a broken build — CI's first intention is keeping the application always in a stable, workable state; the three consequences of violating it are an unstable growing code base, much longer fixes, and a team that stops caring.

⚠️ Top pitfall: Thinking a small commit on a red build doesn't matter; every commit on a broken build multiplies the investigation work for the person fixing it.

Self-check: Name the three consequences of checking in on a broken build.

Connects to: Section 11.3, Section 11.4, Section 11.5, Section 11.6

Commit Locally, Then Let the Pipeline Carry It to Production

Must-know: Commit locally, then direct to production: the four-step route is commit locally, push to the GitHub repositories, let continuous integration run build/testing/inspection/testing on different environments, then push the result to production — the pipeline is the only controlled, repeatable place where build, tests, and inspections happen.

⚠️ Top pitfall: The emergency hotfix edited directly on the production server — it has never been built, inspected, or tested by the pipeline, and it silently becomes the production baseline.

Self-check: Why must every commit, even urgent ones, travel the same pipeline route?

Connects to: Section 11.2, Section 11.8, Section 11.9

Wait for the Commit Test to Pass Before Moving On

Must-know: Wait for the commit test to pass before moving on: the check-in owner monitors the build progress and never goes home with a broken build, because the author has the freshest context and is the best person to react the moment the build fails.

⚠️ Top pitfall: Starting the next task or going to lunch while your commit's build is still running — the failure arrives in the middle of something else, and the fix costs far more.

Self-check: Who is responsible for monitoring the build after a check-in, and why?

Connects to: Section 11.2, Section 11.5, Section 11.6

Always Be Prepared to Revert

Must-know: Always be prepared to revert to the previous revision: when the build broke and the exact solution is not known at that moment, come back to the previous version to keep the application in a working state; the broken changes stay in the developer's local system, and reverting is a temporary fallback, not a defeat.

⚠️ Top pitfall: Treating revert as personal failure and hesitating — that leaves the build red and drifts the team back into the 'stops caring' spiral; reverting is the pilot's go-around, a normal practiced maneuver.

Self-check: What happens to your broken changes when you revert?

Connects to: Section 11.2, Section 11.6, Section 11.7

The Friday 5:30 p.m. Broken-Build Scenario

Must-know: Friday 5:30 p.m., broken build: revert immediately. Fixing takes time and context; reverting restores the working state in minutes and the changes stay locally. Leave the broken build and Monday brings stale context, longer fixes, and a damaged reputation; stay late and you feed a bad habit. Check in no later than one hour before your end of work.

⚠️ Top pitfall: Leaving the broken build over the weekend — by Monday your memory of the change is no longer fresh, the fix takes significantly longer, and the audit trail still shows your name on the failing commit.

Self-check: At 5:30 p.m. Friday your commit breaks the build — what is the right option and why?

Connects to: Section 11.2, Section 11.4, Section 11.5, Section 11.7

The Time-Boxing Rule: Revert Smartly, Keep Progress

Must-know: The time-boxing rule: whenever a build fails, first try to fix it within a fixed timeline of about 10 to 15 minutes; if within that time there is no scope and no chance of getting it fixed, only then revert to the previous version — first the time box, then the revert.

⚠️ Top pitfall: Quietly extending the window past 10-15 minutes ('just five more'), or commenting out the failing test to make the build pass — both break the rule's purpose of guaranteed progress plus a working state.

Self-check: If you tried to revert every time, how can the team ever make progress?

Connects to: Section 11.5, Section 11.6, Section 11.8

The CI/CD Pipeline: A Generic Four-Phase Flow

Must-know: Generic CI/CD flow: IDE to commit to pre-commit unit test to source code management to automatic compile to code inspection to quality gate to subsequent testing to artifact repository to the same artifact through functional, UAT, and end-to-end testing to production deployment — continuous integration is the automatic pipeline phase, continuous delivery tests the same artifact onward, continuous deployment is the automatic release to production.

⚠️ Top pitfall: Confusing continuous delivery with continuous deployment: delivery means the tested artifact is ready (a human may press the final button); deployment means the release to production is automatic.

Self-check: Why must the same artifact, not a rebuilt one, travel through every test environment?

Connects to: Section 11.3, Section 11.9, Section 11.11

Pipeline Variations by Application Type and the Tool Landscape

Must-know: Web apps: CI server such as Jenkins plus browser-based acceptance tests. Mobile: testing on physical devices, same CI. Microservices: Docker containers deployed on Docker or Kubernetes (generic scenario for Azure cloud microservices). Tool landscape: CI/build (Jenkins, Bamboo, CircleCI, TeamCity), artifact repository (JFrog), code inspection (SonarQube), continuous feedback (Slack, Outlook), deployment targets (hosting server, Kubernetes, Azure, AWS S3/EC2, Docker).

⚠️ Top pitfall: Mixing the tool slots in an answer — Jenkins builds, JFrog stores, SonarQube inspects; naming more than one or two CI tools adds noise, not marks.

Self-check: For a microservice-based solution, what is the deployment target and what stays the same as other application types?

Connects to: Section 11.8, Section 11.14, Section 11.15

Last Year's Paper: Keeping the Application in a Releasable State

Must-know: Releasable state means ready to ship, stronger than merely working. With branches already created, the best answer is branch by abstraction: keep master stable, merge only fully tested code, keep the feature branch abstract until ready. Alternatives: feature toggle (functional-level hiding) and small releasable pieces. A 4-mark answer takes about four lines: practice name plus concept.

⚠️ Top pitfall: Describing the concept correctly but missing the practice name — the examiner wants the proper word, and MCQ certification exams score zero if you do not click the particular practice name.

Self-check: Why is branch by abstraction the best answer when the question says branches already exist?

Connects to: Section 11.19, Section 11.20, Section 11.21

Last Year's Paper: Compiling at Every Environment

Must-know: Compiling at every environment (dev for unit test, UAT for acceptance, staging for system test) is wrong: every rebuild delays time to market, each build creates a different artifact (compiler versions, libraries, binaries cause compatibility issues), and confidence drops because the tested artifact is never the one that ships. Fix: pack the code as an artifact once, test that same artifact in every environment, promote it toward production.

⚠️ Top pitfall: Answering with CI instead of the build-once message: the core answer is build once and promote the same artifact; five supporting points with two to three lines each are enough, blubbering causes deduction.

Self-check: Why does rebuilding per environment destroy the team's confidence that the code will work in production?

Connects to: Section 11.8, Section 11.9

Last Year's Paper: Technical Debt and the Quality Gate

Must-know: Technical debt is the build-up of shortcuts and deferred quality in the code base; the practice that keeps it in check is code inspection with the quality gate: provide a threshold value (e.g., debt must not increase by more than X percent), and if a new commit increases the debt beyond that threshold, the quality gate fails it and the team must fix the debt first.

⚠️ Top pitfall: Thinking the quality gate removes existing debt — it contains debt by stopping growth; existing debt needs a separate deliberate reduction program.

Self-check: If a new code commit increases the technical debt beyond the threshold, what does the quality gate do?

Connects to: Section 11.8, Section 11.9

Last Year's Paper: Will AI and ML Aid DevOps?

Must-know: AI and ML aid DevOps — two technical points: (1) ML needs huge computational power, so cloud as a catalyst is essential — you cannot wait for ordered servers when ML work may be discarded; (2) ML needs lots of automation — actions stay with humans, but prediction and pipelines can be automated. The result is MLOps: ML follows CI/CD pipelines with different terminology and technologies, as a multi-level pipeline.

⚠️ Top pitfall: Answering with MLOps definitions instead of the two technical points — the question's format demands a position plus exactly two technical arguments.

Self-check: Why is cloud as a catalyst essential for ML workloads?

Connects to: Section 11.8

Last Year's Paper: The Top Ten DevOps Tools

Must-know: Top ten DevOps tools answer structure: three continuous integration tools (Jenkins, CircleCI, TeamCity, Bamboo) each explained as automatic build and test of every commit keeping the application working with fast feedback; plus continuous monitoring; plus continuous feedback — Slack or Teams, or GitHub integrated with Slack or email, which notifies instantly about review comments and merge request approval status instead of polling.

⚠️ Top pitfall: Listing ten CI servers without explaining them — the question says 'highlight and explain,' so each tool needs its role in the pipeline attached.

Self-check: How does automating GitHub to integrate with Slack give you instant feedback?

Connects to: Section 11.9

Last Year's Paper: Forty Engineers, Syncing Binaries and Libraries

Must-know: The 40-engineer sync problem is strictly related to binaries and libraries, not continuous integration and not code review. Manual local dependency management causes drift, especially through transitive dependencies (dependencies of dependencies). Prescription: automate the build (build tool such as Maven manages dependencies repeatably), use an artifact repository (binaries and libraries centralized and versioned), and make retrieval/resolution automated so every engineer builds against the same known set. Benefits: consistent builds, no manual syncing, full traceability.

⚠️ Top pitfall: Answering merge conflicts, CI, or code review — the professor explicitly redirected: the question is about the binaries and libraries the application depends on.

Self-check: What is a transitive dependency, and why does manual handling of it break sync?

Connects to: Section 11.8, Section 11.9

Last Year's Paper: Are DevOps and Agile the Same?

Must-know: DevOps and Agile are not the same: Agile is a process — a way of working in iterations; DevOps is a culture of collaboration between development and operations. The DevOps process might look Agile with add-ons and amendments, but the two live at different levels: DevOps names the culture and collaboration model, Agile names the process rhythm inside it.

⚠️ Top pitfall: Agreeing that they are the same, or saying DevOps replaces Agile — they coexist: an Agile process can run inside a non-DevOps organization, while DevOps is the cultural transformation that wraps the process.

Self-check: Is it possible to practice Agile perfectly and still lack DevOps?

Connects to: Section 11.17, Section 11.21

Last Year's Paper: Automation Tools vs. Bottlenecks

Must-know: Automation tools alone will not remove bottlenecks — this is a misconception: if your process contains waste and you apply automation, you automate the waste too. Sequence matters: first perform value stream mapping and remove as much waste as possible (become more lean), then automate. DevOps is a culture that must be adopted and tools must be used with the best practices.

⚠️ Top pitfall: Believing the latest tools eliminate all bottlenecks — an automated bottleneck is still a bottleneck; faster waste is not faster value.

Self-check: Why does automating a process with waste fail to improve it?

Connects to: Section 11.16, Section 11.21

Last Year's Paper: Component-Based Architecture

Must-know: Component-based architecture pattern: draw the components as boxes (login/sign-up, room reservation, add-on services), connect them according to who depends on whom, show the pipeline through which the components flow, and version artifacts with any format (e.g., v1.2.3). Upstream dependency = the component that something else depends on; downstream = the component that relies on it; changing an upstream component affects every downstream component.

⚠️ Top pitfall: Drawing data flow instead of dependency direction — arrows must represent dependency, and upstream/downstream is about dependency, not about work order.

Self-check: If you change an upstream component, what happens to downstream components?

Connects to: Section 11.8, Section 11.15

Last Year's Paper: Five Activities Version Control Can Manage

Must-know: Five project/product development activities managed by version control: configuration as code, test cases, documentation, code (source code itself), and Jenkins pipeline/deployment scripts. Trap: the question says version control system, not source code version control — any file can be version controlled.

⚠️ Top pitfall: Answering 'code' five times or naming tools instead of activities — five different activities are asked for, and source code is only one of them.

Self-check: Why does 'version control system' rather than 'source code version control' change the answer?

Connects to: Section 11.20, Section 11.8

Last Year's Paper: Many Developers, One Repository

Must-know: Multiple developers in one repository produce conflicts from concurrent working. Conflicts cannot be solved automatically — the tool shows what the conflicts are, resolution needs manual intervention. Tactics: resolve on your local system or directly on the GitHub repository (the remote server), then review the resolution. Frequent small commits and quick merges reduce conflicts; the resolution itself is always a human decision.

⚠️ Top pitfall: Believing the tool can resolve conflicts automatically — auto-merge handles what it can merge; the conflicting region is always the human's decision.

Self-check: Where are the two places you can resolve conflicts, and what is always required in both?

Connects to: Section 11.10, Section 11.19, Section 11.6

Exam Logistics, Marking, and Practical Details

Must-know: The paper is 30 marks, one set for everyone, open book, covering the best practices and the CI/CD pipeline concept; no questions on Jenkins jobs or pipelines. Web references in the material are allowed during the exam (toggle between browsers). Makeup exams are a little tougher and their papers are never shared; regulars are always shared. Answer scripts cannot be shared, but a walkthrough of the paper happens in a later session. Grading is relative and cumulative, anchored by the highest score.

⚠️ Top pitfall: Preparing for Jenkins job/pipeline questions — that material belongs to the next session and is explicitly not examinable now.

Self-check: Are the website links in the reference material allowed during the exam?

Connects to: Section 11.10, Section 11.11, Section 11.12, Section 11.13, Section 11.14, Section 11.15, Section 11.16, Section 11.17, Section 11.18, Section 11.19, Section 11.20

Exam Guidance Summary

Must-know: 30 marks, one set, open book, scope = best practices + CI/CD pipeline concept, no Jenkins job/pipeline questions. A 4-mark question takes about four lines (practice name plus concept); two to three lines per point for multi-point answers; stick to the points to avoid deductions. Web links allowed during the exam. Makeups a little tougher and never shared; regulars always shared. Answer scripts not shared, but a walkthrough happens in a session. Grading relative and cumulative from the highest score.

⚠️ Top pitfall: Writing irrelevant theory or blubbering around terminology instead of sticking to the points — marks get deducted.

Self-check: What is the scope of the mid-semester exam and what is explicitly excluded?

Connects to: Section 11.21, Section 11.10, Section 11.11, Section 11.12, Section 11.13, Section 11.14, Section 11.15, Section 11.16, Section 11.17, Section 11.18, Section 11.19, Section 11.20

Key Industry Applications

Must-know: Industry applications: GitHub as the traceable pipeline gate; CI servers (Jenkins, Bamboo, CircleCI, TeamCity); JFrog for artifact storage; SonarQube with quality gates and thresholds blocking debt-increasing commits; Slack/Teams/Outlook/GitHub feedback integrations; deployment targets (hosting servers, Kubernetes, Docker, Azure, AWS S3/EC2); containerized microservices on Docker/Kubernetes; Maven + artifact repository dependency management with transitive dependencies; MLOps multi-level pipelines; version control for configuration as code, test cases, documentation, and pipeline/deployment scripts.

⚠️ Top pitfall: Treating the tool slots as fixed pairs — the CI server, artifact store, inspection tool, and deployment target are independent choices per project.

Self-check: Which tool inspects code-level defects and enforces quality-gate thresholds?

Connects to: Section 11.9, Section 11.12, Section 11.15, Section 11.19

Was this lecture useful?

Loading comments…
🤖

BitsNotes AI Assistant

Subject Notes Assistant

Configure AI Chat

Choose how to access the chatbot
Have your own API key?

Switch to "Bring Your Own Key" tab above for unlimited access with any OpenAI-compatible provider.

🔑 Enter API key above to fetch live models from provider, or enter model name manually.
OpenAI-Compatible API Support

Choose any provider preset (Gemini, DeepSeek, Kimi, GLM, MiniMax, Qwen, OpenAI, Groq, Ollama, etc.) or enter a custom endpoint URL.

Security & Privacy First

Your API key is sent directly from your browser to your specified provider. BitsNotes servers never store or see your key.