Skip to content

mkesavan13 is running Deploy CD #113

mkesavan13 is running Deploy CD

mkesavan13 is running Deploy CD #113

Workflow file for this run

name: Deploy CD
run-name: ${{ github.actor }} is running Deploy CD
on:
push:
branches: # Allow list of deployable tags and branches. Note that all allow-listed branches cannot include any `/` characters
- next
env:
rid: ${{ github.run_id }}-${{ github.run_number }}
token: ${{ secrets.NPM_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GIT_AUTHOR_NAME: ${{ github.actor }}
GIT_AUTHOR_EMAIL: ${{ github.actor }}@users.noreply.github.com
HUSKY: 0
jobs:
analyze-changes:
name: Determine Changed Packages
runs-on: ubuntu-latest
outputs:
node-changed: ${{ steps.generate-package-matrix-node-changed.outputs.node-changed }}
node-recursive: ${{ steps.generate-package-matrix-node-recursive.outputs.node-recursive }}
yarn-changed: ${{ steps.generate-package-matrix-yarn-changed.outputs.yarn-changed }}
yarn-recursive: ${{ steps.generate-package-matrix-yarn-recursive.outputs.yarn-recursive }}
steps:
- name: Checkout Project
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch all history for package comparison
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
registry-url: "https://registry.npmjs.org"
cache: "yarn"
- name: Install Dependencies
uses: actions/cache@v4
id: cache-dependencies
with:
path: "**/node_modules"
key: node-modules-${{ hashFiles('./yarn.lock') }}
- name: Install if cache miss
if: steps.cache-dependencies.outputs.cache-hit != 'true'
run: yarn install --immutable
# Generate package matrix for changed packages
- id: generate-package-matrix-node-changed
name: Generate Package Matrix (Node Changed)
run: echo "node-changed=$(yarn package-tools list --mode node --since ${{ github.event.before }})" >> $GITHUB_OUTPUT
- id: generate-package-matrix-node-recursive
name: Generate Package Matrix (Node Recursive)
run: echo "node-recursive=$(yarn package-tools list --mode node --recursive --since ${{ github.event.before }})" >> $GITHUB_OUTPUT
- id: generate-package-matrix-yarn-changed
name: Generate Package Matrix (Yarn Changed)
run: echo "yarn-changed=$(yarn package-tools list --since ${{ github.event.before }})" >> $GITHUB_OUTPUT
- id: generate-package-matrix-yarn-recursive
name: Generate Package Matrix (Yarn Recursive)
run: echo "yarn-recursive=$(yarn package-tools list --recursive --since ${{ github.event.before }})" >> $GITHUB_OUTPUT
- name: Display Package Matrix
run: |
echo "Changed packages (node): ${{ steps.generate-package-matrix-node-changed.outputs.node-changed }}"
echo "Changed packages + dependents (node): ${{ steps.generate-package-matrix-node-recursive.outputs.node-recursive }}"
echo "Changed packages (yarn): ${{ steps.generate-package-matrix-yarn-changed.outputs.yarn-changed }}"
echo "Changed packages + dependents (yarn): ${{ steps.generate-package-matrix-yarn-recursive.outputs.yarn-recursive }}"
publish-npm:
name: Publish to NPM
needs: analyze-changes
runs-on: ubuntu-latest
outputs:
published: ${{ steps.check-changes.outputs.has_changes }}
steps:
- name: Checkout Project
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
registry-url: "https://registry.npmjs.org"
cache: "yarn"
- name: Restore Dependencies Cache
uses: actions/cache/restore@v4
with:
path: "**/node_modules"
key: node-modules-${{ hashFiles('./yarn.lock') }}
- name: Check for Changed Packages
id: check-changes
run: |
PACKAGES='${{ needs.analyze-changes.outputs.yarn-recursive }}'
if [ -z "$PACKAGES" ] || [ "$PACKAGES" == "{}" ] || [ "$PACKAGES" == "[]" ]; then
echo "has_changes=false" >> $GITHUB_OUTPUT
echo "⚠️ No packages have changed - skipping deployment"
else
echo "has_changes=true" >> $GITHUB_OUTPUT
echo "✅ Found changed packages: $PACKAGES"
fi
- name: No Changes Detected
if: steps.check-changes.outputs.has_changes == 'false'
run: |
echo "=========================================="
echo "🔍 No packages changed in this push"
echo "=========================================="
echo "Deployment skipped - no changes detected since last push"
echo "Compared against: ${{ github.event.before }}"
echo "=========================================="
- name: Add NPM token to .yarnrc.yml file
if: steps.check-changes.outputs.has_changes == 'true'
run: |
echo "npmAuthToken: ${{ env.token }}" >> ~/.yarnrc.yml
- name: Sync and Increment Package Versions
if: steps.check-changes.outputs.has_changes == 'true'
run: |
yarn package-tools sync --tag ${GITHUB_REF##*/}
yarn package-tools increment --packages ${{ needs.analyze-changes.outputs.node-recursive }} --tag ${GITHUB_REF##*/}
- name: Build Changed Packages
if: steps.check-changes.outputs.has_changes == 'true'
run: yarn run build:prod
- name: Cache Built Distributables
if: steps.check-changes.outputs.has_changes == 'true'
uses: actions/cache/save@v4
with:
path: "**/dist"
key: dist-${{ env.rid }}
- name: Deploy Packages
if: steps.check-changes.outputs.has_changes == 'true'
run: yarn workspaces foreach -W --from '${{ needs.analyze-changes.outputs.yarn-recursive }}' --verbose run deploy:npm --access public --tag ${GITHUB_REF##*/}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
publish-documentation:
name: Publish - Documentation
needs: [publish-npm,analyze-changes]
runs-on: ubuntu-latest
steps:
- name: Documentation Deploy Steps
run: echo "Documentation Deploy Steps"
- name: Checkout Project
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
registry-url: 'https://registry.npmjs.org'
cache: 'yarn'
- name: Restore Dependencies Cache
uses: actions/cache/restore@v4
with:
path: '**/node_modules'
key: node-modules-${{ hashFiles('./yarn.lock') }}
- name: Restore Distributables Cache
uses: actions/cache/restore@v4
with:
path: '**/dist'
key: dist-${{ env.rid }}
- name: Synchronize Packages
run: yarn
- name: Build tools and set versions
run: |
yarn package-tools sync --tag ${GITHUB_REF##*/}
- name: Build packages
run: yarn run build:prod
- name: Build samples locally
run: yarn samples:build
- name: Set Git Identity
run: |
git config user.email "${GIT_AUTHOR_EMAIL}"
git config user.name "${GIT_AUTHOR_NAME}"
- name: Get existing changelog from documentation Branch
run: |
git fetch origin documentation
git checkout origin/documentation -- docs/changelog/logs
- name: Update changelog
run: yarn package-tools changelog --packages ${{ needs.analyze-changes.outputs.node-recursive }} --tag ${GITHUB_REF##*/} --commit ${{ github.event.before }}
- name: Update Changelog and Publish Docs Folder
run: |
# Check if there's anything to commit before committing
if [ -n "$(git status --porcelain)" ]; then
git add docs/
git commit -m "chore(docs): update docs"
git push origin HEAD:documentation --force
fi
publish-tag:
name: Publish - Tags
runs-on: ubuntu-latest
needs: [analyze-changes, publish-npm]
steps:
- name: Checkout Project
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
registry-url: "https://registry.npmjs.org"
cache: "yarn"
- name: Restore Dependencies Cache
uses: actions/cache/restore@v4
with:
path: "**/node_modules"
key: node-modules-${{ hashFiles('./yarn.lock') }}
- name: Restore Distributables Cache
uses: actions/cache/restore@v4
with:
path: "**/dist"
key: dist-${{ env.rid }}
- name: Synchronize Packages
run: yarn
- name: Check if packages were published
id: check-publish
run: |
if [ "${{ needs.publish-npm.outputs.published }}" != "true" ]; then
echo "⚠️ NPM publish was skipped - no tags will be created"
echo "should_tag=false" >> $GITHUB_OUTPUT
else
echo "✅ NPM publish succeeded - proceeding with tagging"
echo "should_tag=true" >> $GITHUB_OUTPUT
fi
- name: Set Git Identity
if: steps.check-publish.outputs.should_tag == 'true'
run: |
git config user.email "${GIT_AUTHOR_EMAIL}"
git config user.name "${GIT_AUTHOR_NAME}"
- name: Create and Push Tags for Main Packages
if: steps.check-publish.outputs.should_tag == 'true'
run: |
COMMIT_MESSAGE="$(git log -1 --oneline --no-decorate)"
COMMIT_HASH="$(git rev-parse HEAD)"
# node-recursive includes both changed packages AND their dependents
# e.g., if @webex/cc-store changes, @webex/cc-widgets will be in this list if it depends on store
PACKAGES='${{ needs.analyze-changes.outputs.node-recursive }}'
# Define the packages we want to tag (only main/published packages)
TAGGABLE_PACKAGES=("@webex/widgets" "@webex/cc-widgets")
echo "=========================================="
echo "Creating tags for main packages"
echo "=========================================="
# Check if any packages were changed
if [ -z "$PACKAGES" ] || [ "$PACKAGES" == "{}" ] || [ "$PACKAGES" == "[]" ]; then
echo "⚠️ No packages changed - skipping tagging"
exit 0
fi
# Extract package names from JSON array
CHANGED_PACKAGES=$(echo "$PACKAGES" | jq -r '.[]' 2>/dev/null || echo "$PACKAGES")
echo "Packages to evaluate (changed + dependents): $CHANGED_PACKAGES"
echo ""
for TAGGABLE_PKG in "${TAGGABLE_PACKAGES[@]}"; do
echo "----------------------------------------"
echo "Checking if $TAGGABLE_PKG needs to be tagged..."
# Check if this package is in the changed packages list (includes dependents)
FOUND=false
for CHANGED_PKG in $CHANGED_PACKAGES; do
if [ "$CHANGED_PKG" == "$TAGGABLE_PKG" ]; then
FOUND=true
break
fi
done
if [ "$FOUND" == "false" ]; then
echo "⏭️ $TAGGABLE_PKG not in publish list - skipping"
continue
fi
echo "✅ $TAGGABLE_PKG needs to be published - creating tag..."
# Get version for this specific package
VERSION=$(yarn package-tools sync --tag ${GITHUB_REF##*/} --packages "$TAGGABLE_PKG" | awk '{print $3}' | tr -d '%' | head -1)
if [ -z "$VERSION" ]; then
echo "⚠️ Could not determine version for $TAGGABLE_PKG, skipping..."
continue
fi
# Create tag name: convert @scope/package to scope-package-vX.X.X
TAG_NAME=$(echo "$TAGGABLE_PKG" | sed 's/@//g' | sed 's/\//-/g')-v${VERSION}
echo "Tag name: $TAG_NAME"
# Check if tag already exists
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
echo "⚠️ Tag $TAG_NAME already exists, skipping..."
continue
fi
# Create annotated tag
git tag -a "$TAG_NAME" "$COMMIT_HASH" -m "Release $TAGGABLE_PKG v${VERSION}: $COMMIT_MESSAGE"
# Push tag
if git push origin "$TAG_NAME"; then
echo "✅ Successfully created and pushed tag: $TAG_NAME"
else
echo "❌ Failed to push tag: $TAG_NAME"
fi
echo "----------------------------------------"
done
echo "=========================================="
echo "Tagging complete!"
echo "=========================================="