Skip to main content
Teams+

Azure DevOps Pipeline

To use Azure DevOps CI/CD, create an azure-pipelines.yml file in the root of your application, or use the Azure DevOps pipeline setup in the dashboard.

AzureDevOps Pipeline AzureDevOps pipeline editor AzureDevOps pipeline Yaml file

Here’s how you can set up a pipeline configuration for Azure DevOps:

trigger:
branches:
exclude:
- '*'

pr:
branches:
include:
- main

pool:
vmImage: 'ubuntu-latest'

jobs:
- job: Code_Quality
displayName: 'Code Quality'
steps:
- script: |
set -e # Exit on any command failure

# Install Flutter
echo "Installing Flutter..."
sudo apt-get update
sudo apt-get install -y git curl
git clone https://github.com/flutter/flutter.git -b stable --depth 1
export PATH="$PATH:`pwd`/flutter/bin"
flutter doctor
flutter pub get

# Install DCM
echo "Installing DCM..."
sudo apt-get install -y --no-install-recommends wget gnupg2
wget -qO- https://dcm.dev/pgp-key.public | gpg --dearmor -o /usr/share/keyrings/dcm.gpg
echo 'deb [signed-by=/usr/share/keyrings/dcm.gpg arch=amd64] https://dcm.dev/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list
sudo apt-get update
sudo apt-get install -y dcm=1.21.2-1 # Adjust DCM version as needed

# Verify DCM installation
echo "Verifying DCM installation..."
dcm --version

# Run DCM Analysis
echo "Running DCM Analysis..."
set +e # Do not exit on error
dcm run --analyze --unused-code --reporter=checkstyle lib > checkstyle-result.xml
DCM_EXIT_CODE=$?
DCM_ERROR_MESSAGE=$(dcm run --analyze --unused-code lib 2>&1)
echo "DCM_EXIT_CODE=$DCM_EXIT_CODE" > dcm_exit_code.txt
echo "DCM_ERROR_MESSAGE=\"$DCM_ERROR_MESSAGE\"" > dcm_error_message.txt
set -e # Exit on any command failure

# Write error message to Markdown file
if [ $DCM_EXIT_CODE -ne 0 ]; then
echo "# DCM Analysis Failed" > $(System.DefaultWorkingDirectory)/dcm_error_summary.md
echo "DCM Analysis failed with exit code $DCM_EXIT_CODE." >> $(System.DefaultWorkingDirectory)/dcm_error_summary.md
echo "## Error Message" >> $(System.DefaultWorkingDirectory)/dcm_error_summary.md
echo "\`\`\`" >> $(System.DefaultWorkingDirectory)/dcm_error_summary.md
echo "$DCM_ERROR_MESSAGE" >> $(System.DefaultWorkingDirectory)/dcm_error_summary.md
echo "\`\`\`" >> $(System.DefaultWorkingDirectory)/dcm_error_summary.md
fi
displayName: 'Install Flutter, Install DCM, and Run DCM Analysis'
env:
DCM_CI_KEY: $(DCM_CI_KEY)
DCM_EMAIL: $(DCM_EMAIL)

- script: |
if [ -f checkstyle-result.xml ]; then
echo "checkstyle-result.xml exists, proceeding to publish."
else
echo "checkstyle-result.xml does not exist, skipping publish step."
exit 1
fi
displayName: 'Check for Checkstyle Result'

- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: 'checkstyle-result.xml'
ArtifactName: 'CheckstyleReports'
publishLocation: 'Container'
condition: succeededOrFailed()
displayName: 'Publish Checkstyle Report'

- script: |
source dcm_exit_code.txt
source dcm_error_message.txt
if [ "$DCM_EXIT_CODE" -ne 0 ]; then
echo "DCM Analysis failed with exit code $DCM_EXIT_CODE. Error message: $DCM_ERROR_MESSAGE"
##vso[task.uploadsummary]$(System.DefaultWorkingDirectory)/dcm_error_summary.md
##vso[task.logdetail id=dcm_log;name=DCM Analysis Log;type=Build;order=1;state=Completed]DCM Analysis log details
##vso[task.addattachment type=Distributedtask.Core.Summary;name=DCM Analysis Summary;]$(System.DefaultWorkingDirectory)/dcm_error_summary.md
exit $DCM_EXIT_CODE
fi
displayName: 'Fail Build if DCM Analysis Failed'
condition: always()

Explanation
  • Trigger Configuration:

  • The pipeline triggers on pull requests (PRs) targeting the main branch.

  • Excludes all other branches from triggering the pipeline.

  • Pool Configuration:

    • Uses the ubuntu-latest virtual machine image for running the pipeline.
  • Job: Code_Quality:

    • Display Name: 'Code Quality'
    • Steps:
      1. Install Flutter:
        • Updates the package list.
        • Clones the Flutter repository.
        • Adds Flutter to the PATH.
        • Runs flutter doctor to verify the installation.
        • Runs flutter pub get to fetch Dart packages.
      2. Install DCM:
        • Installs necessary dependencies (wget, gnupg2).
        • Downloads and installs DCM's GPG key.
        • Adds the DCM repository configuration.
        • Updates the package list.
        • Installs DCM (version 1.21.2-1).
      3. Verify DCM Installation:
        • Checks the installed version of DCM to ensure it's correctly installed.
      4. Run DCM Analysis:
        • Runs the DCM analysis and captures the exit code and error message.
        • Logs a message if DCM exits with a non-zero code.
        • Writes the error message to a Markdown file if the DCM analysis fails.
      5. Check for Checkstyle Result:
        • Verifies if the checkstyle-result.xml file exists before attempting to publish it.
        • Skips the publish step if the file does not exist.
      6. Publish Checkstyle Report:
        • Publishes the checkstyle-result.xml file as a build artifact named CheckstyleReports.
        • Ensures the artifact is published regardless of the previous job's success or failure.
      7. Fail Build if DCM Analysis Failed:
        • Sources the captured exit code and error message.
        • Logs the failure and error message.
        • Uploads the Markdown summary to the build summary.
        • Logs detailed information and attaches the summary file.
        • Fails the build with the captured error message.

Azure DevOps Jobs AzureDevOps Jobs

Azure DevOps Report in Logs AzureDevOps Report in Logs

Setup Branch Policy​

In AzureDevOps, you need to make sure that you have a build policy for each branch that is considered the main which all PRs are going to merge.

AzureDevOps Branch Policies AzureDevOps Build Policy

Check the status of PRs​

In each PR, you can see the analysis status that runs via Pipeline.

AzureDevOps status analysis

Setting Environment Variables in Azure DevOps​

Ensure that DCM_CI_KEY and DCM_EMAIL are set as environment variables in your Azure DevOps project:

  • Navigate to your Azure DevOps project.
  • Go to the pipelines, select your pipeline and Edit.
  • Then in Edit mode, select Variables and add DCM secrets.
  • Add DCM_CI_KEY and DCM_EMAIL with their respective values.

Azure Devops Environment Variables Azure Devops Environment Variables