Run checks for Flutter projects with GitLab CI
That workflow is good, however, it's very easy to bypass the checks with the
An improvement to that workflow is to run those checks on a pipeline to make sure that every merge request will be formatted and all tests are passing.
Let's see how to achieve this using GitLab CI.
- Create the file
.gitlab-ci.ymlon the root directory;
- Define the stage on the file:
image: cirrusci/flutter:stable before_script: - flutter pub get stages: - analyze-and-test analyze-and-test: stage: analyze-and-test script: - flutter build aot - flutter analyze - flutter test only: - merge_requests
And that's it! Now, whenever you open and update a merge request,
flutter build aot,
flutter analyze and
flutter test will run after Java and Flutter are installed in the pipeline. If any of the commands fail, the merge request will get a failed check. ❌
Bonus - Test Coverage report
Another improvement is to report code coverage on every merge request. The example below uses Codecov but there are other services for it too - although the usage will be probably different.
To integrate it, we need to generate a token in Codecov after linking our repository - see documentation - and add it as the
CODECOV_TOKEN environment variable on GitLab through Settings > CI/CD > Variables - see documentation.
As the last step, we update the workflow with:
- ... # same as before - flutter analyze - flutter test --coverage - bash <(curl -s https://codecov.io/bash) only: - merge_requests
Make sure the
CODECOV_TOKENenvironment variable is set.
Check out the Codecov documentation for more information.
Check out an example repo here.
- The example runs only on merge requests but GitLab CI supports other triggers - see documentation;
- The example uses the
stablechannel of Flutter but there are images for other channels and specific versions as well - see list and GitHub;
- The example uses GitLab CI but the workflow can be achieved using other pipeline services too - TravisCI, CircleCI, etc.
- Example with GitHub Actions here.
If you're using a different solution or have any suggestions to improve this example, feel free to share it in the comments.
I hope you enjoyed this post and follow me on any platform for more.