jasperfurniss is creating a Release Candidate π #145
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Release Candidate | |
run-name: ${{ github.actor }} is creating a Release Candidate π | |
on: | |
push: | |
branches: | |
- master | |
jobs: | |
Creating-Release-Candidate: | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
working-directory: ./playbook | |
env: | |
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }} | |
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} | |
steps: | |
- uses: actions/checkout@v3 | |
- name: 'Enable registry auth' | |
shell: bash | |
run: | | |
echo "//registry.npmjs.org/:_authToken="$(echo -n '${{ secrets.NPM_TOKEN }}')"" >> ~/.npmrc | |
echo "//npm.powerapp.cloud/:_auth="$(echo -n 'gh-actions:${{ secrets.POWERHOME_NPM_REGISTRY_PASSWORD }}' | base64)"" >> ~/.npmrc | |
echo "//npm.powerapp.cloud/:always-auth = true" >> .npmrc | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20.11.0 | |
- name: Ruby Setup | |
uses: ruby/setup-ruby@v1 | |
with: | |
bundler-cache: true | |
- name: Python Setup | |
uses: actions/setup-python@v4 | |
with: | |
python-version: '3.9' | |
- name: Set Git Config | |
run: | | |
git config --local user.name "${{ github.actor }}" | |
git config --local user.email "${{ github.actor }}@users.noreply.github.com" | |
- name: Get Semver Label | |
id: get-label | |
run: | | |
PR_NUMBER=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ | |
"https://api.github.com/repos/${{ github.repository }}/commits/${{ github.sha }}/pulls" \ | |
| jq '.[0].number') | |
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV | |
if [ ! -z "$PR_NUMBER" ] && [ "$PR_NUMBER" != "null" ]; then | |
echo "β Successfully found PR number: $PR_NUMBER" | |
else | |
echo "β Unable to find PR number" | |
fi | |
echo "Fetching labels for PR #$PR_NUMBER..." | |
LABELS=$(gh pr view $PR_NUMBER --json labels -q '.labels[].name' || echo "Failed to fetch labels") | |
echo "Found labels: $LABELS" | |
if [ -z "$LABELS" ]; then | |
echo "β Error: Failed to fetch PR labels" | |
exit 1 | |
fi | |
SEMVER_LABEL=$(echo "$LABELS" | grep -iE '^(major|minor|patch)$' || true) | |
echo "Found Semver labels: $SEMVER_LABEL" | |
if [ -z "$SEMVER_LABEL" ]; then | |
echo "β Error: No valid Semver label (major, minor, patch) found on PR #$PR_NUMBER." | |
exit 1 | |
fi | |
LABEL_COUNT=$(echo "$SEMVER_LABEL" | wc -l) | |
echo "Number of Semver labels found: $LABEL_COUNT" | |
if [ "$LABEL_COUNT" -ne 1 ]; then | |
echo "β Error: Expected exactly one Semver label, found $LABEL_COUNT on PR #$PR_NUMBER." | |
exit 1 | |
fi | |
echo "SEMVER_LABEL=$SEMVER_LABEL" >> $GITHUB_ENV | |
echo "β Successfully found Semver label: $SEMVER_LABEL" | |
echo "SEMVER_LABEL=$SEMVER_LABEL" >> $GITHUB_ENV | |
echo "Semver label found: $SEMVER_LABEL" | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Grab Current Version and Set New RC Version | |
id: set-version | |
run: | | |
current_npm_version=$(node -pe "require('./package.json').version") | |
case ${{ env.SEMVER_LABEL }} in | |
major) | |
new_npm_version=$(yarn version --premajor --preid rc --no-git-tag-version | grep "New version:" | awk '{print $4}') | |
;; | |
minor) | |
new_npm_version=$(yarn version --preminor --preid rc --no-git-tag-version | grep "New version:" | awk '{print $4}') | |
;; | |
patch) | |
new_npm_version=$(yarn version --prepatch --preid rc --no-git-tag-version | grep "New version:" | awk '{print $4}') | |
;; | |
*) | |
echo "Error: Invalid Semver label: ${{ env.SEMVER_LABEL }}" | |
exit 1 | |
;; | |
esac | |
new_npm_version=${new_npm_version#v} | |
new_ruby_version=$(echo $new_npm_version | sed 's/-rc\./.pre.rc./') | |
echo "new_npm_version=${new_npm_version}" >> $GITHUB_ENV | |
echo "new_ruby_version=${new_ruby_version}" >> $GITHUB_ENV | |
- name: Check if version exists and increment if necessary | |
run: | | |
max_attempts=100 | |
attempt=0 | |
current_version="${{ env.new_npm_version }}" | |
while [ $attempt -lt $max_attempts ]; do | |
if npm view playbook-ui@$current_version version &>/dev/null; then | |
echo "Version $current_version already exists. Incrementing..." | |
current_version=$(yarn version --prerelease --preid rc --no-git-tag-version | grep "New version:" | awk '{print $4}') | |
current_version=${current_version#v} | |
else | |
echo "Version $current_version is available." | |
break | |
fi | |
attempt=$((attempt+1)) | |
done | |
if [ $attempt -eq $max_attempts ]; then | |
echo "Error: Maximum attempts reached. Unable to find an available version." | |
exit 1 | |
fi | |
echo "new_npm_version=${current_version}" >> $GITHUB_ENV | |
new_ruby_version=$(echo $current_version | sed 's/-rc\./.pre.rc./') | |
echo "new_ruby_version=${new_ruby_version}" >> $GITHUB_ENV | |
- name: Update Version.rb | |
run: | | |
gem install bundler | |
bundle | |
bin/rails pb_release:action[${{env.new_ruby_version}}] | |
- name: Distribute and Publish (NPM) | |
run: | | |
yarn install | |
bundle | |
yarn release | |
npm pack | |
npm publish --registry https://registry.npmjs.org playbook-ui-${{ env.new_npm_version }}.tgz --tag rc | |
- name: Distribute and Publish (RubyGems) | |
run: | | |
bin/build_gem | |
gem build lib/playbook_ui_docs.gemspec | |
rm -rf dist/playbook-doc.js dist/playbook-rails.js dist/app dist/pb_doc_helper.rb dist/menu.yml | |
gem push playbook_ui-${{ env.new_ruby_version }}.gem --host https://rubygems.org/ --key ${{ env.GEM_HOST_API_KEY }} | |
gem push playbook_ui_docs-${{ env.new_ruby_version }}.gem --host https://rubygems.org/ --key ${{ env.GEM_HOST_API_KEY }} | |
- name: Create GitHub Release | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
gh release create v${{ env.new_npm_version }} \ | |
--title "Release Candidate v${{ env.new_npm_version }}" \ | |
--notes "This is a release candidate version. Please test thoroughly before promoting to a stable release." \ | |
--prerelease | |
- name: Leave PR comment | |
uses: actions/github-script@v6 | |
env: | |
PR_NUMBER: ${{ github.event.pull_request.number }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
RUBY_GEM_VERSION: ${{ env.new_ruby_version }} | |
RUBY_GEM_LINK: https://rubygems.org/gems/playbook_ui/versions/${{env.new_ruby_version}} | |
NPM_VERSION: ${{ env.new_npm_version }} | |
NPM_LINK: https://www.npmjs.com/package/playbook-ui/v/${{env.new_npm_version}} | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const commitSha = context.payload.head_commit.id; | |
const commitMessage = context.payload.head_commit.message; | |
const commitAuthor = context.payload.head_commit.author.name; | |
const commitUrl = context.payload.head_commit.url; | |
console.log(`Commit message: ${commitMessage}`); | |
console.log(`Commit author: ${commitAuthor}`); | |
console.log(`Commit URL: ${commitUrl}`); | |
// Get the PR related to this commit using octokit API | |
const pullRequests = await github.rest.repos.listPullRequestsAssociatedWithCommit({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
commit_sha: commitSha | |
}); | |
if (pullRequests.data.length > 0) { | |
const pullRequestNumber = pullRequests.data[0].number; | |
console.log(`Found pull request #${pullRequestNumber} for commit ${commitSha}`); | |
// Add a comment to the pull request | |
await github.rest.issues.createComment({ | |
issue_number: pullRequestNumber, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body: `You merged this pr to master branch: | |
- Ruby Gem: [${{env.RUBY_GEM_VERSION}}](${{env.RUBY_GEM_LINK}}) | |
- NPM: [${{env.NPM_VERSION}}](${{env.NPM_LINK}})` | |
}); | |
} else { | |
console.log('No pull request found for this commit'); | |
} |