diff --git a/.github/workflows/preview-build.yml b/.github/workflows/preview-build.yml index 8fdc455c0..15c73c8d3 100644 --- a/.github/workflows/preview-build.yml +++ b/.github/workflows/preview-build.yml @@ -55,18 +55,24 @@ on: required: false permissions: - id-token: write - deployments: write contents: read + deployments: write + id-token: write pull-requests: write + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.head.ref || github.ref }} + cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }} jobs: match: if: github.event.repository.fork == false # Skip running the job on the fork itself (It still runs on PRs on the upstream from forks) - concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.head.ref || github.ref }} - cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }} runs-on: ubuntu-latest + permissions: + contents: none + deployments: none + pull-requests: none + id-token: none outputs: content-source-match: ${{ steps.event-check.outputs.content-source-match != '' && steps.event-check.outputs.content-source-match || steps.match.outputs.content-source-match }} content-source-next: ${{ steps.event-check.outputs.content-source-next != '' && steps.event-check.outputs.content-source-next || steps.match.outputs.content-source-next }} @@ -99,45 +105,69 @@ jobs: echo "ref=${{ github.ref_name }}" echo "repo=${{ github.repository }}" - build: - if: github.event.repository.fork == false # Skip running the job on the fork itself (It still runs on PRs on the upstream from forks) - concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.head.ref || github.ref }} - cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }} + check: runs-on: ubuntu-latest - env: - GITHUB_PR_REF_NAME: ${{ github.event.pull_request.head.ref }} - MATCH: ${{ needs.match.outputs.content-source-match }} - needs: [ match ] + needs: + - match + permissions: + contents: read + deployments: none + id-token: none + pull-requests: read + outputs: + any_modified: ${{ steps.check-files.outputs.any_modified }} + all_changed_files: ${{ steps.check-files.outputs.all_changed_files }} steps: - - name: Checkout - if: env.MATCH == 'true' && (contains(fromJSON('["push", "merge_group", "workflow_dispatch"]'), github.event_name)) + if: contains(fromJSON('["push", "merge_group", "workflow_dispatch"]'), github.event_name) uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha || github.ref }} - name: Get changed files - if: env.MATCH == 'true' && (contains(fromJSON('["merge_group", "pull_request", "pull_request_target"]'), github.event_name)) + if: contains(fromJSON('["merge_group", "pull_request", "pull_request_target"]'), github.event_name) id: check-files uses: tj-actions/changed-files@2f7c5bfce28377bc069a65ba478de0a74aa0ca32 # v46.0.1 with: files: ${{ inputs.path-pattern != '' && inputs.path-pattern || '**' }} - files_ignore: ${{ inputs.path-pattern-ignore != '' && inputs.path-pattern-ignore || '' }} - + files_ignore: | + ${{ inputs.path-pattern-ignore != '' && inputs.path-pattern-ignore || '' }} + .github/** + README.md + + build: + if: github.event.repository.fork == false # Skip running the job on the fork itself (It still runs on PRs on the upstream from forks) + runs-on: ubuntu-latest + permissions: + contents: read + deployments: write + id-token: write + pull-requests: none + outputs: + deployment_result: ${{ steps.deployment.outputs.result }} + env: + GITHUB_PR_REF_NAME: ${{ github.event.pull_request.head.ref }} + MATCH: ${{ needs.match.outputs.content-source-match }} + needs: + - check + - match + steps: - name: Checkout - if: env.MATCH == 'true' && (startsWith(github.event_name, 'pull_request') && steps.check-files.outputs.any_modified == 'true') + if: > + env.MATCH == 'true' + && needs.check.outputs.any_modified == 'true' uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha || github.ref }} persist-credentials: false - name: Create Deployment - if: | - env.MATCH == 'true' && - (contains(fromJSON('["push", "workflow_dispatch"]'), github.event_name) - || (steps.check-files.outputs.any_modified == 'true' && startsWith(github.event_name, 'pull_request')) - ) + if: > + env.MATCH == 'true' + && ( + contains(fromJSON('["push", "workflow_dispatch"]'), github.event_name) + || (needs.check.outputs.any_modified == 'true' && startsWith(github.event_name, 'pull_request')) + ) uses: actions/github-script@v7 id: deployment env: @@ -170,7 +200,9 @@ jobs: return deployment.data.id - name: Generate env.PATH_PREFIX - if: env.MATCH == 'true' && (steps.deployment.outputs.result) + if: > + env.MATCH == 'true' + && steps.deployment.outputs.result env: PR_NUMBER: ${{ github.event.pull_request.number }} GITHUB_REF_NAME: ${{ github.ref_name }} @@ -189,22 +221,35 @@ jobs: esac - name: Bootstrap Action Workspace - if: env.MATCH == 'true' && (github.repository == 'elastic/docs-builder' && steps.deployment.outputs.result) + if: > + env.MATCH == 'true' + && github.repository == 'elastic/docs-builder' + && steps.deployment.outputs.result uses: elastic/docs-builder/.github/actions/bootstrap@main # we run our artifact directly, please use the prebuild # elastic/docs-builder@main GitHub Action for all other repositories! - name: Build documentation - if: env.MATCH == 'true' && (github.repository == 'elastic/docs-builder' && steps.deployment.outputs.result) + if: > + env.MATCH == 'true' + && github.repository == 'elastic/docs-builder' + && steps.deployment.outputs.result run: | dotnet run --project src/tooling/docs-builder -- --strict --path-prefix "${PATH_PREFIX}" - name: Build documentation - if: | - env.MATCH == 'true' && - (github.repository != 'elastic/docs-builder' && - (steps.deployment.outputs.result || (steps.check-files.outputs.any_modified == 'true' && github.event_name == 'merge_group')) + if: > + env.MATCH == 'true' + && ( + github.repository != 'elastic/docs-builder' + && ( + steps.deployment.outputs.result + || ( + needs.check.outputs.any_modified == 'true' + && github.event_name == 'merge_group' + ) ) + ) uses: elastic/docs-builder@main id: docs-build continue-on-error: ${{ fromJSON(inputs.continue-on-error != '' && inputs.continue-on-error || 'false') }} @@ -214,41 +259,109 @@ jobs: metadata-only: ${{ fromJSON(inputs.metadata-only != '' && inputs.metadata-only || 'false') }} - name: 'Validate inbound links' - if: | - env.MATCH == 'true' && - (!cancelled() && steps.docs-build.outputs.skip != 'true' - && (steps.deployment.outputs.result || (steps.check-files.outputs.any_modified == 'true' && github.event_name == 'merge_group')) + if: > + env.MATCH == 'true' + && ( + !cancelled() + && steps.docs-build.outputs.skip != 'true' + && ( + steps.deployment.outputs.result + || ( + needs.check.outputs.any_modified == 'true' + && github.event_name == 'merge_group' + ) + ) ) uses: elastic/docs-builder/actions/validate-inbound-local@main - name: 'Validate local path prefixes against those claimed by global navigation.yml' - if: | - env.MATCH == 'true' && - (!cancelled() && steps.docs-build.outputs.skip != 'true' && - (steps.deployment.outputs.result || (steps.check-files.outputs.any_modified == 'true' && github.event_name == 'merge_group')) + if: > + env.MATCH == 'true' + && ( + !cancelled() + && steps.docs-build.outputs.skip != 'true' + && ( + steps.deployment.outputs.result + || ( + needs.check.outputs.any_modified == 'true' + && github.event_name == 'merge_group' + ) + ) ) uses: elastic/docs-builder/actions/validate-path-prefixes-local@main - uses: elastic/docs-builder/.github/actions/aws-auth@main - if: ${{ !cancelled() && steps.docs-build.outputs.skip != 'true' && steps.deployment.outputs.result }} - + if: > + !cancelled() + && steps.docs-build.outputs.skip != 'true' + && steps.deployment.outputs.result - name: Upload to S3 id: s3-upload - if: | - env.MATCH == 'true' && - (!cancelled() && steps.docs-build.outputs.skip != 'true' && steps.deployment.outputs.result) + if: > + env.MATCH == 'true' + && !cancelled() + && steps.docs-build.outputs.skip != 'true' + && steps.deployment.outputs.result run: | aws s3 sync .artifacts/docs/html "s3://elastic-docs-v3-website-preview${PATH_PREFIX}" --delete --no-follow-symlinks aws cloudfront create-invalidation \ --distribution-id EKT7LT5PM8RKS \ --paths "${PATH_PREFIX}" "${PATH_PREFIX}/*" - + + - name: Update Link Index + if: > + env.MATCH == 'true' + && ( + contains(fromJSON('["push", "workflow_dispatch"]'), github.event_name) + && ( + needs.match.outputs.content-source-current == 'true' + || needs.match.outputs.content-source-next == 'true' + || needs.match.outputs.content-source-speculative == 'true' + ) + && steps.s3-upload.outcome == 'success' + ) + uses: elastic/docs-builder/actions/update-link-index@main + + - name: Update deployment status + uses: actions/github-script@v7 + if: > + env.MATCH == 'true' + && always() + && steps.deployment.outputs.result + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + LANDING_PAGE_PATH: ${{ steps.docs-build.outputs.landing-page-path || env.PATH_PREFIX }} + with: + script: | + await github.rest.repos.createDeploymentStatus({ + owner: context.repo.owner, + repo: context.repo.repo, + deployment_id: ${{ steps.deployment.outputs.result }}, + state: "${{ steps.docs-build.outputs.skip == 'true' && 'inactive' || (steps.s3-upload.outcome == 'success' && 'success' || 'failure') }}", + environment_url: `https://docs-v3-preview.elastic.dev${process.env.LANDING_PAGE_PATH}`, + log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, + }) + comment: + if: > + startsWith(github.event_name, 'pull_request') + && inputs.disable-comments != 'true' + && needs.build.outputs.deployment_result + && needs.check.outputs.any_modified + runs-on: ubuntu-latest + needs: + - check + - build + permissions: + contents: none + deployments: none + id-token: none + pull-requests: write + steps: - name: Comment on PR continue-on-error: true - if: startsWith(github.event_name, 'pull_request') && inputs.disable-comments != 'true' && env.MATCH == 'true' && steps.deployment.outputs.result && steps.check-files.outputs.all_changed_files uses: actions/github-script@v7 env: - ALL_CHANGED_FILES: ${{ steps.check-files.outputs.all_changed_files }} + ALL_CHANGED_FILES: ${{ needs.check.outputs.all_changed_files }} with: script: | const title = '## 🔍 Preview links for changed docs' @@ -256,11 +369,11 @@ jobs: .split(/\s+/) .filter(i => i.endsWith('.md')) .filter(i => !i.includes('/_snippets/')); - + if (changedMdFiles.length === 0) { return; } - + const toLink = (file) => { const path = file .replace('docs/', '') @@ -268,14 +381,14 @@ jobs: .replace('.md', ''); return `[${file}](https://docs-v3-preview.elastic.dev${process.env.PATH_PREFIX}/${path})`; } - + const links = changedMdFiles.map(toLink) - + const body = [ title, ...links.slice(0, 10).map(i => `- ${i}`), ] - + if (links.length > 10) { body.push('
'); body.push('More links …'); @@ -286,16 +399,16 @@ jobs: body.push(''); body.push('
'); } - + if (links.length > 100) { body.push(''); body.push(`In total, ${links.length} files changed.`); } - + const owner = context.repo.owner; const repo = context.repo.repo; const issue_number = context.payload.pull_request.number; - + // Post or update a single bot comment const { data: comments } = await github.rest.issues.listComments({ owner, repo, issue_number @@ -317,32 +430,3 @@ jobs: body:body.join('\n'), }); } - - - name: Update Link Index - if: | - env.MATCH == 'true' && - (contains(fromJSON('["push", "workflow_dispatch"]'), github.event_name) - && ( - needs.match.outputs.content-source-current == 'true' - || needs.match.outputs.content-source-next == 'true' - || needs.match.outputs.content-source-speculative == 'true' - ) - && steps.s3-upload.outcome == 'success') - uses: elastic/docs-builder/actions/update-link-index@main - - - name: Update deployment status - uses: actions/github-script@v7 - if: env.MATCH == 'true' && (always() && steps.deployment.outputs.result) - env: - PR_NUMBER: ${{ github.event.pull_request.number }} - LANDING_PAGE_PATH: ${{ steps.docs-build.outputs.landing-page-path || env.PATH_PREFIX }} - with: - script: | - await github.rest.repos.createDeploymentStatus({ - owner: context.repo.owner, - repo: context.repo.repo, - deployment_id: ${{ steps.deployment.outputs.result }}, - state: "${{ steps.docs-build.outputs.skip == 'true' && 'inactive' || (steps.s3-upload.outcome == 'success' && 'success' || 'failure') }}", - environment_url: `https://docs-v3-preview.elastic.dev${process.env.LANDING_PAGE_PATH}`, - log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, - })