QNS #1385
Workflow file for this run
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: QNS | |
on: | |
push: | |
branches: ["main"] | |
paths-ignore: ["*.md", "*.png", "*.svg", "LICENSE-*"] | |
pull_request: | |
branches: ["main"] | |
paths-ignore: ["*.md", "*.png", "*.svg", "LICENSE-*"] | |
merge_group: | |
schedule: | |
# Run at 1 AM each day | |
- cron: '0 1 * * *' | |
workflow_dispatch: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref_name }} | |
cancel-in-progress: true | |
permissions: read-all | |
env: | |
LATEST: neqo-latest | |
DELIM: ' vs. ' | |
jobs: | |
docker-image: | |
name: Build Docker image | |
runs-on: ubuntu-latest | |
outputs: | |
imageID: ${{ steps.docker_build_and_push.outputs.imageID }} | |
permissions: | |
packages: write | |
steps: | |
- name: Harden Runner | |
uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 # v2.8.1 | |
with: | |
egress-policy: audit | |
- uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 | |
- uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 | |
- uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ github.token }} | |
- uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 | |
id: meta | |
with: | |
images: ghcr.io/${{ github.repository }}-qns | |
tags: | | |
# default | |
type=schedule | |
type=ref,event=branch | |
type=ref,event=tag | |
type=ref,event=pr | |
# set latest tag for default branch | |
type=raw,value=latest,enable={{is_default_branch}} | |
- uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v6.1.0 | |
if: github.event_name != 'pull_request' | |
with: | |
push: true | |
tags: ${{ steps.meta.outputs.tags }} | |
file: qns/Dockerfile | |
build-args: RUST_VERSION=stable | |
cache-from: type=gha | |
cache-to: type=gha,mode=max | |
platforms: 'linux/amd64, linux/arm64' | |
- uses: docker/build-push-action@31159d49c0d4756269a0940a750801a1ea5d7003 # v6.1.0 | |
id: docker_build_and_push | |
with: | |
tags: ${{ steps.meta.outputs.tags }} | |
file: qns/Dockerfile | |
build-args: RUST_VERSION=stable | |
cache-from: type=gha | |
cache-to: type=gha,mode=max | |
platforms: 'linux/amd64' | |
outputs: type=docker,dest=/tmp/${{ env.LATEST }}.tar | |
- uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 | |
with: | |
name: '${{ env.LATEST }} Docker image' | |
path: /tmp/${{ env.LATEST }}.tar | |
implementations: | |
name: Determine interop pairs | |
needs: docker-image | |
runs-on: ubuntu-latest | |
outputs: | |
pairs: ${{ steps.config.outputs.pairs }} | |
implementations: ${{ steps.config.outputs.implementations }} | |
env: | |
URL: https://github.com/mozilla/neqo | |
ROLE: both | |
steps: | |
- name: Harden Runner | |
uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 # v2.8.1 | |
with: | |
egress-policy: audit | |
- id: config | |
run: | | |
# Add neqo-latest to implementations.json | |
curl https://raw.githubusercontent.com/quic-interop/quic-interop-runner/master/implementations.json | \ | |
jq --arg key "$LATEST" --argjson newEntry ' | |
{ | |
"image": "${{ needs.docker-image.outputs.imageID }}", | |
"url": "${{ env.URL }}", | |
"role": "${{ env.ROLE }}" | |
}' '.[$key] = $newEntry' > implementations.json | |
{ | |
echo "implementations<<EOF" | |
cat implementations.json | |
echo "EOF" | |
} >> "$GITHUB_OUTPUT" | |
# Determine valid interop pairs that contain $LATEST | |
jq < implementations.json "[ | |
[to_entries[] | select(.value.role==\"server\" or .value.role==\"both\").key] as \$servers | | |
[to_entries[] | select(.value.role==\"client\" or .value.role==\"both\").key] as \$clients | | |
\$clients[] as \$client | | |
\$servers[] as \$server | | |
\$client + \"$DELIM\" + \$server | | |
select(contains(\"$LATEST\")) | |
]" > pairs.json | |
{ | |
echo "pairs<<EOF" | |
cat pairs.json | |
echo "EOF" | |
} >> "$GITHUB_OUTPUT" | |
run-qns: | |
name: Run QNS | |
needs: implementations | |
strategy: | |
fail-fast: false | |
matrix: | |
pair: ${{ fromJson(needs.implementations.outputs.pairs) }} | |
runs-on: ubuntu-latest | |
steps: | |
- name: Harden Runner | |
uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 # v2.8.1 | |
with: | |
egress-policy: audit | |
- uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | |
with: | |
name: '${{ env.LATEST }} Docker image' | |
path: /tmp | |
- run: docker load --input /tmp/${{ env.LATEST }}.tar | |
- id: depair | |
run: | | |
PAIR=$(echo ${{ matrix.pair }} | sed "s/$DELIM/%/g") | |
echo "client=$(echo "$PAIR" | cut -d% -f1)" >> "$GITHUB_OUTPUT" | |
echo "server=$(echo "$PAIR" | cut -d% -f2)" >> "$GITHUB_OUTPUT" | |
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | |
# TODO: Replace once https://github.com/quic-interop/quic-interop-runner/pull/356 is merged. | |
- uses: ./.github/actions/quic-interop-runner | |
with: | |
client: ${{ steps.depair.outputs.client }} | |
server: ${{ steps.depair.outputs.server }} | |
implementations: ${{ needs.implementations.outputs.implementations }} | |
report: | |
name: Report results | |
needs: run-qns | |
runs-on: ubuntu-latest | |
steps: | |
- name: Harden Runner | |
uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 # v2.8.1 | |
with: | |
egress-policy: audit | |
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | |
- uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 | |
with: | |
pattern: '*results' | |
path: results | |
- run: | | |
for RUN in results/*; do | |
[ -e "$RUN/result.json" ] || continue | |
CLIENT=$(jq -r < "$RUN/result.json" '.clients[0]') | |
SERVER=$(jq -r < "$RUN/result.json" '.servers[0]') | |
jq < "$RUN/result.json" ' | |
. as $data | | |
{ | |
results: [.results[] | group_by(.result)[] | {(.[0].result): [.[] | .abbr]}] | | |
add | |
} | | |
. + {log_url: $data.log_url} | |
' > "$RUN/grouped.json" | |
for GROUP in $(jq -r < "$RUN/grouped.json" '.results | keys[]'); do | |
RESULT=$(jq < "$RUN/grouped.json" -r '.results.'"$GROUP"'[]' | fmt -w 1000) | |
LOG=$(jq -r < "$RUN/grouped.json" -r '.log_url') | |
[ -n "$RESULT" ] || continue | |
{ | |
echo -n "* [" | |
[ "$CLIENT" == "$LATEST" ] || echo -n "<ins>" | |
echo -n "$CLIENT" | |
[ "$CLIENT" == "$LATEST" ] || echo -n "</ins>" | |
echo -n "$DELIM" | |
[ "$SERVER" == "$LATEST" ] || echo -n "<ins>" | |
echo -n "$SERVER" | |
[ "$SERVER" == "$LATEST" ] || echo -n "</ins>" | |
echo -n "]($LOG): " | |
echo "**$RESULT**" | |
} >> "$GROUP.md" | |
done | |
done | |
{ | |
echo "### Failed Interop Tests" | |
if [ -e failed.md ]; then | |
echo "[QUIC Interop Runner](https://github.com/quic-interop/quic-interop-runner), *client* vs. *server*" | |
cat failed.md | |
else | |
echo "None :tada:" | |
fi | |
echo "<details><summary>All results</summary>" | |
echo | |
for GROUP in succeeded unsupported; do | |
echo "### ${GROUP^} Interop Tests" | |
if [ -e "$GROUP.md" ]; then | |
echo "[QUIC Interop Runner](https://github.com/quic-interop/quic-interop-runner), *client* vs. *server*" | |
cat "$GROUP.md" | |
else | |
echo "None :question:" | |
fi | |
done | |
echo | |
echo "</details>" | |
} >> comment.md | |
- uses: ./.github/actions/pr-comment-data-export | |
with: | |
name: ${{ github.workflow }} | |
contents: comment.md |