mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-08 05:52:55 +00:00
This PR adds tests runs on Postgres 15 and created unified Allure report with results for all tests. - Split `.github/actions/allure-report` into `.github/actions/allure-report-store` and `.github/actions/allure-report-generate` - Add debug or release pytest parameter for all tests (depending on `BUILD_TYPE` env variable) - Add Postgres version as a pytest parameter for all tests (depending on `DEFAULT_PG_VERSION` env variable) - Fix `test_wal_restore` and `restore_from_wal.sh` to support path with `[`/`]` in it (fixed by applying spellcheck to the script and fixing all warnings), `restore_from_wal_archive.sh` is deleted as unused. - All known failures on Postgres 15 marked with xfail
185 lines
7.2 KiB
YAML
185 lines
7.2 KiB
YAML
name: 'Create Allure report'
|
|
description: 'Generate Allure report from uploaded by actions/allure-report-store tests results'
|
|
|
|
outputs:
|
|
report-url:
|
|
description: 'Allure report URL'
|
|
value: ${{ steps.generate-report.outputs.report-url }}
|
|
report-json-url:
|
|
description: 'Allure report JSON URL'
|
|
value: ${{ steps.generate-report.outputs.report-json-url }}
|
|
|
|
runs:
|
|
using: "composite"
|
|
|
|
steps:
|
|
# We're using some of env variables quite offen, so let's set them once.
|
|
#
|
|
# It would be nice to have them set in common runs.env[0] section, but it doesn't work[1]
|
|
#
|
|
# - [0] https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runsenv
|
|
# - [1] https://github.com/neondatabase/neon/pull/3907#discussion_r1154703456
|
|
#
|
|
- name: Set variables
|
|
shell: bash -euxo pipefail {0}
|
|
run: |
|
|
PR_NUMBER=$(jq --raw-output .pull_request.number "$GITHUB_EVENT_PATH" || true)
|
|
if [ "${PR_NUMBER}" != "null" ]; then
|
|
BRANCH_OR_PR=pr-${PR_NUMBER}
|
|
elif [ "${GITHUB_REF_NAME}" = "main" ] || [ "${GITHUB_REF_NAME}" = "release" ]; then
|
|
# Shortcut for special branches
|
|
BRANCH_OR_PR=${GITHUB_REF_NAME}
|
|
else
|
|
BRANCH_OR_PR=branch-$(printf "${GITHUB_REF_NAME}" | tr -c "[:alnum:]._-" "-")
|
|
fi
|
|
|
|
LOCK_FILE=reports/${BRANCH_OR_PR}/lock.txt
|
|
|
|
WORKDIR=/tmp/${BRANCH_OR_PR}-$(date +%s)
|
|
mkdir -p ${WORKDIR}
|
|
|
|
echo "BRANCH_OR_PR=${BRANCH_OR_PR}" >> $GITHUB_ENV
|
|
echo "LOCK_FILE=${LOCK_FILE}" >> $GITHUB_ENV
|
|
echo "WORKDIR=${WORKDIR}" >> $GITHUB_ENV
|
|
echo "BUCKET=${BUCKET}" >> $GITHUB_ENV
|
|
env:
|
|
BUCKET: neon-github-public-dev
|
|
|
|
# TODO: We can replace with a special docker image with Java and Allure pre-installed
|
|
- uses: actions/setup-java@v3
|
|
with:
|
|
distribution: 'temurin'
|
|
java-version: '17'
|
|
|
|
- name: Install Allure
|
|
shell: bash -euxo pipefail {0}
|
|
run: |
|
|
if ! which allure; then
|
|
ALLURE_ZIP=allure-${ALLURE_VERSION}.zip
|
|
wget -q https://github.com/allure-framework/allure2/releases/download/${ALLURE_VERSION}/${ALLURE_ZIP}
|
|
echo "${ALLURE_ZIP_MD5} ${ALLURE_ZIP}" | md5sum -c
|
|
unzip -q ${ALLURE_ZIP}
|
|
echo "$(pwd)/allure-${ALLURE_VERSION}/bin" >> $GITHUB_PATH
|
|
rm -f ${ALLURE_ZIP}
|
|
fi
|
|
env:
|
|
ALLURE_VERSION: 2.22.0
|
|
ALLURE_ZIP_MD5: d5c9f0989b896482536956340a7d5ec9
|
|
|
|
# Potentially we could have several running build for the same key (for example, for the main branch), so we use improvised lock for this
|
|
- name: Acquire lock
|
|
shell: bash -euxo pipefail {0}
|
|
run: |
|
|
LOCK_TIMEOUT=300 # seconds
|
|
|
|
LOCK_CONTENT="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
echo ${LOCK_CONTENT} > ${WORKDIR}/lock.txt
|
|
|
|
# Do it up to 5 times to avoid race condition
|
|
for _ in $(seq 1 5); do
|
|
for i in $(seq 1 ${LOCK_TIMEOUT}); do
|
|
LOCK_ACQUIRED=$(aws s3api head-object --bucket neon-github-public-dev --key ${LOCK_FILE} | jq --raw-output '.LastModified' || true)
|
|
# `date --date="..."` is supported only by gnu date (i.e. it doesn't work on BSD/macOS)
|
|
if [ -z "${LOCK_ACQUIRED}" ] || [ "$(( $(date +%s) - $(date --date="${LOCK_ACQUIRED}" +%s) ))" -gt "${LOCK_TIMEOUT}" ]; then
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
aws s3 mv --only-show-errors ${WORKDIR}/lock.txt "s3://${BUCKET}/${LOCK_FILE}"
|
|
|
|
# Double-check that exactly THIS run has acquired the lock
|
|
aws s3 cp --only-show-errors "s3://${BUCKET}/${LOCK_FILE}" ./lock.txt
|
|
if [ "$(cat lock.txt)" = "${LOCK_CONTENT}" ]; then
|
|
break
|
|
fi
|
|
done
|
|
|
|
- name: Generate and publish final Allure report
|
|
id: generate-report
|
|
shell: bash -euxo pipefail {0}
|
|
run: |
|
|
REPORT_PREFIX=reports/${BRANCH_OR_PR}
|
|
RAW_PREFIX=reports-raw/${BRANCH_OR_PR}/${GITHUB_RUN_ID}
|
|
|
|
# Get previously uploaded data for this run
|
|
ZSTD_NBTHREADS=0
|
|
|
|
S3_FILEPATHS=$(aws s3api list-objects-v2 --bucket ${BUCKET} --prefix ${RAW_PREFIX}/ | jq --raw-output '.Contents[].Key')
|
|
if [ -z "$S3_FILEPATHS" ]; then
|
|
# There's no previously uploaded data for this $GITHUB_RUN_ID
|
|
exit 0
|
|
fi
|
|
for S3_FILEPATH in ${S3_FILEPATHS}; do
|
|
time aws s3 cp --only-show-errors "s3://${BUCKET}/${S3_FILEPATH}" "${WORKDIR}"
|
|
|
|
archive=${WORKDIR}/$(basename $S3_FILEPATH)
|
|
mkdir -p ${archive%.tar.zst}
|
|
time tar -xf ${archive} -C ${archive%.tar.zst}
|
|
rm -f ${archive}
|
|
done
|
|
|
|
# Get history trend
|
|
time aws s3 cp --recursive --only-show-errors "s3://${BUCKET}/${REPORT_PREFIX}/latest/history" "${WORKDIR}/latest/history" || true
|
|
|
|
# Generate report
|
|
time allure generate --clean --output ${WORKDIR}/report ${WORKDIR}/*
|
|
|
|
# Replace a logo link with a redirect to the latest version of the report
|
|
sed -i 's|<a href="." class=|<a href="https://'${BUCKET}'.s3.amazonaws.com/'${REPORT_PREFIX}'/latest/index.html?nocache='"'+Date.now()+'"'" class=|g' ${WORKDIR}/report/app.js
|
|
|
|
# Upload a history and the final report (in this particular order to not to have duplicated history in 2 places)
|
|
time aws s3 mv --recursive --only-show-errors "${WORKDIR}/report/history" "s3://${BUCKET}/${REPORT_PREFIX}/latest/history"
|
|
time aws s3 mv --recursive --only-show-errors "${WORKDIR}/report" "s3://${BUCKET}/${REPORT_PREFIX}/${GITHUB_RUN_ID}"
|
|
|
|
REPORT_URL=https://${BUCKET}.s3.amazonaws.com/${REPORT_PREFIX}/${GITHUB_RUN_ID}/index.html
|
|
|
|
# Generate redirect
|
|
cat <<EOF > ${WORKDIR}/index.html
|
|
<!DOCTYPE html>
|
|
|
|
<meta charset="utf-8">
|
|
<title>Redirecting to ${REPORT_URL}</title>
|
|
<meta http-equiv="refresh" content="0; URL=${REPORT_URL}">
|
|
EOF
|
|
time aws s3 cp --only-show-errors ${WORKDIR}/index.html "s3://${BUCKET}/${REPORT_PREFIX}/latest/index.html"
|
|
|
|
echo "report-url=${REPORT_URL}" >> $GITHUB_OUTPUT
|
|
echo "report-json-url=${REPORT_URL%/index.html}/data/suites.json" >> $GITHUB_OUTPUT
|
|
|
|
- name: Release lock
|
|
if: always()
|
|
shell: bash -euxo pipefail {0}
|
|
run: |
|
|
aws s3 cp --only-show-errors "s3://${BUCKET}/${LOCK_FILE}" ./lock.txt || exit 0
|
|
|
|
if [ "$(cat lock.txt)" = "${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}" ]; then
|
|
aws s3 rm "s3://${BUCKET}/${LOCK_FILE}"
|
|
fi
|
|
|
|
- name: Cleanup
|
|
if: always()
|
|
shell: bash -euxo pipefail {0}
|
|
run: |
|
|
if [ -d "${WORKDIR}" ]; then
|
|
rm -rf ${WORKDIR}
|
|
fi
|
|
|
|
- uses: actions/github-script@v6
|
|
if: always()
|
|
env:
|
|
REPORT_URL: ${{ steps.generate-report.outputs.report-url }}
|
|
COMMIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
with:
|
|
script: |
|
|
const { REPORT_URL, COMMIT_SHA } = process.env
|
|
|
|
await github.rest.repos.createCommitStatus({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
sha: `${COMMIT_SHA}`,
|
|
state: 'success',
|
|
target_url: `${REPORT_URL}`,
|
|
context: 'Allure report',
|
|
})
|