From 8215e30e74eaf5484fdf5bd8f206471262825cec Mon Sep 17 00:00:00 2001 From: Oleh Fedorenko Date: Sun, 25 Jul 2021 19:24:18 +0000 Subject: [PATCH] Add rel-eng notebook --- .gitignore | 1 + rel-eng/gem_release.ipynb | 366 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 367 insertions(+) create mode 100644 rel-eng/gem_release.ipynb diff --git a/.gitignore b/.gitignore index 0044b1638..1b97c9f0b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ Gemfile.local .ruby-gemset .DS_Store +rel-eng/.ipynb_checkpoints diff --git a/rel-eng/gem_release.ipynb b/rel-eng/gem_release.ipynb new file mode 100644 index 000000000..ecd87a38a --- /dev/null +++ b/rel-eng/gem_release.ipynb @@ -0,0 +1,366 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Release of apipie-rails gem\n", + "\n", + "### Requirements\n", + "- push access to https://github.com/Apipie/apipie-rails\n", + "- push access to rubygems.org for apipie-rails\n", + "- sudo yum install python-slugify asciidoc\n", + "- ensure neither the `git push` or `gem push` don't require interractive auth. If you can't use api key or ssh key to auth skip these steps and run them form the shell manually \n", + "\n", + "### Release process\n", + "- Follow the steps with `+` or `+,`\n", + "- If anything fails, fix it and re-run the step if applicable\n", + "\n", + "### Release settings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%cd .." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Update the following notebook settings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "NEW_VERSION = '0.5.19'\n", + "LAST_VERSION = '0.5.18'\n", + "GIT_REMOTE_UPSTREAM = 'origin'\n", + "WORK_BRANCH = 'master'\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ensure the repo is up to date" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! git checkout {WORK_BRANCH}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! git fetch {GIT_REMOTE_UPSTREAM}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! git rebase {GIT_REMOTE_UPSTREAM}/{WORK_BRANCH}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run tests localy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! bundle update" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "! bundle exec rake" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Update release related stuff" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! sed -i 's/VERSION = .*/VERSION = \"{NEW_VERSION}\"/' lib/apipie/version.rb" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Parse git changelog\n", + "from IPython.display import Markdown as md\n", + "from subprocess import check_output\n", + "from shlex import split\n", + "import re\n", + "\n", + "def format_log_entry(entry):\n", + " author = re.search(r'author:(.*)', entry).group(1)\n", + " entry = re.sub(r'author:(.*)', '', entry)\n", + " entry = re.sub(r'([fF]ixes|[rR]efs)[^-]*-\\s*(.*)', r'\\2', entry)\n", + " entry = '* ' + entry.capitalize()\n", + " entry = re.sub(r'\\(#([0-9]+)\\)', r'[#\\1](https://github.com/Apipie/apipie-rails/pull/\\1)', entry)\n", + " entry = entry + f'({author})'\n", + " return entry\n", + "\n", + "def skip(entry):\n", + " if re.match(r'Merge pull', entry) or \\\n", + " re.match(r'^i18n', entry) or \\\n", + " re.match(r'^Bump to version', entry):\n", + " return True\n", + " else:\n", + " return False \n", + "git_log_cmd = 'git log --pretty=format:\"%%s author:%%an\" v%s..HEAD' % LAST_VERSION\n", + "log = check_output(split(git_log_cmd)).decode('utf8').split('\\n')\n", + "change_log = [format_log_entry(e) for e in log if not skip(e)]\n", + "md('\\n'.join(change_log))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Write release notes\n", + "from datetime import datetime\n", + "import fileinput\n", + "import sys\n", + "\n", + "fh = fileinput.input('CHANGELOG.md', inplace=True) \n", + "for line in fh: \n", + " print(line.rstrip())\n", + " if re.match(r'========', line):\n", + " print('## [v%s](https://github.com/Apipie/apipie-rails/tree/v%s) (%s)' % (NEW_VERSION, NEW_VERSION, datetime.today().strftime('%Y-%m-%d')))\n", + " print('[Full Changelog](https://github.com/Apipie/apipie-rails/compare/v%s...v%s)' % (LAST_VERSION, NEW_VERSION))\n", + " for entry in change_log:\n", + " print(entry)\n", + " print('')\n", + "fh.close() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Manual step: Update deps in the gemspec if neccessary" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check what is going to be commited" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "! git add -u\n", + "! git status" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "! git diff --cached" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Commit changes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "! git commit -m \"Bump to {NEW_VERSION}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tag new version" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! git tag v{NEW_VERSION}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Build the gem" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! rake build" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! gem push pkg/apipie-rails-{NEW_VERSION}.gem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PUSH the changes upstream If everything is correct" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! git push {GIT_REMOTE_UPSTREAM} {WORK_BRANCH}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "! git push --tags {GIT_REMOTE_UPSTREAM} {WORK_BRANCH}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Now the new release is in upstream repo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Some manual steps follow to improve the UX\n", + "\n", + "#### New relase on GitHub\n", + "\n", + "Copy the following changelog lines to the description in form on link below\n", + "The release title is the new version." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('\\n')\n", + "print('\\n'.join(change_log))\n", + "print('\\n\\nhttps://github.com/Apipie/apipie-rails/releases/new?tag=%s' % NEW_VERSION)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Congratulations\n", + "\n", + "Release is public now." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}