Resolving the auto-upgrade issue will allow having edge gems versions with little to no effort. How could you achieve this with CI (specifically CircleCI)?
Automatic update idea
CircleCI provides scheduling jobs and workflows. So you need to configure it to run updating script, which also needs to be prepared. That’s all!
Updating Script
What the script has to do, step by step:
- Create and switch to the new branch with an informative title.
#!/usr/bin/env bash
current_date=`date +"%Y%m%d%H%M"`
new_branch_name="auto-upgrade-gemfile-dependencies-${current_date}"
git checkout -b $new_branch_name
- Update gems (could be only preselected, that based on you) and return update results with messages.
#!/usr/bin/env bash
if bundle update; then
echo 'Updated successfully'
exit 0
else
echo 'Failed to update\n'
exit 1
fi
- Create Pull Request for the new updates.
#!/usr/bin/env bash
git commit -am "Upgrades Gemfile dependencies"
git push https://$GITHUB_TOKEN@github.com/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME.git -f
curl -X POST \
-H "Authorization: token ${GITHUB_TOKEN}" \
-d '{"title":"Upgrade gemfile dependencies", "base":"master", "head":"'$CIRCLE_PROJECT_USERNAME':'$new_branch_name'"}' \
https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls
CIRCLE_PROJECT_USERNAME and CIRCLE_PROJECT_REPONAME — it is CircleCI built-in environment variables.
GITHUB_TOKEN — this variable should be stored manually like CircleCI Environment Variable.
Provide GitHub User name and email (they could have fake values) to have the ability to commit:
git config user.name "jt-deployments"
git config user.email "circleci.bot@example.com"
Finally, the script will look like:
#!/usr/bin/env bash
set -e
echo "-----Create and switch to new branch-----"
current_date=`date +"%Y%m%d%H%M"`
new_branch_name="auto-upgrade-gemfile-dependencies-${current_date}"
git checkout -b $new_branch_name
echo "-----Run Gemfile update-----"
if bundle update; then
echo 'Updated successfully'
git config user.name "jt-deployments"
git config user.email "circleci.bot@example.com"
git commit -am "Upgrades Gemfile dependencies"
git push https://$GITHUB_TOKEN@github.com/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME.git -f
curl -X POST \
-H "Authorization: token ${GITHUB_TOKEN}" \
-d '{"title":"Upgrade gemfile dependencies","base":"master","head":"'$CIRCLE_PROJECT_USERNAME':'$new_branch_name'"}' \
https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls
exit 0
else
echo 'Failed to update\n'
exit 1
fi
CircleCI configuration
For example, set the script to be invoked once a month at ten o’clock:
workflows:
version: 2
auto_upgrade_tools:
triggers:
- schedule:
cron: "0 10 1 * *"
filters:
branches:
only:
- master
jobs:
- upgrade_gemfile
jobs:
upgrade_tools:
docker:
- image: circleci/ruby:2.6-stretch-node
steps:
- checkout
- run:
name: Install Bundler
command: |
echo 'export BUNDLER_VERSION=$(cat Gemfile.lock | tail -1 | tr -d " ")' >> $BASH_ENV
source $BASH_ENV
gem install bundler:$BUNDLER_VERSION
- run: sudo apt-get install cmake
- run:
name: Run Gemfile update in separate branch
command: |
./bin/circleci-auto_upgrade_tools
Automate everything possible
This way you can not worry about updating the dependencies. Trying to automate such activity helps to save time and increase your productivity. It is good to have more time for creative work.
Link to complete script
You can find this script as well as other optimization tricks in our repository jetthoughts/jt_tools.
Sergey Sviridov is a Software Engineer at JetThoughts. Follow him on LinkedIn or GitHub.
If you enjoyed this story, we recommend reading our latest tech stories and trending tech stories.