diff --git a/.github/workflows/feature-list.yml b/.github/workflows/feature-list.yml index def6cf73..c1433cea 100644 --- a/.github/workflows/feature-list.yml +++ b/.github/workflows/feature-list.yml @@ -1,89 +1,76 @@ -name: Feature List +name: Feature List Update on: - workflow_dispatch: - inputs: - spreadsheet_uri: - description: 'Link of the spreadsheet containing subscription details.' - type: string - required: true + schedule: + - cron: '0 0 * * *' # Run every night at midnight UTC + workflow_dispatch: jobs: - update-feature-data: + check-and-update-features: runs-on: ubuntu-latest - env: - FEATURES_FILE: 'data/features.json' + env: + FEATURES_FILE: 'data/features.json' steps: - - name: Trigger Feature List workflow and wait for completion + - name: Checkout current repository + uses: actions/checkout@v4 + + - name: Check for updates in source repository + id: check-updates uses: actions/github-script@v6 with: github-token: ${{secrets.GH_ACCESS_TOKEN}} script: | - const result = await github.rest.actions.createWorkflowDispatch({ + const { data: sourceFile } = await github.rest.repos.getContent({ owner: 'layer5labs', repo: 'meshery-extensions-packages', - workflow_id: 'generate-feature-list.yml', - ref: 'master', - inputs: { - spreadsheet_uri: '${{ secrets.INPUT_SPREADSHEET_URI }}' - } + path: 'feature-data.json', + ref: 'master' + }); + + // Store the latest commit SHA + const latestSHA = sourceFile.sha; + + // Try to get the previously stored SHA from cache + const cache = await github.rest.actions.getActionsCacheList({ + owner: context.repo.owner, + repo: context.repo.repo, }); - console.log("Triggered workflow, waiting for completion..."); + let hasUpdates = true; + if (cache.data.actions_caches.length > 0) { + const lastSHA = cache.data.actions_caches[0].key.split('-').pop(); + hasUpdates = lastSHA !== latestSHA; + } - while (true) { - const runs = await github.rest.actions.listWorkflowRuns({ - owner: 'layer5labs', - repo: 'meshery-extensions-packages', - workflow_id: 'generate-feature-list.yml' + if (hasUpdates) { + // Update the cache with new SHA + await github.rest.actions.createActionsCacheEntry({ + owner: context.repo.owner, + repo: context.repo.repo, + key: `feature-data-sha-${latestSHA}`, + ref: context.ref, + cache_data: latestSHA }); - if (runs.data.workflow_runs[0].status === 'completed') { - console.log("Workflow completed"); - break; - } + // Decode and save the content + const content = Buffer.from(sourceFile.content, 'base64').toString('utf-8'); + const fs = require('fs'); + + // Create data directory if it doesn't exist + fs.mkdirSync('data', { recursive: true }); - console.log("Waiting for workflow to complete..."); - await new Promise(resolve => setTimeout(resolve, 30000)); + // Write the new content + fs.writeFileSync('${{ env.FEATURES_FILE }}', content); } - - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Create data directory if it doesn't exist - run: mkdir -p data - - - name: Download new feature data - uses: actions/github-script@v6 - with: - github-token: ${{secrets.GH_ACCESS_TOKEN}} - script: | - const fs = require('fs'); - const path = require('path'); - const { data } = await github.rest.repos.getContent({ - owner: 'layer5labs', - repo: 'meshery-extensions-packages', - path: 'feature-data.json' - }); - - const newContent = Buffer.from(data.content, 'base64').toString('utf-8'); - fs.writeFileSync('${{ env.FEATURES_FILE }}', newContent); - - - name: Update or create features.json - run: | - if [ -f "${{ env.FEATURES_FILE }}" ]; then - echo "Updating existing features.json" - else - echo "Creating new features.json" - cp "${{ env.FEATURES_FILE }}" data/features.json - fi + return hasUpdates; - name: Commit changes + if: steps.check-updates.outputs.result == 'true' uses: stefanzweifel/git-auto-commit-action@v5 with: - commit_message: Updated feature data + commit_message: "Updated feature data from source repository" file_pattern: ${{ env.FEATURES_FILE }} branch: master commit_options: "--signoff" diff --git a/.github/workflows/new-feature-check.yml b/.github/workflows/new-feature-check.yml deleted file mode 100644 index b4660e14..00000000 --- a/.github/workflows/new-feature-check.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Nightly Google Sheet Check - -on: - schedule: - - cron: '0 0 * * *' # Run every day at midnight UTC - -jobs: - check-for-updates: - runs-on: ubuntu-latest - steps: - - name: Check for Google Sheet updates - id: sheet-check - uses: actions/github-script@v6 - with: - github-token: ${{secrets.GH_ACCESS_TOKEN}} - script: | - const { GoogleSpreadsheet } = require('google-spreadsheet'); - - async function checkForUpdates() { - const doc = new GoogleSpreadsheet('${{ secrets.INPUT_SPREADSHEET_URI }}'); - await doc.useServiceAccountAuth({ - client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL, - private_key: process.env.GOOGLE_PRIVATE_KEY, - }); - - await doc.loadInfo(); - const sheet = doc.sheetsByIndex[0]; - const lastModified = sheet.lastModified; - - const cache = await github.rest.actions.getActionsCacheList({ - owner: context.repo.owner, - repo: context.repo.repo, - }); - - let lastKnownModified = null; - if (cache.data.actions_caches.length > 0) { - lastKnownModified = new Date(cache.data.actions_caches[0].last_accessed_at); - } - - if (!lastKnownModified || lastModified > lastKnownModified) { - await github.rest.actions.createActionsCacheEntry({ - owner: context.repo.owner, - repo: context.repo.repo, - key: 'last-modified-time', - ref: context.ref, - cache_data: lastModified.toISOString(), - }); - return true; - } - - return false; - } - - const hasUpdates = await checkForUpdates(); - core.setOutput('has-updates', hasUpdates); - - - name: Trigger Subscriptions Plan workflow - if: steps.sheet-check.outputs.has-updates == 'true' - uses: actions/github-script@v6 - with: - github-token: ${{secrets.GH_ACCESS_TOKEN}} - script: | - github.rest.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'feature-list.yml', - ref: 'main', - inputs: { - spreadsheet_uri: '${{ secrets.INPUT_SPREADSHEET_URI }}' - } - }); \ No newline at end of file