Skip to content

[pull] main from platformsh:main #674

[pull] main from platformsh:main

[pull] main from platformsh:main #674

Workflow file for this run

name: Get info on PR
on:
pull_request_target:
branches: [main]
types: [labeled,opened,reopened,synchronize]
env:
PLATFORMSH_CLI_NO_INTERACTION: 1
PLATFORM_PROJECT: ${{ vars.PROJECT_ID }}
PLATFORMSH_CLI_DEFAULT_TIMEOUT: 60 # Increase timeout for CLI commands
BRANCH_TITLE: ${{ vars.BFF_PREFIX }}-${{ github.event.number }}
UPSUN_DOCS_PREFIX: "https://docs.upsun.com"
jobs:
get_pr_info:
runs-on: ubuntu-latest
name: Get info on build from PR
# Run only for PRs from default repo and approved PRs from forks
if: github.event.pull_request.head.repo.id == 21975579 || contains(github.event.pull_request.labels.*.name, 'build-fork')
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Set branch name
id: branch_name
run: |
# For PRs from non-forked repos
if [ ${{ github.event.pull_request.head.repo.id }} == 21975579 ]; then
branch_name="${{ github.event.pull_request.head.ref }}"
# For PRs from forks
else
branch_name="${{ env.BRANCH_TITLE }}"
fi
echo "::notice::Setting branch name to ${branch_name}."
echo "branch_name=${branch_name}" >> $GITHUB_OUTPUT
# Set up workflow environment to use the Platform.sh CLI
- name: Set up Platform.sh CLI
uses: ./.github/actions/set-up-cli
# Get the URL for the deployed environment
- name: Get environment URL
env:
PLATFORMSH_CLI_TOKEN: ${{ secrets.PLATFORMSH_CLI_TOKEN }}
id: get_env_url
run: |
COMMIT_STATUS="pending"
# Get the state of the most recent deployment activity
# run commands in workflows are are automatically launched with shell: /usr/bin/bash -e {0}. If for some
# reason the psh cli errors (e.g. branch hasn't reached psh and therefore doesnt exist, api times out, etc)
# this will cause our workflow to exit. Instead, call the cli with an | true so we can attempt to query again
STATE=$(platform activities --format plain --type "environment.push environment.activate environment.redeploy environment.branch" --no-header --columns "state" --limit 1 --environment ${{ steps.branch_name.outputs.branch_name }} || true)
echo "::notice::Attempting to retrieve deployed environment URL. Current state is: ${STATE}"
# Set tries to 0 to start countdown to timeout
STATUS_TRY=1
# We'll try up to 20 minutes, so (SLEEP_TIME*NUM_ATTEMPTS)/60 = 10*
SLEEP_TIME=10
NUM_ATTEMPTS=120
# Wait until state is complete or 20 minutes has passed
until [ "${STATE}" = "complete" ] || [ ${STATUS_TRY} = ${NUM_ATTEMPTS} ]; do
sleep ${SLEEP_TIME}
echo "::notice::Environment is not deployed. Attempting to retrieve deployed status. Attempt ${STATUS_TRY} of ${NUM_ATTEMPTS}."
STATE=$(platform activities --format plain --type "environment.push environment.activate environment.redeploy environment.branch" --no-header --columns "state" --limit 1 --environment ${{ steps.branch_name.outputs.branch_name }} || true)
echo "::notice::Status retrieved: ${STATE}"
if [ "${STATE}" = "complete" ]; then
echo "::notice::Activity is complete."
fi
# we want to clear the cli cache every 3rd attempt in case it is caching too heavily
if [ $(expr ${STATUS_TRY} % 3) = 0 ]; then
echo "Clearing the cli cache..."
platform clear-cache
fi
STATUS_TRY=$((++STATUS_TRY))
done
# Get the URL of the environment
ENV_URL=$(platform url --primary --pipe --environment ${{ steps.branch_name.outputs.branch_name }})
# Get the status of the build activity
COMMIT_STATUS=$(platform activities --format plain --type "environment.push environment.activate environment.redeploy environment.branch" --no-header --columns "result" --limit 1 --environment ${{ steps.branch_name.outputs.branch_name }})
# Report findings
echo "The Platform.sh environment is:"
echo "$COMMIT_STATUS"
if [ "$COMMIT_STATUS" = "success" ]; then
echo "Environment deployed to:"
echo "$ENV_URL"
fi
# Report the final statuses to be used in future jobs
echo "env_status=$COMMIT_STATUS" >> $GITHUB_OUTPUT
echo "env_url=$ENV_URL" >> $GITHUB_OUTPUT
- name: Make artifact files
run: |
touch environment_url.txt
touch pr_comment.txt
- name: Save PR number
if: ${{ always() }}
run: echo ${{ github.event.number }} > pr_number.txt
- name: Save PR SHA
if: ${{ always() }}
run: echo "${{ github.event.pull_request.head.sha }}" > pr_sha.txt
# If no environment URL, create a report of that
- name: Create failure report
if: steps.get_env_url.outputs.env_status == 'failure'
run: |
echo -e "The environment on Platform.sh failed to deploy. :slightly_frowning_face:\n\nCheck the logs: https://console.platform.sh/projects/${{ env.PLATFORM_PROJECT }}/${{ steps.branch_name.outputs.branch_name }}" > pr_comment.txt
# Create a list of relevant changed pages
- name: Report environment URL
if: steps.get_env_url.outputs.env_status == 'success'
run: |
echo ${{ steps.get_env_url.outputs.env_url }} > environment_url.txt
- name: Get changed files
if: steps.get_env_url.outputs.env_status == 'success'
id: changed-files
uses: tj-actions/changed-files@v41
with:
sha: ${{ github.event.pull_request.head.sha }}
base_sha: ${{ github.event.pull_request.base.sha }}
# Create a list of relevant changed pages
- name: Get list of changed files
if: steps.get_env_url.outputs.env_status == 'success'
id: get-files
env:
ENV_URL: ${{ steps.get_env_url.outputs.env_url }}
run: |
files_platform=()
files_upsun=()
for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
# Rewrite all Markdown files in the source to be links in the final environment
if [[ $file = "sites/platform/src/"*".md" ]]; then
# Remove file extension
page=${file/.md/.html}
# Remove initial directory
page=${page/"sites/platform/src/"/}
# Shift index pages up a level
page=${page/"/_index.html"/".html"}
files_platform+=("$ENV_URL$page")
fi
if [[ $file = "sites/upsun/src/"*".md" ]]; then
# Remove file extension
page=${file/.md/.html}
# Remove initial directory
page=${page/"sites/upsun/src/"/}
# Shift index pages up a level
page=${page/"/_index.html"/".html"}
# Adjust URL for Upsun docs.
UPSUN_ENV_URL=${{ env.UPSUN_DOCS_PREFIX }}.${ENV_URL:8}
files_upsun+=("$UPSUN_ENV_URL$page")
fi
done
# If there are changed files for Platform.sh, return a list
# Using "\n" here creates problems in passing data to the next step, so replace there instead
if (( ${#files_platform[@]} != 0 )); then
echo $(printf "||%s" "${files_platform[@]}")
echo changed_files_platform=$(printf "||%s" "${files_platform[@]}") >> $GITHUB_OUTPUT
else
echo changed_files_platform="" >> $GITHUB_OUTPUT
fi
# If there are changed files for Upsun, return a list
# Using "\n" here creates problems in passing data to the next step, so replace there instead
if (( ${#files_upsun[@]} != 0 )); then
echo $(printf "||%s" "${files_upsun[@]}")
echo changed_files_upsun=$(printf "||%s" "${files_upsun[@]}") >> $GITHUB_OUTPUT
else
echo changed_files_upsun="" >> $GITHUB_OUTPUT
fi
# If there are changed pages, create a comment with a checklist
- name: Comment with links
if: steps.get-files.outputs.changed_files_platform != '' || steps.get-files.outputs.changed_files_upsun != ''
env:
PAGES_PLATFORM: ${{ steps.get-files.outputs.changed_files_platform }}
PAGES_UPSUN: ${{ steps.get-files.outputs.changed_files_upsun }}
run: |
echo -e "Your Platform.sh environment has successfully deployed. :rocket:\n\nSee the changed pages:\n\n<details>\n<summary>Platform.sh docs</summary><br/>\n\n${PAGES_PLATFORM//||/'\n- [ ] '}\n\n</details>\n\n<details>\n<summary>Upsun docs</summary><br/>\n\n${PAGES_UPSUN//||/'\n- [ ] '}" > pr_comment.txt
# If there are no changed pages, create a comment
# with a link to general URL
- name: Comment without links
if: steps.get-files.outputs.changed_files_platform == '' && steps.get-files.outputs.changed_files_upsun == '' && steps.get_env_url.outputs.env_status == 'success'
env:
ENV_URL: ${{ steps.get_env_url.outputs.env_url }}
run: |
UPSUN_ENV_URL=${{ env.UPSUN_DOCS_PREFIX }}.${ENV_URL:8}
echo -e "Your Platform.sh environment has successfully deployed. :rocket:\n\nSee the site:\n\n- [Platform.sh docs]($ENV_URL)\n- [Upsun docs]($UPSUN_ENV_URL)" > pr_comment.txt
- uses: actions/upload-artifact@v4
with:
name: pr-info
path: |
environment_url.txt
pr_comment.txt
pr_number.txt
pr_sha.txt
retention-days: 1
# If environment failed to create, fail the workflow
- name: Fail workflow
env:
PLATFORMSH_CLI_TOKEN: ${{ secrets.PLATFORMSH_CLI_TOKEN }}
if: steps.get_env_url.outputs.env_status != 'success'
run: |
echo "::error::The environment for pull request ${{ github.event.number }} failed to deploy. Please rerun this workflow."
echo "The last status we received was ${{ steps.get_env_url.outputs.env_status }}"
echo "List of activities that we ask for, but not limited to the last one:"
platform activities --type "environment.push environment.activate environment.redeploy environment.branch" --environment ${{ steps.branch_name.outputs.branch_name }}
echo "Now a list of the (up to) last 20 activities for branch ${{ steps.branch_name.outputs.branch_name }}:"
platform activities --environment ${{ steps.branch_name.outputs.branch_name }} --limit 20
# Get the ID of failed activity and output its log:
failedID=$(platform activities --format plain --type "environment.push environment.activate environment.redeploy environment.branch" --no-header --columns "ID" --limit 1 --environment ${{ steps.branch_name.outputs.branch_name }} --result=failure)
echo "Log for the failed activity, ID ${failedID}"
platform activity:log ${failedID} --environment ${{ steps.branch_name.outputs.branch_name }}
exit 1
dont_run_nonlabeled_forks:
name: Warn about non-labeled PRs from forks
if: github.event.pull_request.head.repo.id != 21975579 && !contains(github.event.pull_request.labels.*.name, 'build-fork')
runs-on: ubuntu-latest
steps:
- name: Warn the environment will not be built
run: |
echo "::warning::Pull Requests from forks will not have an environment built until they are given the appropriate label."