CLI wrapper to trigger and tail Azure DevOps pipelines
Project description
_ _ _ _ _
_ __ (_)_ __ ___| (_)_ __ ___ ___| |_| |
| '_ \| | '_ \ / _ \ | | '_ \ / _ \/ __| __| |
| |_) | | |_) | __/ | | | | | __/ (__| |_| |
| .__/|_| .__/ \___|_|_|_| |_|\___|\___|\__|_|
|_| |_| trigger · tail · ship
A minimal CLI to trigger and tail Azure DevOps pipelines directly from your terminal — no browser, no copy-paste.
Why?
The typical workflow:
- Push code
- Open browser → select org → select project → select pipeline → select branch → click Run
- Wait for logs to appear
- Copy error → paste into Claude Code
- Fix → repeat
With pipelinectl:
pipelinectl push-run build-and-test
# ^ pushes, triggers, tails logs, exits non-zero on failure
Claude Code sees the error output directly if the pipeline fails.
Installation
# Homebrew (macOS, recommended)
brew tap Borrelworst/pipelinectl
brew install Borrelworst/pipelinectl/pipelinectl
# PyPI
pip install pipelinectl
For local development:
pip install --editable ".[dev]"
Commands
pipelinectl init
Interactive setup wizard. Run once after installing.
pipelinectl init
Prompts for organization, project, default branch, and authentication method (see Authentication below). Config is saved to ~/.pipelinectl/config.toml with chmod 600.
pipelinectl list
List all pipelines in your project.
pipelinectl list
pipelinectl list --filter deploy
pipelinectl run PIPELINE
Trigger a pipeline and wait for it to finish.
pipelinectl run build-and-test # uses current git branch
pipelinectl run build-and-test --branch main # explicit branch
pipelinectl run 42 # by numeric pipeline ID
pipelinectl run deploy -v ENV=staging -v REGION=westeurope # queue-time variables
pipelinectl run install -P dev=true -P version=1.2 # YAML template parameters
pipelinectl run build-and-test --logs # stream live log output
pipelinectl run build-and-test --no-follow # trigger only, don't wait
pipelinectl run build-and-test --push # git push first, then trigger
Branch resolution order: --branch flag → current git branch → config default_branch.
PIPELINE is matched by case-insensitive substring against pipeline names, or exact numeric ID. If multiple pipelines match, the command errors and lists them.
Exit code is 0 on success, 1 on failure.
Approval gates — when the pipeline reaches an approval gate, pipelinectl pauses and prompts you to approve or reject inline:
⏸ Approval required
Approve? [y/N]:
Permission gates — when a pipeline needs access to a protected resource for the first time, pipelinectl detects it and prints the ADO URL to grant access:
⏸ Permission required stage: Deploy
Grant access in Azure DevOps: https://dev.azure.com/...
pipelinectl push-run PIPELINE
Shortcut for run --push. Pushes the current branch then triggers the pipeline.
pipelinectl push-run build-and-test
pipelinectl push-run build-and-test --logs
pipelinectl status PIPELINE
Show recent run history.
pipelinectl status build-and-test
pipelinectl status deploy --top 10
pipelinectl logs PIPELINE
Fetch logs from a previous run without re-triggering.
pipelinectl logs build-and-test # most recent run
pipelinectl logs build-and-test --run-id 98765 # specific run ID
pipelinectl logs build-and-test --last 2 # 2nd most recent
pipelinectl logs --run-id 98765 # by build ID only, no pipeline needed
pipelinectl logs build-and-test --watch # tail live logs until completion
pipelinectl params PIPELINE
Show queue-time variables and template parameters for a pipeline.
pipelinectl params build-and-test
pipelinectl params 42
pipelinectl config
View and update configuration without editing the file directly.
pipelinectl config show # show current config
pipelinectl config set auth pat <PAT> # switch to PAT authentication
pipelinectl config set auth azcli # switch to Azure CLI authentication
Authentication
pipelinectl supports two authentication methods.
Personal Access Token (PAT)
Create a PAT in Azure DevOps with Build: Read & execute and Pipeline Resources: Use permissions, then configure it:
pipelinectl init # enter PAT during setup
# or
pipelinectl config set auth pat <your-token>
# or
export ADO_PAT=<your-token> # env var takes precedence over config
Azure CLI
If you're already signed in with the Azure CLI (az login), you can use it instead of a PAT — no token management required:
az login # sign in once
pipelinectl config set auth azcli # switch pipelinectl to use az cli
pipelinectl will call az account get-access-token automatically on each command. This is the recommended method in environments where you're already using the Azure CLI.
Config file
~/.pipelinectl/config.toml:
[azure_devops]
organization = "mycompany"
project = "MyProject"
default_branch = "main" # fallback when not in a git repo
# PAT auth (default):
pat = "xxxx" # or use ADO_PAT env var
# Azure CLI auth (alternative to PAT):
# auth = "azcli"
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pipelinectl-0.5.0.tar.gz.
File metadata
- Download URL: pipelinectl-0.5.0.tar.gz
- Upload date:
- Size: 17.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e79968836c47d01fb8ff370601460e375f8fef286a55d92fc9b6f305f190304f
|
|
| MD5 |
910477f775e721475d3f92293396c155
|
|
| BLAKE2b-256 |
7dbb9b3062cb22f5b999a2695cb66e53e03e1c076c94a16abf15f0936d738795
|
Provenance
The following attestation bundles were made for pipelinectl-0.5.0.tar.gz:
Publisher:
publish.yaml on Borrelworst/pipelinectl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pipelinectl-0.5.0.tar.gz -
Subject digest:
e79968836c47d01fb8ff370601460e375f8fef286a55d92fc9b6f305f190304f - Sigstore transparency entry: 1357174013
- Sigstore integration time:
-
Permalink:
Borrelworst/pipelinectl@46d6d1ee5d02a066e8e4a3121c5bd41237a7b7c8 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Borrelworst
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@46d6d1ee5d02a066e8e4a3121c5bd41237a7b7c8 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pipelinectl-0.5.0-py3-none-any.whl.
File metadata
- Download URL: pipelinectl-0.5.0-py3-none-any.whl
- Upload date:
- Size: 15.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec78e840fa29d13b10561618babcc14ccc6045a416105dfb5342faa61058f008
|
|
| MD5 |
43a46160a77d202c59c0f6f7cd3d73ad
|
|
| BLAKE2b-256 |
4809de0ada6e5cb197495e96395d602f27eb5eb9fb12d1287b56fa7e4212d21f
|
Provenance
The following attestation bundles were made for pipelinectl-0.5.0-py3-none-any.whl:
Publisher:
publish.yaml on Borrelworst/pipelinectl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pipelinectl-0.5.0-py3-none-any.whl -
Subject digest:
ec78e840fa29d13b10561618babcc14ccc6045a416105dfb5342faa61058f008 - Sigstore transparency entry: 1357174022
- Sigstore integration time:
-
Permalink:
Borrelworst/pipelinectl@46d6d1ee5d02a066e8e4a3121c5bd41237a7b7c8 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Borrelworst
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@46d6d1ee5d02a066e8e4a3121c5bd41237a7b7c8 -
Trigger Event:
release
-
Statement type: