[pull] main from platformsh:main #674
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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." |