-
Notifications
You must be signed in to change notification settings - Fork 32
Add preview workflow #279
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add preview workflow #279
Changes from 4 commits
d479691
5126893
fa2093d
c0a2f5b
eba1e99
3debe83
cf69668
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| name: AWS Auth | ||
|
|
||
| description: | | ||
| This is an opinionated action to authenticate with AWS. | ||
| It will generate a role ARN based on the repository name and the AWS account ID. | ||
|
|
||
| inputs: | ||
| aws_account_id: | ||
| description: 'The AWS account ID to generate the role ARN for' | ||
| required: true | ||
| default: '197730964718' # elastic-web | ||
| aws_region: | ||
| description: 'The AWS region to use' | ||
| required: false | ||
| default: 'us-east-1' | ||
| aws_role_name_prefix: | ||
| description: 'The prefix for the role name' | ||
| required: false | ||
| default: 'elastic-docs-v3-preview-' | ||
|
|
||
| runs: | ||
| using: composite | ||
| steps: | ||
| - name: Generate AWS Role ARN | ||
| id: role_arn | ||
| shell: python | ||
| env: | ||
| AWS_ACCOUNT_ID: ${{ inputs.aws_account_id }} | ||
| ROLE_NAME_PREFIX: ${{ inputs.aws_role_name_prefix }} | ||
| run: | | ||
| import hashlib | ||
| import os | ||
| prefix = os.environ["ROLE_NAME_PREFIX"] | ||
| m = hashlib.sha256() | ||
| m.update(os.environ["GITHUB_REPOSITORY"].encode('utf-8')) | ||
| hash = m.hexdigest()[:64-len(prefix)] | ||
| with open(os.environ["GITHUB_OUTPUT"], "a") as f: | ||
| f.write(f"result=arn:aws:iam::{os.environ["AWS_ACCOUNT_ID"]}:role/{prefix}{hash}") | ||
| - name: Configure AWS Credentials | ||
| uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 | ||
| with: | ||
| role-to-assume: ${{ steps.role_arn.outputs.result }} | ||
| aws-region: ${{ inputs.aws_region }} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| name: preview-cleanup | ||
|
|
||
| on: | ||
| pull_request_target: | ||
| types: [closed] | ||
|
|
||
| permissions: | ||
| deployments: write | ||
| id-token: write | ||
|
|
||
| jobs: | ||
| cleanup: | ||
| runs-on: ubuntu-latest | ||
| environment: preview-${{ github.event.pull_request.number }} | ||
| steps: | ||
| - uses: ./.github/actions/aws-auth | ||
| - name: Delete s3 objects | ||
| env: | ||
| PR_NUMBER: ${{ github.event.pull_request.number }} | ||
| run: | | ||
| aws s3 rm "s3://elastic-docs-v3-website-preview/${GITHUB_REPOSITORY}/pull/${PR_NUMBER}" --recursive | ||
|
|
||
| - name: Delete GitHub environment | ||
| uses: actions/github-script@v7 | ||
| with: | ||
| script: | | ||
| const { owner, repo } = context.repo; | ||
| const deployments = await github.rest.repos.listDeployments({ | ||
| owner, | ||
| repo, | ||
| environment: `preview-${context.issue.number}` | ||
| }); | ||
| for (const deployment of deployments.data) { | ||
| await github.rest.repos.createDeploymentStatus({ | ||
| owner, | ||
| repo, | ||
| deployment_id: deployment.id, | ||
| state: 'inactive', | ||
| description: 'Marking deployment as inactive' | ||
| }); | ||
| await github.rest.repos.deleteDeployment({ | ||
| owner, | ||
| repo, | ||
| deployment_id: deployment.id | ||
| }); | ||
| } | ||
|
|
||
| octokit.rest.repos.deleteAnEnvironment({ | ||
| owner, | ||
| repo, | ||
| environment_name: `preview-${context.issue.number}`, | ||
| }); | ||
|
|
||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,85 @@ | ||
| name: preview | ||
|
|
||
| on: | ||
| workflow_call: ~ | ||
|
|
||
| permissions: | ||
| id-token: write | ||
| pull-requests: write | ||
| deployments: write | ||
|
|
||
| jobs: | ||
| deploy: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Create Deployment | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not necessary for this PR but we might want to protect this to only run if doc changes are part of the PR? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My intention for this preview was not to create a preview of the docs only, but actually also a preview of changes within the docs-builder codebase. |
||
| uses: actions/github-script@v7 | ||
| id: deployment | ||
| with: | ||
| result-encoding: string | ||
| script: | | ||
| const { owner, repo } = context.repo; | ||
| const deployment = await github.rest.repos.createDeployment({ | ||
| issue_number: context.issue.number, | ||
| owner, | ||
| repo, | ||
| ref: context.payload.pull_request.head.ref, | ||
| environment: `preview-${context.issue.number}`, | ||
bmorelli25 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| description: `Preview deployment for PR ${context.issue.number}`, | ||
| auto_merge: false, | ||
| required_contexts: [], | ||
| }) | ||
| await github.rest.repos.createDeploymentStatus({ | ||
| deployment_id: deployment.data.id, | ||
| owner, | ||
| repo, | ||
| state: "in_progress", | ||
| description: "Deployment created", | ||
| log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}?pr=${context.issue.number}`, | ||
| }) | ||
| return deployment.data.id | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - uses: actions/download-artifact@v4 | ||
| with: | ||
| name: docs | ||
| path: .artifacts/docs/html | ||
Mpdreamz marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| - uses: ./.github/actions/aws-auth | ||
Mpdreamz marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| - name: Upload to S3 | ||
| env: | ||
| PR_NUMBER: ${{ github.event.pull_request.number }} | ||
| run: | | ||
| aws s3 sync .artifacts/docs/html "s3://elastic-docs-v3-website-preview/${GITHUB_REPOSITORY}/pull/${PR_NUMBER}" --delete | ||
| aws cloudfront create-invalidation --distribution-id EKT7LT5PM8RKS --paths "/${GITHUB_REPOSITORY}/pull/${PR_NUMBER}/*" | ||
| - name: Update deployment status | ||
| uses: actions/github-script@v7 | ||
| if: steps.deployment.outputs.result | ||
| with: | ||
| script: | | ||
| await github.rest.repos.createDeploymentStatus({ | ||
| owner: context.repo.owner, | ||
| repo: context.repo.repo, | ||
| deployment_id: ${{ steps.deployment.outputs.result }}, | ||
| state: "success", | ||
| description: "Deployment completed", | ||
| environment_url: `https://docs-v3-preview.elastic.dev/${context.repo.owner}/${context.repo.repo}/pull/${context.issue.number}`, | ||
| log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}?pr=${context.issue.number}`, | ||
| }) | ||
| - name: Update Deployment Status on Failure | ||
| if: failure() && steps.deployment.outputs.result | ||
| uses: actions/github-script@v7 | ||
| with: | ||
| script: | | ||
| await github.rest.repos.createDeploymentStatus({ | ||
| owner: context.repo.owner, | ||
| repo: context.repo.repo, | ||
| deployment_id: ${{ steps.deployment.outputs.result }}, | ||
| state: "failure", | ||
| description: "Deployment failed", | ||
| log_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}?pr=${context.issue.number}`, | ||
| }) | ||
Uh oh!
There was an error while loading. Please reload this page.