Azure Pipelines does have an extensions marketplace available, but there isn't always a task to fill a gap.
GitHub Actions Marketplace has a quickly growing list of actions and has several related to markdown linting, which was the use case I was after.
But how does one get the GitHub Action running from an Azure DevOps Pipeline?
Find the Docker image for the GitHub Action
Fortunately, it's fairly straightforward to get an GitHub Action running from your AzDO Pipeline provided the author uses a Docker container -- there are several GitHub action types, and not all of them use Docker.
Once you've found a marketplace Action you like, go to its repo using the link on the right-hand pane above Open Issues.
Any Docker-based task will have an
action.yaml file in their repo, so if the author doesn't mention the image name in their README peek at the
runs section of their
action.yaml to find their registry and image name.
For example, have a look at the action.yaml from the Markdown Lint action).
Configure your pipeline
Provided a Docker container is available for the Action, it's a fairly straightforward to integrate it into a DevOps after installing Docker tools onto your build agent.
First, ensure you have the docker tools available on your build agent:
... steps: - task: DockerInstaller@0 displayName: Docker Installer inputs: releaseType: stable ...
Next, use a script task to issue a
docker run that sets up an environment similar to that created by GitHub actions.
For most Actions, I've found that just mapping a volume of the repository root to
/tmp and setting the working directory to the same to be sufficient:
steps: # ... - script: | docker run --rm -i -v $(pwd):/tmp -w /tmp IMAGE_NAME:TAG ARGS_IF_APPLICABLE displayName: "Run GitHub Action <foo>"
For example, for the Markdown Link Check:
steps: # ... # https://github.com/marketplace/actions/markdown-link-check - script: | docker run --rm -i -v $(pwd):/tmp:ro -w /tmp ghcr.io/tcort/markdown-link-check:stable *.md **/*.md displayName: "Check for broken URLs"
(note here, since link checking doesn't require write access to the repo I've also marked the
/tmp volume as
ro to limit its permissions - this is optional, but recommended)
Some actions may make use of GitHub built-in environment variables.
If you run into errors due to missing variable values, you will need to look at the Action repo to find out when are used, and map them to the Azure Pipelines Predefined Variables as best you can:
docker run --rm -i -v "$(pwd):/tmp:ro" -w /tmp -e GITHUB_SHA="$(Build.SourceVersion)" -e GITHUB_JOB="$(System.JobId)" IMAGE_NAME:TAG ARGS
Putting it all together
Here's an sample complete job template YAML to kick off markdown linting, link checking, and spellchecking:
# Re-usable pipeline job template to perform markdown linting. jobs: - job: verify_markdown timeoutInMinutes: 10 pool: vmImage: ubuntu-latest steps: - task: DockerInstaller@0 displayName: Docker Installer inputs: releaseType: stable # https://github.com/marketplace/actions/markdown-linting-action - script: | docker run --rm -v $(pwd):/tmp:ro -w /tmp avtodev/markdown-lint:master . displayName: "Lint markdown" # https://github.com/marketplace/actions/markdown-link-check - script: | docker run --rm -i -v $(pwd):/tmp:ro -w /tmp ghcr.io/tcort/markdown-link-check:stable *.md **/*.md displayName: "Check for broken URLs" # https://github.com/marketplace/actions/github-spellcheck-action - script: | docker run --rm -v $(pwd):/tmp jonasbn/github-action-spellcheck displayName: "Check for spelling errors"
Note - since this trick only involves setting up the Docker image in the right way, you can also use these Actions locally using the same
docker run commands as your pipeline, as long as you can find the right values any environment variables if they are required by the Action.