Update Code for the Architecture Diagram (#257) #70
This file contains hidden or 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
| # | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| # | |
| name: Deploy Ecosystem Projects to Vercel | |
| on: | |
| push: | |
| branches: | |
| - master | |
| - development | |
| paths: | |
| - 'ecosystem/**' | |
| - '.github/workflows/deploy-ecosystem.yml' | |
| - '.github/deploy-ecosystem-configs.json' | |
| workflow_dispatch: | |
| inputs: | |
| project_name: | |
| description: 'Specific project to deploy (leave empty to deploy all changed projects)' | |
| required: false | |
| type: string | |
| force_deploy_all: | |
| description: 'Force deploy all projects regardless of changes' | |
| required: false | |
| type: boolean | |
| default: false | |
| jobs: | |
| determine-projects: | |
| name: Determine Projects to Deploy | |
| runs-on: ubuntu-latest | |
| container: | |
| image: node:20-bookworm-slim | |
| outputs: | |
| projects: ${{ steps.filter.outputs.projects }} | |
| projects_json: ${{ steps.filter.outputs.projects_json }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Read deployment config | |
| id: config | |
| shell: bash | |
| run: | | |
| # Read JSON config file and output as multiline string | |
| echo "config_json<<EOF" >> "$GITHUB_OUTPUT" | |
| cat .github/deploy-ecosystem-configs.json >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| - name: Filter projects based on inputs | |
| id: filter | |
| shell: bash | |
| run: | | |
| # Use Node.js to parse JSON (already available in container) | |
| node << 'EOF' | |
| const fs = require('fs'); | |
| const configJson = `${{ steps.config.outputs.config_json }}`; | |
| const config = JSON.parse(configJson); | |
| const eventName = '${{ github.event_name }}'; | |
| const projectName = '${{ inputs.project_name }}'; | |
| const forceDeployAll = '${{ inputs.force_deploy_all }}' === 'true'; | |
| let projectsToDeploy = []; | |
| // Filter out projects with skip: true | |
| const availableProjects = config.projects.filter(p => !p.skip); | |
| // Manual trigger: deploy specific project or all | |
| if (eventName === 'workflow_dispatch') { | |
| if (projectName) { | |
| const project = availableProjects.find(p => p.name === projectName); | |
| if (project) { | |
| projectsToDeploy = [project]; | |
| } else { | |
| projectsToDeploy = availableProjects; | |
| } | |
| } else if (forceDeployAll) { | |
| projectsToDeploy = availableProjects; | |
| } else { | |
| projectsToDeploy = availableProjects; | |
| } | |
| } else { | |
| // For push events, deploy all available projects (excluding skipped ones) | |
| projectsToDeploy = availableProjects; | |
| } | |
| // Output results | |
| const outputFile = process.env.GITHUB_OUTPUT; | |
| const projectsJson = JSON.stringify(projectsToDeploy); | |
| const projectsNames = JSON.stringify(projectsToDeploy.map(p => p.name)); | |
| fs.appendFileSync(outputFile, `projects_json<<EOF\n${projectsJson}\nEOF\n`); | |
| fs.appendFileSync(outputFile, `projects=${projectsNames}\n`); | |
| EOF | |
| - name: Show projects to deploy | |
| run: | | |
| echo "Projects to deploy: ${{ steps.filter.outputs.projects }}" | |
| PROJECTS="${{ steps.filter.outputs.projects }}" | |
| if [ "$PROJECTS" = "[]" ]; then | |
| echo "No projects to deploy" | |
| fi | |
| deploy: | |
| name: Deploy ${{ matrix.project.name }} | |
| needs: determine-projects | |
| if: needs.determine-projects.outputs.projects != '[]' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| project: ${{ fromJson(needs.determine-projects.outputs.projects_json) }} | |
| steps: | |
| - name: Check Vercel token | |
| id: vercel_token | |
| shell: bash | |
| env: | |
| VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} | |
| run: | | |
| if [ -n "$VERCEL_TOKEN" ]; then | |
| echo "enabled=true" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "enabled=false" >> "$GITHUB_OUTPUT" | |
| echo "Vercel deploy skipped: missing VERCEL_TOKEN secret." >> "$GITHUB_STEP_SUMMARY" | |
| fi | |
| - name: Checkout repository | |
| if: steps.vercel_token.outputs.enabled == 'true' | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| if: steps.vercel_token.outputs.enabled == 'true' | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Install Vercel CLI | |
| if: steps.vercel_token.outputs.enabled == 'true' | |
| run: npm install --global vercel@latest | |
| - name: Configure Git for Vercel | |
| if: steps.vercel_token.outputs.enabled == 'true' | |
| working-directory: ${{ matrix.project.path }} | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "support@resilientdb.com" | |
| - name: Pull Vercel Environment Information | |
| if: steps.vercel_token.outputs.enabled == 'true' | |
| working-directory: ${{ matrix.project.path }} | |
| env: | |
| VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} | |
| VERCEL_ORG_ID: ${{ matrix.project.vercel_org_id || secrets.VERCEL_ORG_ID }} | |
| VERCEL_PROJECT_ID: ${{ matrix.project.vercel_project_id }} | |
| run: | | |
| if [ -n "$VERCEL_PROJECT_ID" ] && [ -n "$VERCEL_ORG_ID" ]; then | |
| mkdir -p .vercel | |
| echo "$VERCEL_ORG_ID" > .vercel/org-id | |
| echo "$VERCEL_PROJECT_ID" > .vercel/project-id | |
| fi | |
| vercel pull --yes --environment=production --token=$VERCEL_TOKEN || echo "Could not pull Vercel config, continuing..." | |
| - name: Create deployment commit with correct author | |
| if: steps.vercel_token.outputs.enabled == 'true' | |
| run: | | |
| # Configure git user | |
| git config user.name "github-actions[bot]" | |
| git config user.email "support@resilientdb.com" | |
| # Create an empty commit with correct author for Vercel to see | |
| git commit --allow-empty -m "ci: authorize deploy for ${{ matrix.project.name }}" || echo "Skipping commit creation" | |
| - name: Deploy to Vercel | |
| if: steps.vercel_token.outputs.enabled == 'true' | |
| working-directory: ${{ matrix.project.path }} | |
| env: | |
| VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} | |
| run: vercel deploy --prod --yes --token=$VERCEL_TOKEN | |
| - name: Deployment Summary | |
| if: always() | |
| run: | | |
| echo "### Deployment: ${{ matrix.project.name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Path:** ${{ matrix.project.path }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Status:** ${{ job.status }}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY |