Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve release workflow on CircleCI #245

Merged
merged 15 commits into from
Mar 15, 2020
96 changes: 81 additions & 15 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -153,16 +153,6 @@ commands:
- save-pods-cache


aliases:

- &filter-version-tags-only
filters:
tags:
only: /^[0-9]+\.[0-9]+\.[0-9]+$/
branches:
ignore: /.*/


jobs:

build-and-test-ios13-iphone11promax:
Expand Down Expand Up @@ -207,7 +197,7 @@ jobs:
- store-reports

lint-podspec:
executor: ios12-iphone-xs-max
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
Expand All @@ -216,7 +206,7 @@ jobs:
command: bundle exec rake lint_podspec

build-documentation:
executor: ios12-iphone-xs-max
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
Expand All @@ -226,7 +216,7 @@ jobs:
command: bundle exec rake generate_documentation

generate-changelog:
executor: ios12-iphone-xs-max
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
Expand All @@ -247,8 +237,47 @@ jobs:
- store_test_results:
path: result.xml

create-major-release-pull-request:
jjochen marked this conversation as resolved.
Show resolved Hide resolved
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
- setup-cocoapods
- run:
name: Create major release pull request
command: bundle exec rake release_major_version

create-minor-release-pull-request:
jjochen marked this conversation as resolved.
Show resolved Hide resolved
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
- setup-cocoapods
- run:
name: Create minor release pull request
command: bundle exec rake release_minor_version

create-patch-release-pull-request:
jjochen marked this conversation as resolved.
Show resolved Hide resolved
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
- setup-cocoapods
- run:
name: Create patch release pull request
command: bundle exec rake release_patch_version

create-version-tag:
jjochen marked this conversation as resolved.
Show resolved Hide resolved
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
- run:
name: Create version tag on github
command: bundle exec rake create_github_release

push-podspec:
executor: ios12-iphone-xs-max
executor: ios13-iphone-11-pro-max
steps:
- checkout
- setup-gems
Expand All @@ -269,4 +298,41 @@ workflows:
- build-and-test-ios12-iphonexsmax
- build-documentation
- generate-changelog
- push-podspec: *filter-version-tags-only
- create-version-tag:
requires:
- lint-podspec
- swiftlint
- build-and-test-ios13-iphone11promax
- build-and-test-ios12-iphonexsmax
- build-documentation
- generate-changelog
filters:
branches:
only: master

deploy:
jobs:
- push-podspec:
filters:
tags:
only: /^[0-9]+\.[0-9]+\.[0-9]+$/
branches:
ignore: /.*/
- create-major-release-pull-request:
filters:
tags:
only: major-release
branches:
ignore: /.*/
- create-minor-release-pull-request:
filters:
tags:
only: minor-release
branches:
ignore: /.*/
- create-patch-release-pull-request:
filters:
tags:
only: patch-release
branches:
ignore: /.*/
84 changes: 72 additions & 12 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -159,18 +159,24 @@ begin

#-- Release ----------------------------------------------------------------#

desc 'Release major version'
task :release_major_version do
release_next_version "major"
end

desc 'Release minor version'
task :release_minor_version do
release_next_version "minor"
end

desc 'Release patch version'
task :release_patch_version do
jjochen marked this conversation as resolved.
Show resolved Hide resolved
release_next_version "patch"
end

desc 'Release version'
task :release_version, :version do |task, args|
ensure_clean_git_status
checkout_and_pull_master
ensure_clean_git_status
update_version_in_podspec args.version
update_version_in_example_project args.version
generate_changelog args.version
install_cocoapods
generate_documentation
create_release_branch_and_commit args.version
open_pull_request args.version
release_version args.version
end

desc 'Push podspec'
Expand All @@ -181,9 +187,15 @@ begin

desc 'Create release on github'
task :create_github_release do
version = version_from_podspec

unless is_release_commit_for_version version
puts "Not a release commit."
next
end

title "Creating release on github"
repo = "jjochen/JJFloatingActionButton"
version = version_from_podspec
body = changelog_for_version version
options = {
:name => version,
Expand Down Expand Up @@ -272,6 +284,30 @@ def check_parameter(parameter)
end
end

def increment_semver(semver, increment_type = "patch")
if not (/\d+\.\d+\.\d+/).match(semver)
raise "Your semantic version must match the format 'X.X.X'."
end
if not ["patch", "minor", "major"].include?(increment_type)
raise "Only 'patch', 'minor', and 'major' are supported increment types."
end

major, minor, patch = semver.split(".")
case increment_type
when "patch"
patch = patch.to_i + 1
when "minor"
minor = minor.to_i + 1
patch = 0
when "major"
major = major.to_i + 1
minor = 0
patch = 0
end

return "#{major}.#{minor}.#{patch}"
end

def install_gems
title 'Installing gems'
sh 'bundle install'
Expand Down Expand Up @@ -306,6 +342,25 @@ def xcodebuild_test(destination)
" | xcpretty --report junit && exit ${PIPESTATUS[0]}"
end

def release_next_version(type)
version = version_from_podspec
new_version = increment_semver(version, type)
release_version new_version
end

def release_version(version)
ensure_clean_git_status
checkout_and_pull_master
ensure_clean_git_status
update_version_in_podspec version
update_version_in_example_project version
generate_changelog version
install_cocoapods
generate_documentation
create_release_branch_and_commit version
open_pull_request version
end

def ensure_clean_git_status
title "Ensuring clean git status"
unless `git diff --shortstat 2> /dev/null | tail -n1` == ''
Expand All @@ -314,6 +369,11 @@ def ensure_clean_git_status
end
end

def is_release_commit_for_version(version)
commit_message = `git log -1 --pretty=%B 2> /dev/null`
return commit_message.match(/^Release #{version} \(.*\)$/)
end

def checkout_and_pull_master
title "Checkout and pull master"
sh "git checkout master"
Expand Down Expand Up @@ -390,7 +450,7 @@ def changelog_for_version(version)
end
end
if changelog.nil? || changelog.empty?
error_message "changelog for version #{verion} not found."
error_message "changelog for version #{version} not found."
exit 1
end
return changelog
Expand Down