Skip to main content

Troubleshooting CI/CD Integrations

When integrating DCM into your CI/CD pipeline, inconsistencies or unexpected results can occur due to various configuration issues. This page guides potential missing steps and environment differences to ensure a smooth integration process.

note

Yaml examples are based on GitHub Action, however, it may work in other CI tools as well. You may need to adjust accordingly.

Common Issues and Solutions

Dart/Flutter Version

Issue: Different Dart/Flutter versions can cause discrepancies in tool outputs.

Solution:

  • Ensure that the Dart/Flutter versions in your CI/CD environment match those used in your local development environment. You can use flutter-actions/setup-flutter action in GitHub.
jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup Flutter SDK
uses: flutter-actions/setup-flutter@v3
with:
channel: stable
version: 3.0.2
  • Use version managers like fvm (Flutter Version Manager) to specify and lock versions.
jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2

- name: Install FVM
run: pub global activate fvm

- name: Setup Flutter with FVM
run: |
fvm install VERSION
fvm use VERSION
export PATH="$PATH:`fvm flutter/bin`"

- name: Verify Flutter Version
run: flutter --version

DCM Version

Issue: Using different versions of DCM can lead to inconsistent results.

Solution:

  • Use DCM global configuration which you can add to dcm_global.yaml file that you should create at the root of your project:
version: '>=1.19.0 <2.0.0'
  • In addition, run proper command based on your operating system with the DCM version to ensure the correct version is used.
# Example for Linux
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Install DCM
run:
- apt-get install -y dcm=1.21.2-1 # Adjust DCM version as needed

Read more about DCM Global Configuration.

Discrepancies in Output Between CI and Local Runs

Issue: The output from CI runs may differ from local runs, leading to inconsistencies in detected issues or generated results.

Solution:

  • Ensure that the CI environment mirrors the local development environment as closely as possible.
  • Check for any additional or missing issues in the CI output compared to local runs and adjust configurations accordingly.
  • Align environment variables and system configurations between local and CI environments.
  • Ensure that all necessary dependencies are consistent across both environments.
  • Ensure that the working directory is set correctly in your CI configuration before running any commands.
  • Use absolute paths where possible to avoid discrepancies.

Different Branches

Issue: Running CI on different branches can lead to discrepancies if the branches are not up-to-date or have different configurations.

Solution:

  • Ensure that the branches being tested are up-to-date with the latest changes from the main branch. This minimizes discrepancies and potential conflicts.
  • Ensure that the CI environment is consistent across different branches to avoid configuration differences.

Different Installed Package Versions

Issue: Inconsistent package versions can cause differences in behavior and outputs.

Solution:

  • When defining dependencies in your pubspec.yaml file, avoid using the ^ operator, as it allows for automatic updates to newer versions, which might introduce changes or bugs. Instead, specify exact versions for critical dependencies.
dependencies:
flutter:
sdk: flutter
some_package: 1.2.3 # Locking the package version to 1.2.3
  • The pubspec.lock file ensures that the same versions of dependencies are used consistently. This file records the exact versions of each dependency that are installed. Make sure you keep this file and have not mistakenly removed or not checked out in Git.
  • In the CI environment, use the pubspec.lock file to install dependencies. This can be done by using the flutter pub get --offline command, which installs dependencies based on the versions specified in the lock file.
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Ensure lock file is used
run: |
flutter pub get --offline

Corrupted or Outdated .dartServer Cache

Issue: Keeping an outdated or mismatched .dartServer cache between CI runs can lead to old or incorrect errors being reported.

Solution:

  • Ensure the .dartServer cache is either updated or if it's not possible to update it, remove it before running your CI commands. Keeping an updated cache can improve performance, but if issues persist, removing it may be necessary. Typically, the location of .dartServer cache is in ~/.dartServer.

Connecting via SSH

Issue: Connecting and running DCM commands via SSH leads to the tool asking for the device verification (instead of the the CI/CD verification flow).

Solution:

  • Prefer other debugging methods, as connecting via SSH and running commands manually will result in DCM treating your device as a regular end-user device rather than a CI/CD server.