Skip to content

Allow limited public assembler builds on docs-builder #4

Allow limited public assembler builds on docs-builder

Allow limited public assembler builds on docs-builder #4

name: assembler-preview
on:
pull_request:
types:
- opened
- synchronize
- reopened
- labeled
workflow_dispatch:
inputs:
pr_number:
description: 'Pull Request number to build the assembler preview for'
required: true
type: string
permissions:
contents: read
deployments: write
id-token: write
pull-requests: read
concurrency:
group: assembler-preview-${{ github.event.pull_request.number || inputs.pr_number }}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
env:
PR_NUMBER: ${{ github.event.pull_request.number || inputs.pr_number }}
steps:
- name: Get PR details
if: github.event_name == 'workflow_dispatch'
id: pr-details
uses: actions/github-script@v8
env:
PR_NUMBER: ${{ inputs.pr_number }}
with:
result-encoding: json
script: |
const { owner, repo } = context.repo;
const prNumber = parseInt(process.env.PR_NUMBER, 10);
if (isNaN(prNumber) || prNumber <= 0) {
core.setFailed(`Invalid PR number: ${process.env.PR_NUMBER}`);
return;
}
try {
const { data: pr } = await github.rest.pulls.get({
owner,
repo,
pull_number: prNumber,
});
return {
sha: pr.head.sha,
ref: pr.head.ref,
base_ref: pr.base.ref,
};
} catch (error) {
core.setFailed(`Failed to get PR #${prNumber}: ${error.message}`);
}
- name: Set PR SHA (workflow_dispatch)
id: pr-sha-dispatch
if: github.event_name == 'workflow_dispatch'
run: echo "sha=${{ fromJSON(steps.pr-details.outputs.result).sha }}" >> $GITHUB_OUTPUT
- name: Set PR SHA (pull_request)
id: pr-sha-pr
if: github.event_name == 'pull_request'
run: echo "sha=${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT
- name: Resolve PR SHA
id: pr-sha
run: echo "sha=${{ steps.pr-sha-dispatch.outputs.sha || steps.pr-sha-pr.outputs.sha }}" >> $GITHUB_OUTPUT
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ steps.pr-sha.outputs.sha }}
persist-credentials: false
- name: Create Deployment
uses: actions/github-script@v8
id: deployment
env:
PR_SHA: ${{ steps.pr-sha.outputs.sha }}
with:
result-encoding: string
script: |
const { owner, repo } = context.repo;
const prNumber = process.env.PR_NUMBER;
const environment = 'assembler-preview';
const task = `assembler-preview-${prNumber}`;
const deployment = await github.rest.repos.createDeployment({
owner,
repo,
environment,
task,
ref: process.env.PR_SHA,
auto_merge: false,
transient_environment: true,
required_contexts: [],
})
await github.rest.repos.createDeploymentStatus({
deployment_id: deployment.data.id,
owner,
repo,
state: "in_progress",
log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,
})
return deployment.data.id
- name: Bootstrap Action Workspace
uses: elastic/docs-builder/.github/actions/bootstrap@main
- name: Build assembled documentation
id: assembler-build
env:
ASSEMBLER_PREVIEW_PATH_PREFIX: ${{ github.repository }}/docs/${{ env.PR_NUMBER }}
run: |
echo "ASSEMBLER_PREVIEW_PATH_PREFIX=${ASSEMBLER_PREVIEW_PATH_PREFIX}" >> $GITHUB_ENV
yq -i ".environments.preview.path_prefix = \"${ASSEMBLER_PREVIEW_PATH_PREFIX}\"" config/assembler.yml
dotnet run --project src/tooling/docs-builder -- assemble --skip-private-repositories --environment preview
- uses: elastic/docs-builder/.github/actions/aws-auth@main
- name: Upload assembled docs to S3
id: s3-upload
env:
AWS_RETRY_MODE: standard
AWS_MAX_ATTEMPTS: 6
run: |
aws s3 sync .artifacts/assembly/${ASSEMBLER_PREVIEW_PATH_PREFIX} "s3://elastic-docs-v3-website-preview/${ASSEMBLER_PREVIEW_PATH_PREFIX}" --delete --no-follow-symlinks
aws cloudfront create-invalidation \
--distribution-id EKT7LT5PM8RKS \
--paths "/${ASSEMBLER_PREVIEW_PATH_PREFIX}" "/${ASSEMBLER_PREVIEW_PATH_PREFIX}/*"
- name: Update Deployment Status
if: always() && steps.deployment.outputs.result
uses: actions/github-script@v8
with:
script: |
await github.rest.repos.createDeploymentStatus({
owner: context.repo.owner,
repo: context.repo.repo,
deployment_id: ${{ steps.deployment.outputs.result }},
state: "${{ steps.s3-upload.outcome == 'success' && 'success' || 'failure' }}",
environment_url: `https://docs-v3-preview.elastic.dev/${process.env.ASSEMBLER_PREVIEW_PATH_PREFIX}`,
log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,
})