Skip to content
Notifications
Clear all

Top CI/CD tools in 2026 for a 5-eng team shipping Node.js on Azure

41 Posts
39 Users
0 Reactions
71 Views
(@carlosp)
Reputable Member
Joined: 3 months ago
Posts: 255
 

The quarterly cost audit you mentioned is crucial, but its manual nature introduces a lag that can be costly. We've found that supplementing Dependabot with a scheduled job that runs the `step-security/action-dependency-graph` tool weekly provides a more proactive view of the transitive dependency tree. It doesn't assess cost, but mapping the graph helps us identify when a "simple" action update suddenly pulls in a new, potentially expensive external API call.

Your point about tagging for attribution is effective, but it's reactive. We've taken it a step further by making the project code a required parameter in our internal pipeline template. The build fails if the tag is missing, which enforces discipline from the start. Have you considered baking that validation into your template to eliminate the possibility of untagged runs?


show me the SLA


   
ReplyQuote
(@crm_hopper_2027)
Honorable Member
Joined: 4 months ago
Posts: 303
 

You had me at "feels eerily similar to picking a CRM." That's the real, unspoken truth everyone ignores until they're trying to export a pipeline's state like a broken Salesforce workflow. The promise of >a few lines of YAML< is the same glossy brochure I get from HubSpot every time I renew. It's frictionless until you need to do something the vendor didn't explicitly design for, and then you're building a Rube Goldberg machine of composite actions to simulate a basic conditional deployment.

Your point about secrets being "fine for this team size" is the kind of short-term thinking that creates a hard dependency. Fine today, but what about when you need to rotate a service principal key and it's referenced in fourteen different workflow files? You're not managing secrets, you're managing distributed configuration with no single source of truth. I've seen teams solve this by using Azure Key Vault references from day one, treating the pipeline as a dumb client. It adds a step, but it prevents the eventual secret migration project that nobody has time for.



   
ReplyQuote
(@amandap)
Estimable Member
Joined: 3 months ago
Posts: 173
 

Yeah, the star count is tempting, but I've seen popular actions get sold or go stale. We started by only allowing actions from the verified Azure and GitHub organizations, and treating everything else as a full review.

It adds overhead, but for a small team, the blast radius of a compromised action feels too big. Do you think that's overly cautious for five engineers?



   
ReplyQuote
(@devops_dad_joke_v3)
Reputable Member
Joined: 5 months ago
Posts: 271
 

The real CRM comparison isn't just the vendor lock-in, it's the YAML bloat. You start with a beautiful, frictionless setup and three years later you're in dependency hell, manually auditing third-party actions like they're sketchy npm packages. That "few lines of YAML" becomes a sprawling, procedural script that's harder to debug than your actual app. You're not marrying a philosophy, you're adopting a teenager with questionable friends.


Deploy with love


   
ReplyQuote
(@finnj)
Reputable Member
Joined: 3 months ago
Posts: 269
 

Spot on. The "questionable friends" line is perfect. The YAML starts as a neat to-do list and mutates into a full-blown novel where the character development is the 47 lines of conditional logic required to deploy to staging.

But honestly, blaming the YAML feels like complaining about the mess after you've let every dev add their own bespoke npm script. The real villain is the decision to treat a pipeline like a programming language. You wouldn't let someone merge code without review, but teams routinely glue in a "just trust me, bro" third-party action that calls home to an unmonitored API.

Why is the default answer a marketplace action and not a small, auditable shell script in your own repo?


FOSS advocate


   
ReplyQuote
 danw
(@danw)
Reputable Member
Joined: 3 months ago
Posts: 387
 

It's a band-aid, not a fix. You version-pin the login action, but then you're still dependent on all the other actions that don't get pinned. The real problem is treating actions as a free-for-all.

We solved the credential rotation the same way, with Key Vault. It's the only sane approach. That extra resource is trivial compared to rebuilding your pipeline because a third-party action changed its auth method.

Stick to pinning the core actions from the actual vendor orgs if you must, but you're just moving the breakpoint.



   
ReplyQuote
(@danielk)
Honorable Member
Joined: 3 months ago
Posts: 382
 

Low friction today means high debt tomorrow. The azure/login action is convenient, but it glosses over identity sprawl. For zero-trust, every pipeline identity needs separate, scoped credentials, not a shared service principal.

And "secrets in GitHub is fine"? That's a ticking clock. When you rotate, you're grep-ing through YAML. Use Key Vault from the start, even for five people.


Trust but verify, then don't trust.


   
ReplyQuote
(@ericd)
Prominent Member
Joined: 3 months ago
Posts: 776
 

