Make Review Apps #35
Workflow file for this run
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: Make Review Apps | |
on: | |
release: | |
types: [released, prereleased] | |
pull_request: | |
branches: [ '**' ] | |
push: | |
branches: [ '2[0-9][02468]-*-2[0-9]' ] | |
env: | |
# APPLITOOLS_API_KEY: | |
# AWS_ACCESS_KEY_ID: | |
# AWS_REGION: | |
# AWS_SECRET_ACCESS_KEY: | |
# DSE_API_RELEASE_TOKEN: | |
# GITHUB_PACKAGES_TOKEN: | |
# GITHUB_TOKEN: ${{ github.token }} | |
HEROKU_API_KEY: ${{ secrets.DSE_INFRA_HEROKU_API_KEY }} | |
jobs: | |
init: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: tibdex/github-app-token@v1 | |
id: get_installation_token | |
with: | |
app_id: 244972 | |
private_key: ${{ secrets.DSE_CI_APP_KEY }} | |
- uses: actions/checkout@v3 | |
- run: printenv | sort | |
- name: Show GitHub context | |
env: | |
GITHUB_CONTEXT: ${{ toJson(github) }} | |
run: echo "$GITHUB_CONTEXT" | |
- run: mkdir -p workspace | |
- name: Retrieve Github deployments | |
env: | |
GITHUB_TOKEN: ${{ steps.get_installation_token.outputs.token }} | |
run: 'gh api /repos/salesforce-ux/design-system-internal/deployments --field ref=${{ github.event.pull_request.head.sha }} --method GET | jq "map({ status: .statuses_url, url: .payload.web_url})" > workspace/gh-deployments.json' | |
- name: View deployments | |
run: cat workspace/gh-deployments.json | |
- name: Set Github deployments to "in progress" | |
env: | |
GITHUB_TOKEN: ${{ steps.get_installation_token.outputs.token }} | |
run: |- | |
for row in $(jq -r '.[] | @base64' workspace/gh-deployments.json); do | |
export STATUS_URL=$(echo ${row} | base64 --decode | jq -r ".status" | sed 's/https:\/\/api.github.com//') | |
gh api ${STATUS_URL} -f state=in_progress -H "Accept: application/vnd.github.flash-preview+json" | |
done | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: |- | |
workspace/gh-deployments.json | |
prepare: | |
runs-on: ubuntu-latest | |
outputs: | |
HEROKU_APP_NAME: ${{ steps.which-heroku-app.outputs.HEROKU_APP_NAME }} | |
HEROKU_RELEASE_STORYBOOK_APP_NAME: ${{ steps.which-heroku-app.outputs.HEROKU_RELEASE_STORYBOOK_APP_NAME }} | |
needs: | |
- init | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
cache: 'npm' | |
- uses: actions/download-artifact@v3 | |
with: | |
path: workspace | |
- name: Determine Heroku App | |
uses: "./.github/actions/set-heroku-app-name" | |
id: which-heroku-app | |
- run: npm ci | |
- uses: "./.github/actions/build-tokens" | |
- uses: "./.github/actions/copy-tokens-to-workspace" | |
- name: Print destination app names | |
run: | | |
HEROKU_APP_NAME=${{ steps.which-heroku-app.outputs.HEROKU_APP_NAME }} | |
HEROKU_RELEASE_STORYBOOK_APP_NAME=${{ steps.which-heroku-app.outputs.HEROKU_RELEASE_STORYBOOK_APP_NAME }} | |
echo "==============================" | |
echo $HEROKU_APP_NAME | |
echo $HEROKU_RELEASE_STORYBOOK_APP_NAME | |
# if HEROKU_RELEASE_STORYBOOK_APP_NAME is "true", then we are in a PR | |
echo "==============================" | |
- name: Compile styles | |
run: npm run gulp -- styles | |
- name: Compress styles | |
run: tar -cvf workspace/styles.tar assets/styles/ | |
- name: Compress generated metadata | |
run: tar -cvf workspace/metadata.tar .generated/metadata/ | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: |- | |
workspace/design-tokens.tar | |
workspace/styles.tar | |
workspace/metadata.tar | |
workspace/heroku-app-name.txt | |
workspace/heroku-release-storybook-app-name.txt | |
build-storybook: | |
if: ${{ !contains('refs/heads//^v\d+\.\d+\.\d+-.+$/', github.ref) }} | |
runs-on: ubuntu-latest | |
needs: | |
- prepare | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
cache: 'npm' | |
- uses: actions/download-artifact@v3 | |
with: | |
path: workspace | |
- name: Display structure of downloaded files | |
run: ls -R | |
working-directory: workspace | |
- uses: "./.github/actions/copy-tokens-from-workspace" | |
- name: Install and Build task | |
run: | | |
npm ci | |
npm run build | |
- name: Build static Storybook | |
run: npm run storybook:build | |
env: | |
NODE_OPTIONS: --openssl-legacy-provider # per https://candid.technology/error-error-0308010c-digital-envelope-routines-unsupported/ | |
- name: Archive static Storybook | |
run: tar -czvf workspace/storybook.tar.gz .www/ Procfile config/nginx.conf.erb heroku-start.sh app.json | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: workspace/storybook.tar.gz | |
publish-storybook: | |
if: ${{ needs.prepare.outputs.HEROKU_RELEASE_STORYBOOK_APP_NAME != 'false' }} | |
runs-on: ubuntu-latest | |
needs: | |
- init | |
- prepare | |
- build-storybook | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
path: workspace | |
- name: Display structure of downloaded files | |
run: ls -R | |
working-directory: workspace | |
- name: Install Heroku CLI | |
run: |- | |
if [[ $(command -v heroku) == "" ]]; then | |
curl https://cli-assets.heroku.com/install.sh | sh | |
else | |
echo "Heroku is already installed. No operation was performed." | |
fi | |
- name: Install Heroku Build CLI plugin | |
run: heroku plugins:install heroku-builds | |
- name: Deploy to Heroku | |
run: |- | |
HEROKU_APP_NAME=${{ needs.prepare.outputs.HEROKU_APP_NAME }} | |
HEROKU_RELEASE_STORYBOOK_APP_NAME=${{ needs.prepare.outputs.HEROKU_RELEASE_STORYBOOK_APP_NAME }} | |
export PR_NUMBER=${{ github.event.pull_request.number }} | |
export REVIEW_APP_NAME=slds-storybook-pr-${PR_NUMBER} | |
echo $HEROKU_APP_NAME | |
echo $HEROKU_RELEASE_STORYBOOK_APP_NAME | |
echo $PR_NUMBER | |
echo REVIEW_APP_NAME | |
if [[ ${HEROKU_RELEASE_STORYBOOK_APP_NAME} != "false" && ${PR_NUMBER} == "" ]]; then | |
export PUBLISH_STORYBOOK_TO=${HEROKU_RELEASE_STORYBOOK_APP_NAME} | |
else | |
export PUBLISH_STORYBOOK_TO=${REVIEW_APP_NAME} | |
fi | |
echo "==============================" | |
echo ${PUBLISH_STORYBOOK_TO} | |
echo "==============================" | |
heroku buildpacks -a ${PUBLISH_STORYBOOK_TO} | grep "https://github.com/salesforce-ux/heroku-buildpack-nginx.git#dse" || heroku buildpacks:set https://github.com/salesforce-ux/heroku-buildpack-nginx.git#dse -a ${PUBLISH_STORYBOOK_TO} | |
heroku builds:create --source-tar workspace/artifact/storybook.tar.gz -a ${PUBLISH_STORYBOOK_TO} | |
- uses: tibdex/github-app-token@v1 | |
id: get_installation_token | |
with: | |
app_id: 244972 | |
private_key: ${{ secrets.DSE_CI_APP_KEY }} | |
- name: Set Github deployments to "success" | |
env: | |
GITHUB_TOKEN: ${{ steps.get_installation_token.outputs.token }} | |
run: |- | |
for row in $(jq -r '.[] | select(.url | contains("storybook")) | @base64' workspace/artifact/gh-deployments.json); do | |
export STATUS_URL=$(echo ${row} | base64 --decode | jq -r ".status" | sed 's/https:\/\/api.github.com//') | |
export SITE_URL=$(echo ${row} | base64 --decode | jq -r ".url") | |
gh api ${STATUS_URL} -f state=success -f environment_url=${SITE_URL} -H "Accept: application/vnd.github.ant-man-preview+json" | |
done | |
framework-build: | |
# if: ${{ (1 < 0) }} | |
runs-on: ubuntu-latest | |
needs: | |
- prepare | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/setup-node@v3 | |
with: | |
cache: 'npm' | |
node-version: '<=18.17.1' | |
- uses: actions/download-artifact@v3 | |
with: | |
path: workspace | |
- name: Display structure of downloaded files | |
run: ls -R | |
working-directory: workspace | |
- uses: "./.github/actions/copy-tokens-from-workspace" | |
- name: Decompress styles | |
run: tar -xvf workspace/artifact/styles.tar | |
- name: Decompress metadata | |
run: tar -xvf workspace/artifact/metadata.tar | |
- run: npm ci | |
- name: Do build-dist | |
run: npm run build-dist | |
- name: Compress .dist | |
run: |- | |
tar -cvf workspace/design-system-dist.tar .dist/ | |
cd .dist && zip -r dist . && mv dist.zip ../workspace/ && cd .. | |
- uses: actions/upload-artifact@v3 | |
with: | |
path: |- | |
workspace/design-system-dist.tar | |
workspace/dist.zip | |
publish-site: | |
runs-on: ubuntu-latest | |
needs: | |
- framework-build | |
steps: | |
- uses: tibdex/github-app-token@v1 | |
id: get_installation_token | |
with: | |
app_id: 244972 | |
private_key: ${{ secrets.DSE_CI_APP_KEY }} | |
- name: Checkout design-system-site | |
uses: actions/checkout@v3 | |
with: | |
repository: salesforce-ux/design-system-site | |
ref: main | |
token: ${{ steps.get_installation_token.outputs.token }} | |
- name: Display structure of downloaded files | |
run: ls -la | |
- uses: actions/download-artifact@v3 | |
with: | |
path: workspace | |
- name: Display structure of downloaded files | |
run: ls -R | |
working-directory: workspace | |
- name: Decompress SLDS .dist | |
run: |- | |
mkdir -p .slds | |
tar -xvf workspace/artifact/design-system-dist.tar --directory .slds | |
- uses: actions/setup-node@v3 | |
with: | |
cache: 'npm' | |
- run: npm ci | |
- shell: bash | |
run: |- | |
if [[ $(command -v heroku) == "" ]]; then | |
curl https://cli-assets.heroku.com/install.sh | sh | |
else | |
echo "Heroku is already installed. No operation was performed." | |
fi | |
- name: Install Heroku Build CLI plugin | |
run: heroku plugins:install heroku-builds | |
- name: Build static site | |
run: npm run build | |
env: | |
SLDS__FRAMEWORK__PATH: ".slds/.dist/" | |
NODE_OPTIONS: --openssl-legacy-provider # per https://candid.technology/error-error-0308010c-digital-envelope-routines-unsupported/ | |
- name: Display structure of downloaded files | |
run: ls -la | |
- name: Generate site tarball | |
run: tar -czvf site-next.tar.gz .www/ Procfile config/nginx.conf.erb heroku-start.sh app.json | |
- name: Deploy to Heroku app | |
run: |- | |
export HEROKU_APP_NAME=$(cat workspace/artifact/heroku-app-name.txt) | |
echo "==============================" | |
echo ${HEROKU_APP_NAME} | |
echo "==============================" | |
heroku buildpacks -a ${HEROKU_APP_NAME} | grep "https://github.com/salesforce-ux/heroku-buildpack-nginx.git#dse" || heroku buildpacks:set https://github.com/salesforce-ux/heroku-buildpack-nginx.git#dse -a ${HEROKU_APP_NAME} | |
heroku builds:create --source-tar site-next.tar.gz -a ${HEROKU_APP_NAME} | |
- name: Set Github deployments to "success" | |
env: | |
GITHUB_TOKEN: ${{ steps.get_installation_token.outputs.token }} | |
run: |- | |
for row in $(jq -r '.[] | select(.url | contains("review-site")) | @base64' workspace/gh-deployments.json); do | |
export STATUS_URL=$(echo ${row} | base64 --decode | jq -r ".status" | sed 's/https:\/\/api.github.com//') | |
export SITE_URL=$(echo ${row} | base64 --decode | jq -r ".url") | |
gh api ${STATUS_URL} -f state=success -f environment_url=${SITE_URL} -H "Accept: application/vnd.github.ant-man-preview+json" | |
done | |
attach-artifact: | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'release' }} | |
needs: | |
- framework-build | |
steps: | |
- uses: tibdex/github-app-token@v1 | |
id: get_installation_token | |
with: | |
app_id: 244972 | |
private_key: ${{ secrets.DSE_CI_APP_KEY }} | |
- uses: actions/checkout@v3 | |
- uses: actions/download-artifact@v3 | |
with: | |
path: workspace | |
- name: 'Github: attach artifact to release' | |
env: | |
DSE_API_RELEASE_TOKEN: ${{ secrets.DSE_API_RELEASE_TOKEN }} | |
VERSION_FROM_TAG: ${{ github.event.release.tag_name }} | |
GITHUB_TOKEN: ${{ steps.get_installation_token.outputs.token }} | |
run: |- | |
gh release view ${VERSION_FROM_TAG} | grep ${VERSION_FROM_TAG} | |
if [ $? -eq 0 ]; then | |
cp workspace/artifact/dist.zip workspace/slds-${VERSION_FROM_TAG}.zip | |
echo "==============================" | |
echo "» Attaching artifact to release ${VERSION_FROM_TAG}" | |
gh release upload ${VERSION_FROM_TAG} workspace/slds-${VERSION_FROM_TAG}.zip#"SLDS ${VERSION_FROM_TAG}" --clobber | |
else | |
echo "==============================" | |
echo "» ERROR: release ${VERSION_FROM_TAG} not found on Github" | |
fi | |
update-database: | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'release' }} | |
needs: | |
- attach-artifact | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Trigger database update via API | |
env: | |
DSE_API_RELEASE_TOKEN: ${{ secrets.DSE_API_RELEASE_TOKEN }} | |
VERSION_FROM_TAG: ${{ github.event.release.tag_name }} | |
run: |- | |
export SALESFORCE_VERSION=$(cat package.json | jq -r .slds.id) | |
curl --location --request PATCH 'https://api.lightningdesignsystem.com/v1/release' \ | |
--header 'Content-Type: application/json' \ | |
--header 'Authorization: Bearer '"$DSE_API_RELEASE_TOKEN"'' \ | |
--data-raw '{ | |
"version":"'"${VERSION_FROM_TAG:1:20}"'", | |
"salesforce_version": "'"$SALESFORCE_VERSION"'" | |
}' | |
slack-broadcast: | |
runs-on: ubuntu-latest | |
if: ${{ github.event_name == 'release' }} | |
needs: | |
- attach-artifact | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 # retrieve git history | |
- name: Get Salesforce and Package Versions | |
id: get-salesforce-versions | |
env: | |
VERSION_FROM_TAG: ${{ github.event.release.tag_name }} | |
run: | | |
SALESFORCE_VERSION=$(cat package.json | jq -r .slds.id) | |
echo "salesforce_version=${SALESFORCE_VERSION}" >> $GITHUB_OUTPUT | |
echo "version_from_tag=${VERSION_FROM_TAG}" >> $GITHUB_OUTPUT | |
- name: Compile slack message | |
id: compile-slack-msg-body | |
uses: actions/github-script@v6 | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
result-encoding: string | |
script: | | |
const releaseVersion = '${{ steps.get-salesforce-versions.outputs.salesforce_version }}'; | |
const versionFromTag = '${{ steps.get-salesforce-versions.outputs.version_from_tag }}'; | |
const [v, semVersion] = versionFromTag.split(/(?<=v)/); | |
const packageURL = `https://www.npmjs.com/package/@salesforce-ux/design-system/${v}/${semVersion}`; | |
const slackBody = `*Salesforce Release*: ${releaseVersion} | *Package Version*: ${versionFromTag} | <${packageURL}| ${packageURL}>` | |
return slackBody; | |
- name: Notify Slack | |
uses: ./.github/actions/send-slack-notifications | |
with: | |
slack-webhook-url: ${{ secrets.SLACK_DESIGN_SYSTEM_BROADCAST_WEBHOOK_URL }} | |
slack-title: 'A new version of *@salesforce-ux/design-system* package :package: was published :rocket:' | |
slack-body: ${{ steps.compile-slack-msg-body.outputs.result }} |