I've traditionally developed PowerShell scripts directly on the production server and tested changes there before committing them locally and pushing them to Azure DevOps. I want to move development to my workstation, especially since we're introducing Claude CLI, and stop testing changes live in production.
Would having my local machine push changes to the repository and then running git pull on the production server be an acceptable deployment process? Or would a CI/CD pipeline, package repository, Azure Automation, or another approach provide better testing, versioning, approvals, and rollback?
4 Answers
A simple push followed by git pull can work for a small setup, but it makes production responsible for selecting and fetching code. A safer pattern is local branch or pull request, automated PSScriptAnalyzer checks and tests, then a pipeline that publishes a versioned artifact. After an approval step, the pipeline deploys that exact artifact to production. This gives you a clear record of what commit is running and makes rollback as simple as redeploying the previous version. Keep Claude CLI on the development side and never give generated code direct production credentials.
Azure Automation is another good fit if these scripts are runbooks rather than applications. Store the scripts in Azure DevOps, connect the repository to an Automation Account, and let it synchronize approved changes. Hybrid workers can execute the runbooks on servers that need access to on-premises systems or private network resources. The repository remains the source of truth, while Azure Automation handles scheduling, orchestration, and execution.
Whichever deployment mechanism you choose, move testing off production first. Use a local or test environment, run syntax checks, PSScriptAnalyzer, and automated tests, and restrict the deployment identity to only the systems and actions it needs. A pipeline with environment approvals is generally safer than allowing production servers to pull directly from the main branch.
For reusable scripts, consider packaging them as a PowerShell module and publishing versioned builds to a private PowerShell repository. Development branches can produce development versions, while merges to the main branch create tagged release versions. Production machines install a specific required version instead of pulling whatever happens to be latest, which makes testing and rollback much more predictable.

Related Questions
Can't Load PhpMyadmin On After Server Update
Redirect www to non-www in Apache Conf
How To Check If Your SSL Cert Is SHA 1
Windows TrackPad Gestures