Mert Özen Further With Every Line

Blog

Mert Özen's blog posts on software development, backend, frontend, and DevOps.

Series
105 posts found
Testing in the Pipeline: Fast Feedback, Quality Gates and Flaky Tests
DevOps PART 04

Testing in the Pipeline: Fast Feedback, Quality Gates and Flaky Tests

Ordering tests in the pipeline from cheap to expensive (formatting, unit, integration with Testcontainers, e2e with Playwright) and adding quality gates such as warnings, coverage and bundle budgets gives fast, trustworthy feedback; a flaky test needs its root cause fixed rather than a retry. How a test without assertions inflates coverage, a real flaky test failing 2 of 30 runs, and an empty Playwright shard.

8 Nov 2026 11 min 4
Build Once, Deploy Many: Artifacts, Versioning and Immutable Packages
DevOps PART 03

Build Once, Deploy Many: Artifacts, Versioning and Immutable Packages

Building an artifact once and carrying that same artifact, by tag or digest, from staging to production guarantees that what was tested on staging is what reaches production; even building the same commit twice yields different images. Reproducible builds with lock files and npm ci, stamping versions with the commit SHA, the :latest trap, and a runtime config.json for Angular.

8 Nov 2026 10 min 4
Pipeline Anatomy: Triggers, Stages, Jobs, Steps and Failing Fast
DevOps PART 02

Pipeline Anatomy: Triggers, Stages, Jobs, Steps and Failing Fast

A pipeline starts with triggers and is made of dependent jobs (stages in Jenkins) and steps that run in order; putting the build logic in a script that runs locally, letting the pipeline only orchestrate, moving cheap checks first and failing fast across parallel branches all speed up feedback. A GitHub Actions, Jenkins and Azure DevOps term mapping, with real output from act and Jenkins.

8 Nov 2026 10 min 4
CI, Continuous Delivery and Continuous Deployment: The Differences and Why They Matter
DevOps PART 01

CI, Continuous Delivery and Continuous Deployment: The Differences and Why They Matter

CI means everyone integrates into the mainline every day and every push runs an automated build and tests; continuous delivery keeps every commit releasable and leaves going to production as a decision, while continuous deployment removes that button too. An integration hell scenario, Fowler's 2024 practices, a CI workflow run with act, and the MinimumCD checklist.

8 Nov 2026 8 min 5
Preparing for Git 3.0: What Changes, What Goes, What to Do Today
DevOps PART 29

Preparing for Git 3.0: What Changes, What Goes, What to Do Today

We separate the official status of Git 3.0 (BreakingChanges.adoc: no date yet) from the plan reported by GitLab and LWN. We try the main, SHA-256 and reftable defaults, safe.bareRepository, mandatory Rust, the commands being removed and why git checkout stays on Git 2.54, and end with a preparation checklist.

6 Nov 2026 8 min 18
Git 2.50–2.56: git history, Config-Based Hooks and git add --resolved
DevOps PART 28

Git 2.50–2.56: git history, Config-Based Hooks and git add --resolved

We go from Git 2.50 to the current 2.56: git history reword and split (fixup in 2.55, drop in 2.56), config-based and parallel hooks, stash export/import, pull.autostash and what happens on a conflict, git last-modified, git repo info, reflog drop, branch --delete-merged, add --resolved and the -h exit code change.

6 Nov 2026 9 min 15
Git 2.40–2.49: reftable, SHA-256, git replay and the New git config
DevOps PART 27

Git 2.40–2.49: reftable, SHA-256, git replay and the New git config

We look at the 2.40–2.49 period, when the foundations of Git 3.0 were laid, with real output: the reftable ref store and git refs migrate, where SHA-256 repos stand today, git config's get/set/unset/list subcommands, worktree add --orphan, git replay, safe.directory prefixes, git backfill and Rust's first step.

6 Nov 2026 9 min 16
Git 2.23–2.39: From checkout to switch and restore, Old Habits to New Ones
DevOps PART 26

Git 2.23–2.39: From checkout to switch and restore, Old Habits to New Ones

We put old and new side by side for what arrived between Git 2.23 and 2.39: the move from checkout to switch and restore, init.defaultBranch, pull's divergent branches error, sparse-checkout, maintenance, fsmonitor, ort and remerge-diff, rebase --update-refs, force-if-includes, safe.directory and SSH signing.

6 Nov 2026 11 min 13
Git Hooks and Commit Signing: From pre-commit to SSH Signatures
DevOps PART 25

Git Hooks and Commit Signing: From pre-commit to SSH Signatures

We write pre-commit and commit-msg hooks with real output, share them with the team through core.hooksPath, and try Git 2.54's config-based hooks and git hook list. Then we sign commits with an SSH key, verify them with an allowed signers file and look at what GitHub's Verified badge requires.

6 Nov 2026 11 min 19
Git bisect and git worktree: Finding the Bad Commit and Two Branches at Once
DevOps PART 24

Git bisect and git worktree: Finding the Bad Commit and Two Branches at Once

We find the commit that introduced a bug with git bisect's binary search: marking good and bad, bisect log and reset, automatic search by exit code with git bisect run, and exit 125. Then we use git worktree to make a hotfix in a separate folder without disturbing unfinished work, and look at worktree list/remove/prune and when it beats stash.

6 Nov 2026 9 min 12
Git Tags and Releases: Marking Versions, git describe and GitHub Releases
DevOps PART 23

Git Tags and Releases: Marking Versions, git describe and GitHub Releases

We mark releases with git tag: lightweight versus annotated tags, the tag object, semver, why push doesn't send tags, --tags versus --follow-tags, reading git describe output, GitHub Releases, deleting tags and why moving a published tag is dangerous.

6 Nov 2026 8 min 17
Git reflog: Bringing Back Lost Commits and Deleted Branches
DevOps PART 22

Git reflog: Bringing Back Lost Commits and Deleted Branches

We bring commits back with git reflog after an accidental reset --hard: HEAD@{n} versus HEAD~n, undoing the last merge with ORIG_HEAD, finding a deleted branch in the reflog, backing out of a rebase with the branch's own reflog, and why the reflog is local and expires.

6 Nov 2026 8 min 16
Blog Map