Upstream js #786
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: Upstream js | |
on: | |
schedule: | |
- cron: '0 */3 * * *' # “At minute 0 past every 3rd hour.” | |
workflow_dispatch: | |
inputs: | |
tag_version: | |
description: image tag | |
type: choice | |
required: true | |
options: | |
- alpha | |
- latest | |
default: alpha | |
jobs: | |
upstream: | |
runs-on: ubuntu-latest | |
outputs: | |
hasAtLeastOneNewVersion: ${{ steps.fetchLatestPkg.outputs.hasAtLeastOneNewVersion }} | |
hasNewVersionAvailableJS: ${{ steps.fetchLatestPkg.outputs.hasVersionNewJS }} | |
latestVersionAvailableJS: ${{ steps.fetchLatestPkg.outputs.latestVersionJS }} | |
hasAtLeastOneNewVersionWithoutPR: ${{ steps.checkPrAlreadyExist.outputs.hasAtLeastOneNewVersionWithoutPR }} | |
steps: | |
- id: checkoutRepo | |
name: Checkout repository | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 1 | |
- id: fetchLatestPkg | |
name: Fetch the latest package version | |
uses: actions/github-script@v6 | |
env: | |
TAG_VERSION: ${{ inputs.tag_version }} | |
with: | |
github-token: ${{ secrets.PAT_WRITE_PKG }} | |
script: | | |
const tagVersion = process.env.TAG_VERSION; | |
console.log('tagVersion:',tagVersion); | |
const getLatestVersionOf = require('./scripts/github/update/latest-version-of.js'); | |
const { hasVersionNew: hasVersionNewJS, latestVersion: latestVersionJS } = await getLatestVersionOf({github, context, dependencyName: 'js-api', tagVersion}); | |
console.log('hasVersionNewJS', hasVersionNewJS) | |
console.log('latestVersionJS', latestVersionJS) | |
if (hasVersionNewJS === 'true' ) { | |
core.setOutput('hasAtLeastOneNewVersion', 'true'); | |
core.setOutput('hasVersionNewJS', 'true'); | |
core.setOutput('latestVersionJS', latestVersionJS); | |
} else { | |
core.setOutput('hasAtLeastOneNewVersion', 'false'); | |
console.log('No new version available, skipping upstream!') | |
} | |
- name: Check value after | |
run: | | |
echo "The value hasAtLeastOneNewVersion is: ${{ steps.fetchLatestPkg.outputs.hasAtLeastOneNewVersion }}" | |
echo "The value hasVersionNewJS is: ${{ steps.fetchLatestPkg.outputs.hasVersionNewJS }}" | |
echo "The value latestVersionJS is: ${{ steps.fetchLatestPkg.outputs.latestVersionJS }}" | |
- id: checkPrAlreadyExist | |
name: Check PR with latest already exist | |
if: ${{ steps.fetchLatestPkg.outputs.hasAtLeastOneNewVersion == 'true' }} | |
uses: actions/github-script@v6 | |
env: | |
HAS_NEW_JS_VERSION: ${{ steps.fetchLatestPkg.outputs.hasVersionNewJS }} | |
LATEST_JS_VERSION: ${{ steps.fetchLatestPkg.outputs.latestVersionJS }} | |
with: | |
github-token: ${{ secrets.BOT_GITHUB_TOKEN }} | |
script: | | |
const hasVersionNewJS = process.env.HAS_NEW_JS_VERSION; | |
const latestVersionJS = process.env.LATEST_JS_VERSION; | |
const checkPRAlreadyExist = require('./scripts/github/update/check-pr-already-exist.js'); | |
let isPRWithLatestJSAlreadyAvailable = false; | |
if (hasVersionNewJS === 'true') { | |
isPRWithLatestJSAlreadyAvailable = await checkPRAlreadyExist({github, context, version: latestVersionJS}); | |
console.log('isPRWithLatestJSAlreadyAvailable', isPRWithLatestJSAlreadyAvailable); | |
} | |
if (isPRWithLatestJSAlreadyAvailable) { | |
console.log('Warning: Upstream PR already exist, stop the migration execution!'); | |
core.setOutput('hasAtLeastOneNewVersionWithoutPR', 'false'); | |
} else { | |
core.setOutput('hasAtLeastOneNewVersionWithoutPR', 'true'); | |
} | |
migrate: | |
if: ${{ needs.upstream.outputs.hasAtLeastOneNewVersionWithoutPR == 'true' }} | |
runs-on: ubuntu-latest | |
needs: upstream | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
with: | |
token: ${{ secrets.BOT_GITHUB_TOKEN }} | |
fetch-depth: 1 | |
- name: setup NPM | |
uses: actions/setup-node@v3 | |
with: | |
node-version-file: '.nvmrc' | |
cache-dependency-path: package-lock.json | |
- name: "General :: dbpci-install" | |
run: | | |
npm ci --ignore-scripts | |
- name: Migration | |
shell: bash | |
env: | |
IS_JS_AFFECTED: ${{ needs.upstream.outputs.hasNewVersionAvailableJS }} | |
PACKAGE_VERSION_JS: ${{ needs.upstream.outputs.latestVersionAvailableJS }} | |
BRANCH_TO_CREATE: "upstream-dependencies" | |
run: | | |
migrateDependenciesJS() { | |
echo "Update JS dependencies to: ${PACKAGE_VERSION_JS}" | |
echo "Calling migration JS" | |
npx nx migrate @alfresco/js-api@${PACKAGE_VERSION_JS} | |
echo "Migration JS done" | |
} | |
migrateLibDependenciesJS() { | |
eval projects=( "cli" | |
"core" | |
"content-services" | |
"process-services" | |
"process-services-cloud" | |
"insights" | |
"testing" | |
"extensions" ) | |
projectslength=${#projects[@]} | |
for (( i=0; i<${projectslength}; i++ )); | |
do | |
echo "Update JS dependencies in adf-${projects[$i]} to: ${PACKAGE_VERSION_JS}" | |
DESTDIR="lib/${projects[$i]}" | |
sed -i "${sedi[@]}" "s/\"@alfresco\/js-api\": \".*\"/\"@alfresco\/js-api\": \">=${PACKAGE_VERSION_JS}\"/g" ${DESTDIR}/package.json | |
done | |
} | |
regeneratePackageLock() { | |
echo "Regenerate lock" | |
npm i --package-lock-only | |
echo "Package-lock done." | |
} | |
if git checkout ${BRANCH_TO_CREATE} 2>/dev/null ; then | |
git reset --hard origin/develop | |
echo "Reset branch" | |
fi | |
if [[ "$IS_JS_AFFECTED" == "true" ]]; then | |
migrateDependenciesJS | |
migrateLibDependenciesJS | |
fi | |
regeneratePackageLock | |
- name: Commit Code | |
if: ${{ needs.upstream.outputs.hasAtLeastOneNewVersion == 'true' }} | |
uses: stefanzweifel/git-auto-commit-action@v4 | |
with: | |
commit_message: "[ci:force][auto-commit] Update dependencies JS:${{ needs.upstream.outputs.latestVersionAvailableJS }}" | |
branch: upstream-dependencies | |
push_options: '--force' | |
create_branch: true | |
- name: Create a Pull request | |
uses: actions/github-script@v6 | |
env: | |
PACKAGE_VERSION_JS: ${{ needs.upstream.outputs.latestVersionAvailableJS }} | |
with: | |
github-token: ${{ secrets.BOT_GITHUB_TOKEN }} | |
script: | | |
const { PACKAGE_VERSION_JS } = process.env | |
const BRANCH_TO_CREATE = 'upstream-dependencies'; | |
const { data: prs } = await github.rest.pulls.list({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
state: 'open', | |
head: `${context.repo.owner}:${BRANCH_TO_CREATE}`, | |
base: 'develop' | |
}); | |
if (prs.length < 1) { | |
const payloadPullRequest = { | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
title: `GH Auto: Upstream dependencies JS-API:${PACKAGE_VERSION_JS}`, | |
head: `${context.repo.owner}:${BRANCH_TO_CREATE}`, | |
base: 'develop', | |
body: `Automatic PR` | |
}; | |
console.log('Payload: ',payloadPullRequest); | |
const { data: pr } = await github.rest.pulls.create(payloadPullRequest); | |
return pr.number; | |
} else { | |
const upstreamPrOpen = prs[0]; | |
// override the title to contains the latest js dep number | |
const payloadUpdatePullRequest = { | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
pull_number: upstreamPrOpen.number, | |
title: `GH Auto: Upstream dependencies JS-API:${PACKAGE_VERSION_JS}`, | |
}; | |
await github.rest.pulls.update(payloadUpdatePullRequest); | |
return upstreamPrOpen.number; | |
} | |
console.log(`Trigger a dispatch event for the monorepo`); |