Semantic Release for Fastlane
Boss: “Can you release a new version of Android Alpha
?”
Developer: “ Yeah, sure. Hmm 🤔. Hey boss, how should I do that?”
Boss: “Just run fastlane android alpha
.”
Developer: “Yeah, but what about version? Shouldn’t I update it in those Gradle files?”
Boss: “No. Just run fastlane android alpha
.”
Developer: “And build number? We use it as a version code on google play.”
Boss: “Just run fastlane android alpha
and let’s have a coffee. ☕ I’ll tell you how it works.”
Recently I was thinking about how to use semantic release package for my React Native Apps that use Fastlane. I like the idea to absolutely not think about versioning or build numbers. And I like conventional commits.
Semantic release as a Fastlane plugin 🎉
That’s why I wrote this plugin. When you install the semantic_release
plugin to your Fastlane. You’ll be able to use these actions — analyze_commits
and conventional_changelog
. The code is open-sourced on my GitHub. This plugin is also used for releasing the plugin itself. So you can get inspired in the Fastfile!fastlane add_plugin semantic_release
Fastlane Config of React Native App
I will share with you a simplified config of my Fastlane. First of all, we need to find out what build number is next. Because we use build number as a version code on google play. This happens before all lanes. (Read comments in the snippet.)
iOS Alpha Deploy
Let’s go step by step from the end of the workflow.
Post Deploy
- generates a changelog
- pushes a tag of the next version to the GIT repository
- sends release notes to the Slack channel
A format of the tag is always [platform]/[flavor]/[semver]/[build_number]
. It uses this tag to know what version was deployed last time. You might be wondering where we got the next_version
. It is generated by analyze_commits
action. We’ll talk about it later. Now, let’s talk about conventional_changelog
action.
Conventional Changelog Action
What do you get when you use conventional_changelog
? Look at the right side of the following picture. That’s what you get as a string
. The changelog grouped by types of commits.
It takes commits marked as a fix
and commits marked as a feat
, groups them and create this changelog in either slack
or markdown
format. You can set up section titles and also their order. You can set up which commits will be skipped and which will be included in the changelog. Everything is up to you!
Build
In this step, we need to take the next_version
number and save it to Xcode files. We use already known Fastlane actions as increment_version_number
or increment_build_number_in_plist
. Easy with Fastlane!
Build — Android
Just short jump to the build of Android workflow. Maybe you are wondering how to set up the version in app/build.gradle
file. We send properties to the Gradle task. Build number and next version.
Later in build.gradle
I get these properties and set the default config for versionCode
and versionName
.
Verify
Back to iOS. That’s the action where everything starts. First of all, it ensures that GIT status is clean. Then we split run to “On CI Machine” and “On Local Machine”. Just because we want to save some minutes on CircleCI. We usually deploy both iOS
and Android
versions together. So we don’t have to install dependencies and check the code quality twice.
Analyze Commits Action
Returns true
if the version should be released. It also provides some useful variables to the lane_context
. So you have access to them everywhere in Fastlane. For example, the execution on the following picture would store 1.4.2
to the lane_context[SharedValues::RELEASE_NEXT_VERSION]
. We used it before in those snippets. 😉
This action is very useful when you have set up nightly deploys with CI. If there are no changes since the last night it won’t be deployed. Or if there are only changes that do not have any impact on the app itself. For example, just updating documentation or building scripts.
How do you release your React Native app?
Please let me know what do you think about this plugin. Would it be helpful for you? Do you need to adjust some parameters of the actions? Do you need to add some action to make your release absolutely automated?