# Marcus Felling > A technical blog covering DevOps, AI, CI/CD, cloud engineering, and automation. Practical guides from real-world experience with Azure DevOps, GitHub Actions, Playwright, Terraform, Bicep, and more. ## About - Site: https://marcusfelling.com - RSS Feed: https://marcusfelling.com/feed.xml - Archives: https://marcusfelling.com/archives ## Posts - [Add an llms.txt File to Your Website](https://marcusfelling.com/blog/2026/your-website-should-have-an-llms-txt-file): When an AI tool tries to pull information from your site, it’s scraping HTML. Nav bars, footers, cookie banners, all of it, just to find... - [Building an AI Agent Squad for Your Repo](https://marcusfelling.com/blog/2026/building-an-ai-agent-squad-for-your-repo): What if your repo had a whole team of AI agents: a lead, a frontend dev, a tester, a content writer, each with their own... - [Shipping an AI Agent MVP: What Actually Worked](https://marcusfelling.com/blog/2026/three-day-hackathon-shipping-ai-agent-mvps): I recently led a 3 day hackathon to build an AI solution that streamlines our monthly business reviews for our Microsoft direct sales ecommerce store... - [⏩ Optimizing GitHub Actions Workflows for Speed and Efficiency](https://marcusfelling.com/blog/2025/optimizing-github-actions-workflows-for-speed): Slow CI/CD pipelines directly impact developer productivity and deployment frequency. When pull request checks take 15+ minutes to complete, developers context-switch to other tasks, breaking... - [Control Your Windows VPN Connections from VS Code](https://marcusfelling.com/blog/2025/vpn-toggle-vscode-extension): Ever get annoyed having to click through Windows settings just to toggle your VPN connection? Yeah, me too. That’s why I built a VS Code... - [Removing Sensitive Data from Git History with BFG and VS Code](https://marcusfelling.com/blog/2024/removing-sensitive-data-from-git-history-with-bfg-and-vs-code/): TL; DR: I created a VS Code extension that makes it easier to remove credentials from Git History. - [Using Azure Test Plans with Playwright](https://marcusfelling.com/blog/2023/using-azure-test-plans-with-playwright/): In 2020, I blogged about associating automated tests with Azure Test Cases. The post had 18 questions, which indicates there is still confusion on how... - [Measuring Website Performance with Playwright Test and Navigation Timing API](https://marcusfelling.com/blog/2023/measuring-website-performance-with-playwright-test-and-navigation-timing-api/): I was recently tasked with measuring the impact of a Redis cache on an e-commerce site. This was pretty simple with Azure Load Testing, by... - [6 Nifty GitHub Actions Features 🚀](https://marcusfelling.com/blog/2023/6-nifty-github-actions-features/): I’ve been having a lot of fun with GitHub Actions lately and wanted to document some of the features I regularly use, including some tips... - [Handling Azure AD/Entra ID Authentication with Playwright](https://marcusfelling.com/blog/2023/handling-azure-ad-authentication-with-playwright/): One of the most frequently asked questions I get is how to test web apps that use Azure AD/Entra ID. Rather than repeating myself, I... - [25 reasons to choose Playwright as your next web testing framework](https://marcusfelling.com/blog/2022/25-reasons-to-choose-playwright-as-your-next-web-testing-framework/): I wanted a place to capture a list of highlights that make Playwright awesome. Here it is, in no particular order: - [Create resilient 🎭 Playwright e2e tests with locators](https://marcusfelling.com/blog/2022/create-more-reliable-playwright-tests-with-locators/): Modern web apps introduce some testing challenges — dynamic controls can cause flakiness and unexpected behaviors. This is where the magic of the Playwright locator... - [Publishing 🎭 Playwright test results to GitHub Pages](https://marcusfelling.com/blog/2021/publishing-playwright-test-results-to-github-pages/): Now that Playwright has a fancy new HTML reporter, I wanted to host test results to show the latest state of my GitHub Action test... - [💪 Azure Bicep CI/CD 🚀](https://marcusfelling.com/blog/2021/azure-bicep-ci-cd/): Hey, you. You’re not manually deploying your Azure Bicep Infrastructure as Code, are you?!? Let’s prevent that next production outage, help your team collaborate on... - [Using Terraforms Azure provider (azurerm) with GitHub Actions and Terraform Cloud](https://marcusfelling.com/blog/2021/using-terraforms-azure-provider-azurerm-with-github-actions-and-terraform-cloud/): I wanted to document this after spending a frustrating amount of time troubleshooting getting this setup. I was getting this error when running Terraform Plan:... - [Reasons to use Bicep over Terraform](https://marcusfelling.com/blog/2021/reasons-to-use-bicep-over-terraform/): Why would you choose Microsoft’s new Bicep DSL over HashiCorp’s Terraform? I would like to give you my perspective, as someone who ditched ARM templates... - [Azure Pipelines: YAML Templates VS. Custom Tasks](https://marcusfelling.com/blog/2020/azure-pipelines-yaml-templates-vs-custom-tasks/): There are two main ways to create re-usable components for Azure Pipelines. I’ll review the pros and cons of each and talk about when it... - [The importance of the Definition of Done](https://marcusfelling.com/blog/2020/the-importance-of-definition-of-done/): I’ve worked with quite a few teams who aren’t aware of, or forget about, the Definition of “Done”. In my opinion, this is one of... - [Porting an Azure Pipeline (YAML) to a GitHub Action](https://marcusfelling.com/blog/2020/porting-an-azure-pipeline-yaml-to-a-github-action/): I’ve been a long time user of Azure Pipelines. It’s a very mature and powerful platform, that integrates really well with other parts of the... - [How to reduce the size of your TFS/Azure DevOps Server collection databases](https://marcusfelling.com/blog/2020/how-to-reduce-the-size-of-your-tfs-azure-devops-server-collection-databases/): The size of your TFS/Azure DevOps Server collection databases will grow over time, and it’s not a trivial task figuring out how to cleanup. This... - [Tips for governing Azure subscriptions](https://marcusfelling.com/blog/2020/tips-for-governing-azure-subscriptions/): I’ve seen it too many times. It all starts when somebody is given access to a new “production” Azure subscription that’s pay-as-you-go. A new resource... - [Azure Pipelines: Classic Editor VS. YAML](https://marcusfelling.com/blog/2020/azure-pipelines-classic-editor-vs-yaml/): In this post, the two configuration options in Azure Pipelines will go head to head in an epic battle… - [Associating automated tests with Azure Test Cases](https://marcusfelling.com/blog/2020/associating-automated-tests-with-azure-test-cases/): I often get asked, “why can’t I update any of the fields on the Associated Automation tab of a Test Case?” - [Azure DevOps Pipeline Decorators](https://marcusfelling.com/blog/2019/azure-devops-pipeline-decorators/): Governance around CI/CD pipelines can be challenging. As the number of your applications and pipelines grow, it’s tough to make sure everybody is playing by... - [Azure DevOps Pipelines: Variables, $Variables, __Variables__, $env:Variables, $(Variables), %VARIABLES%](https://marcusfelling.com/blog/2019/azure-devops-pipeline-variables/): If you’re working with Azure DevOps Pipelines, you should be aware of all your options when it comes to using variables. They make it possible... - [Start-IISCommitDelay / Stop-IISCommitDelay](https://marcusfelling.com/blog/2019/start-iiscommitdelay-stop-iiscommitdelay/): Today I discovered the Start-IISCommitDelay and Stop-IISCommitDelay cmdlets available in the IISAdministration module. In the past I’ve randomly encountered errors when issuing back to back... - [Trigger an Azure Function (PowerShell) from an Azure DevOps Pipeline](https://marcusfelling.com/blog/2019/trigger-an-azure-function-powershell-from-an-azure-devops-pipeline/): When I recently heard the announcement for Public Preview of PowerShell in Azure Functions 2.x, I was excited to give it a test drive. One... - [Bulk update Azure Release Pipelines tasks](https://marcusfelling.com/blog/2019/bulk-update-azure-release-pipelines-tasks/): If you’re attempting to update a sprawling amount of release definitions, clicking through each definition using the visual designer can be a real chore. That’s... - [Setting up SonarQube (on Windows) with Azure Pipelines](https://marcusfelling.com/blog/2019/setting-up-sonarqube-on-windows-with-azure-pipelines/): I recently setup a new SonarQube instance to perform static code analysis as part of CI builds. In this post I’d like to document what... - [Azure Release Pipelines: What releases havent been deployed to Production yet?](https://marcusfelling.com/blog/2019/azure-release-pipelines-what-releases-havent-been-deployed-to-production-yet/): The filtering options on the release pipeline dashboard leave a lot to be desired. As the number of definitions and releases grow, it gets harder... - [Deploying IIS hosted ASP.NET Core apps using app_offline.htm](https://marcusfelling.com/blog/2018/deploying-iis-hosted-asp-net-core-apps-using-app_offline-htm/): In the past, I’ve used the method of placing a app_offline.htm file at the root of an IIS website to throw up a maintenance page.... - [TFS Release Management: Create Release via REST API](https://marcusfelling.com/blog/2018/tfs-release-management-create-release-via-rest-api/): I recently had to come up with a solution to perform a bulk deploy of all apps to an environment using the latest build artifacts.... - [Setting up a CI pipeline to run functional tests in TFS 2018 and Azure Pipelines (Formerly VSTS)](https://marcusfelling.com/blog/2018/setting-up-a-ci-pipeline-to-run-functional-tests-in-tfs-2018-and-visual-studio-team-services-vsts/): The new TFS/Azure Pipelines build and release tasks to run functional tests make setting up a CI pipeline pretty dang easy. The VSTest task can... - [Versioning .Net assemblies using TFS/VSTS Build.BuildID](https://marcusfelling.com/blog/2018/versioning-net-assemblies-using-tfs-vsts-build-buildid/): The semantic versioning used in all of our TFS/VSTS CI builds uses the predefined variable Build.BuildID for the buildnumber portion of major.minor.revision.buildnumber. The build id... - [Chef recipe to install VSTS agents (Windows)](https://marcusfelling.com/blog/2017/chef-recipe-install-vsts-agents-windows/): I recently set out to automate the creation of our Windows build servers that run VSTS agents. Previously the build servers were thought of as... - [Rolling deployments to AWS using Octopus Deploy and Auto Scaling Groups](https://marcusfelling.com/blog/2017/rolling-deployments-aws-using-octopus-deploy-auto-scaling-groups/): In order to gracefully deploy releases to our application servers, I wanted to utilize rolling deployments in Octopus Deploy. If you aren’t familiar, rolling deployments... - [Azure Pipelines YAML Builds (Pipeline as code)](https://marcusfelling.com/blog/2017/vsts-yaml-builds/): Last week Microsoft announced “Pipeline as code (YAML)” giving us the ability to store our builds in source control. This allows us to take advantage... - [Setting up a build/deploy pipeline for MySQL seed scripts using VSTS and Octopus Deploy](https://marcusfelling.com/blog/2017/setting-up-a-build-deploy-pipeline-for-mysql-seed-scripts-using-vsts-and-octopus-deploy/): My team wanted the ability to populate test data into new data warehouse instances (MySQL on Linux) that are created via Infrastructure as Code (CloudFormation... - [Code Sharing (PowerShell): Create Pull Request via VSTS REST API](https://marcusfelling.com/blog/2017/create-vsts-pull-request-via-vsts-rest-api/): This past week I started concentrating on optimizing our release processes. I’ve talked about how our team uses VSTS and Git in a previous post.... - [Feature Flag journey with LaunchDarkly Part 2](https://marcusfelling.com/blog/2017/feature-flag-journey-launchdarkly-part-2/): I previously posted about how I discovered LaunchDarkly and wanted to introduce it at my current employer. See Part 1 here. Our pilot with LaunchDarkly... - [TFS/VSTS Build System Capabilities and Demands](https://marcusfelling.com/blog/2017/tfsvsts-build-system-capabilities-demands/): System Capabilities - [Feature Flag journey with LaunchDarkly Part 1](https://marcusfelling.com/blog/2017/feature-flag-journey-launchdarkly/): At DevOpsDays Minneapolis I was the facilitator for an Open Space discussion (largest group of the day!!) on my proposed topic of “Release Management and... - [Configuration Management for Serverless Microservice Projects](https://marcusfelling.com/blog/2017/configuration-management-serverless-microservice-projects/): Weather you’re using AWS Lambda, Azure Functions, or Google Cloud’s Firebase, you’ll want to re-think how you approach configuration management for serverless projects. The number... - [Getting started with MSBuild](https://marcusfelling.com/blog/2017/getting-started-msbuild/): - [Code Sharing (PowerShell): Update Octopus variable via Octopus API](https://marcusfelling.com/blog/2017/update-octopus-variable-via-octopus-api/): The trace-ability features when linking between Octopus and TFS/VSTS work pretty well out of the box, especially when using the Octopus Deploy build extension. When... - [Visual Studio Marketplace Metrics](https://marcusfelling.com/blog/2017/visual-studio-marketplace-metrics/): Earlier this year I decided to create some Visual Studio Marketplace build extensions. I was re-using the same tasks in multiple build definitions and there... - [Custom Build Conditions in VSTS](https://marcusfelling.com/blog/2017/custom-build-conditions-vsts/): On March 29th, 2017 the VSTS team released a new feature that added the ability to specify conditions for running a build task. This provides... - [Migrating Team Foundation Server to Visual Studio Team Services](https://marcusfelling.com/blog/2017/migrating-team-foundation-server-visual-studio-team-services/): Last month I migrated our TFS collection to VSTS using Microsoft’s Database Import Service and migration guide. To be frank, it was a long process... - [A simple explanation of private pipeline billing in VSTS](https://marcusfelling.com/blog/2017/simple-explanation-private-pipeline-billing-vsts/): Update: Unlimited private pipelines are now free for Build!! - [Octopus Deploy: Running deployment steps in parallel](https://marcusfelling.com/blog/2017/octopus-deploy-running-deployment-steps-parallel/): When I first got started with Octopus Deploy I would setup projects to have one long deploy process that ran steps in serial. Each step... - [Gitflow and Visual Studio Team Services](https://marcusfelling.com/blog/2017/gitflow-visual-studio-team-services/): This last year our team made the decision to move from Team Foundation Version Control (TFVC) to Git. - [VSTS Marketplace Extension: Queue Build(s) Task](https://marcusfelling.com/blog/2017/vsts-marketplace-extension-queue-builds-task/): Currently the TFS/VSTS build system has a pretty big bottleneck: tasks run in serial. For build steps that run PowerShell, I’ve implemented runspaces to run... - [Using Task Groups in TFS/VSTS](https://marcusfelling.com/blog/2017/using-task-groups-tfsvsts/): When Microsoft announced Task Groups in TFS and VSTS, I couldn’t think of a practical use for them. When creating build definitions I always try...