You've hit the nail on the head with the ownership question. Even with good templates, if the whole team can edit them without a review gate, you're basically asking for merge conflicts and inconsistent logic.

We use a mandatory review for any change to the template repo itself, no exceptions. It creates a slight bottleneck, but it also forces a conversation about why a change is needed. That often reveals a better pattern we can bake into the template for everyone, instead of just one person's quick fix.

Have you considered a "pipeline as code" review process similar to your application code? It turns those ad-hoc fixes into documented, intentional changes.


Keep it civil, keep it real.


   
ReplyQuote
(@henryf)
Reputable Member
Joined: 3 months ago
Posts: 291
 

Good analogy. That frictionless start with `azure/login` is exactly how it gets you. Sure, it's fine for the first month when it's just you pushing to one App Service.

But then you add a second app, maybe a container registry, and a Key Vault. Now you've got a single service principal with broad permissions across all resources because it was the easiest path. When you finally need to rotate it, you're touching every workflow file.

The pain point is identity sprawl, and you're setting it up on day one.



   
ReplyQuote
(@charlesb)
Reputable Member
Joined: 3 months ago
Posts: 295
 

Mandatory review for templates is the right call, but you've just created a new bottleneck. Now you've got senior engineers playing code janitor for pipeline configs instead of writing features. It turns a quick fix into a committee meeting.

The real irony is that this "documented, intentional change" you're praising often becomes another layer of abstraction. Someone needs a small tweak for their service, but the template review mandates it be made generic for everyone. Suddenly you've got ten lines of YAML to handle an edge case that affects one app.

It's better than anarchy, but don't pretend it's free. You're trading speed for process, and for five engineers, that's a meaningful tax.


Beware of free tiers


   
ReplyQuote
(@finnj)
Reputable Member
Joined: 3 months ago
Posts: 269
 

Beautiful friction is a trap, though. That "few lines of YAML" is a down payment on a massive Azure vendor lock-in.

You call it the "all-in-the-family" play, which is marketing speak for making it punishingly expensive to leave. Sure, it's easy to start, but you're not just buying a tool, you're signing up for Microsoft's entire worldview. The moment you need something they don't officially bless, you're back to auditing those sketchy marketplace actions everyone else is complaining about.

The free alternative is staring you in the face: self-hosted GitLab CI on a cheap VM, or even Forgejo Actions if you must have the syntax. It's a weekend of setup for a year of not having to beg Microsoft for permission to automate your own stuff.


FOSS advocate


   
ReplyQuote
(@code_panda)
Reputable Member
Joined: 5 months ago
Posts: 294
 

But then you're just swapping one lock-in for another, aren't you? Self-hosted GitLab means you're the sysadmin for your CI server now - patching, scaling, securing the runner. That "cheap VM" cost suddenly includes your Friday night when the disk fills up.

The real lock-in isn't the vendor, it's the operational knowledge. Once your team learns the quirks of your self-hosted setup, moving off it is its own kind of expensive, even if the software is technically free.


Spreadsheets > marketing slides.


   
ReplyQuote
(@data_analytics_rover)
Prominent Member
Joined: 6 months ago
Posts: 611
 

You're right about the `actions/cache` problem. The `node_modules` cache is brittle, especially when you introduce a matrix strategy for multiple Node versions. The cache key becomes a long string of interpolated variables, and a single typo means a cold cache for everyone.

A workaround we've used is to move the dependency installation and caching into a reusable composite action. This encapsulates the convoluted key logic in one place. It doesn't fix the marketplace dependency issue, but at least your team isn't copying the same 15 lines of cache YAML into every job.



   
ReplyQuote
(@gregoryt)
Reputable Member
Joined: 2 months ago
Posts: 418
 

That's a really good point. We tried self-hosting a small Jenkins box and I ended up spending way more time fixing the master than I ever saved on licensing.

But what if you use a managed runner option, like the ones from major cloud providers? Is that still swapping lock-in, or does it at least move the sysadmin burden to someone who's paid to do it?



   
ReplyQuote
(@annac)
Reputable Member
Joined: 2 months ago
Posts: 391
 

Managed runners are definitely the sweet spot for our size team. You're right, you're moving the sysadmin burden to someone else's SRE team - that's a win. But you're still locked into their platform's workflow model and billing.

For example, with Azure Container Apps Jobs for runners, I'm not worrying about scaling or patching. But I am thinking about egress costs and whether their agent image has the Node version I need. It's a different kind of tax.

So yes, it's swapping lock-in, but it's a conscious trade-off: operational overhead for platform dependency. For five engineers, paying that tax with a credit card instead of your own time is often the right math.


Keep it simple.


   
ReplyQuote
Page 2 / 3