Reputation: 303
I was wondering whether is it possible to have automatic versioning (following the SemVer convention) in Flutter, set in a GitLab/GitHub/BitBucket pipeline. Obviously, all git commits will follow the Conventional Commits structure.
I searched a lot but could not find anything helpful. All I could find was a way to create automatic changelog based on the commits (but that is not my situation here). Has anyone encountered the same problem and found a solution?
Upvotes: 4
Views: 4050
Reputation: 99
Yes, it's definitely possible.
Add the version
plugin to your pubspec.yaml
file under the dev_dependencies
section:
dev_dependencies:
version: ^2.0.0
The version
plugin provides a way to manage the version number of your application and generate version-related code.
Create a new file named version.dart
in the lib/
directory of your project, and add the following code to it:
import 'package:version/version.dart';
final version = Version(0, 1, 0);
This creates a version
variable with an initial version number of 0.1.0
. This version number will be automatically incremented based on the commits following the Conventional Commits structure.
Create a .gitlab-ci.yml
file in the root directory of your project and add the following code to it:
stages:
- build
- release
flutter_build:
stage: build
image: cirrusci/flutter:stable
script:
- flutter packages get
- flutter build apk
artifacts:
paths:
- build/app/outputs/flutter-apk/app-release.apk
release:
stage: release
image: cirrusci/flutter:stable
script:
- flutter packages get
- flutter pub get
- version patch
- git add pubspec.yaml lib/version.dart
- git commit -m "Bump version to \${CI_COMMIT_TAG}"
- git tag -a "\${CI_COMMIT_TAG}" -m "Version \${CI_COMMIT_TAG}"
- git push origin "\${CI_COMMIT_TAG}"
This pipeline consists of two stages: build
and release
. In the build
stage, we build the Flutter APK and save it as an artifact. In the release
stage, we increment the version number using the version patch
command, commit the changes to the pubspec.yaml
and lib/version.dart
files, and tag the commit with the new version number. Finally, we push the tag to the remote Git repository.
In order to use the version
plugin, we need to set up two environment variables in the GitLab pipeline:
FLUTTER_ROOT
: the path to the Flutter SDKPUB_CACHE
: the path to the pub cache directoryAdd the following environment variables to your GitLab project:
FLUTTER_ROOT
: /opt/flutter
PUB_CACHE
: $CI_PROJECT_DIR/.pub-cache
To create a new release, follow these steps:
Push a commit following the Conventional Commits structure. For example:
feat: add new feature
Create a new tag with the v
prefix and the new version number. For example:
git tag -a v0.1.1 -m "Version 0.1.1"
Push the tag to the remote Git repository:
git push origin v0.1.1
The GitLab pipeline will automatically trigger the release
stage and increment the version number in the version.dart
file, commit the changes, and tag the commit with the new version number.
The new release APK will be available as an artifact in the GitLab pipeline, under the build/app/outputs/flutter-apk/
directory.
Upvotes: 2