You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
matrix-spec/.github/workflows/main.yml

257 lines
8.5 KiB
YAML

name: "Spec"
on:
push:
branches:
- main
tags:
- v*
pull_request:
workflow_dispatch:
schedule:
# Run this workflow every day at 2am. This helps keep the page of
# current spec proposals up-to-date.
- cron: '0 2 * * *'
jobs:
validate-openapi:
name: "๐Ÿ”Ž Validate OpenAPI specifications"
runs-on: ubuntu-latest
steps:
- name: "๐Ÿ“ฅ Source checkout"
uses: actions/checkout@v2
- name: "โž• Setup Node"
uses: actions/setup-node@v2
with:
node-version: '14'
- name: "๐Ÿ”Ž Run validator"
run: |
npx @redocly/cli@latest lint data/api/*/*.yaml
check-examples:
name: "๐Ÿ”Ž Check Event schema examples"
runs-on: ubuntu-latest
steps:
- name: "๐Ÿ“ฅ Source checkout"
uses: actions/checkout@v2
- name: "โž• Setup Python"
uses: actions/setup-python@v4
with:
python-version: '3.9'
cache: 'pip'
cache-dependency-path: scripts/requirements.txt
- name: "โž• Install dependencies"
run: |
pip install -r scripts/requirements.txt
- name: "๐Ÿ”Ž Run validator"
run: |
python scripts/check-event-schema-examples.py
calculate-baseurl:
name: "โš™๏ธ Calculate baseURL for later jobs"
runs-on: ubuntu-latest
outputs:
baseURL: "${{ steps.set-baseurl.outputs.baseURL }}"
steps:
# For PRs, set the baseURL to `/`.
# For releases, set the baseURL to `/$tag` (eg: `/v1.2`).
# Otherwise, set it to `/unstable`.
- name: "โš™๏ธ Calculate baseURL"
id: set-baseurl
# Double brackets on the elif to avoid auto-escaping refs/tags/* because we need
# the asterisk matching behaviour, not the literal string.
run: |
if [ "${GITHUB_EVENT_NAME}" == "pull_request" ]; then
echo ::set-output name=baseURL::/
elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then
echo ::set-output name=baseURL::"/${GITHUB_REF/refs\/tags\//}"
else
echo ::set-output name=baseURL::/unstable
fi
build-openapi:
name: "๐Ÿ Build OpenAPI definitions"
runs-on: ubuntu-latest
needs: [calculate-baseurl]
steps:
- name: "๐Ÿ“ฅ Source checkout"
uses: actions/checkout@v2
- name: "โž• Setup Python"
uses: actions/setup-python@v4
with:
python-version: '3.9'
cache: 'pip'
cache-dependency-path: scripts/requirements.txt
- name: "โž• Install dependencies"
run: |
pip install -r scripts/requirements.txt
- name: "๐Ÿ“ฆ Asset creation"
run: |
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
export RELEASE="${GITHUB_REF/refs\/tags\//}"
else
export RELEASE="unstable"
fi
# The output path matches the final deployment path at spec.matrix.org
scripts/dump-openapi.py \
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
--api application-service \
-r "$RELEASE" \
-o spec/application-service-api/api.json
scripts/dump-openapi.py \
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
--api client-server \
-r "$RELEASE" \
-o spec/client-server-api/api.json
scripts/dump-openapi.py \
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
--api push-gateway \
-r "$RELEASE" \
-o spec/push-gateway-api/api.json
tar -czf openapi.tar.gz spec
- name: "๐Ÿ“ค Artifact upload"
uses: actions/upload-artifact@v2
with:
name: openapi-artifact
path: openapi.tar.gz
generate-changelog:
name: "๐Ÿ“ข Run towncrier for changelog"
# skip for builds of git tags
if: "!startsWith(github.ref, 'refs/tags/')"
runs-on: ubuntu-latest
steps:
- name: "๐Ÿ“ฅ Source checkout"
uses: actions/checkout@v2
- name: "โž• Setup Python"
uses: actions/setup-python@v4
- name: "โž• Install towncrier"
run: "pip install 'towncrier'"
- name: "Generate changelog"
run: ./scripts/generate-changelog.sh vUNSTABLE
- name: "๐Ÿ“ค Artifact upload"
uses: actions/upload-artifact@v2
with:
name: changelog-artifact
path: content/changelog/vUNSTABLE.md
build-spec:
name: "๐Ÿ“– Build the spec"
runs-on: ubuntu-latest
needs: [calculate-baseurl, build-openapi, generate-changelog]
# run even if generate-changelog was skipped
if: ${{ always() }}
steps:
- name: "โž• Setup Node"
uses: actions/setup-node@v2
with:
node-version: '14'
- name: "โž• Setup Hugo"
uses: peaceiris/actions-hugo@c03b5dbed22245418539b65eb9a3b1d5fdd9a0a6
with:
hugo-version: '0.113.0'
extended: true
- name: "๐Ÿ“ฅ Source checkout"
uses: actions/checkout@v2
- name: "โš™๏ธ npm"
run: |
npm i
npm run get-proposals
- name: "๐Ÿ“ฅ Download generated changelog"
if: "needs.generate-changelog.result == 'success'"
uses: actions/download-artifact@v3
with:
name: changelog-artifact
path: content/changelog
- name: "โš™๏ธ hugo"
run: hugo --baseURL "${{ needs.calculate-baseurl.outputs.baseURL }}" -d "spec"
# We manually unpack the spec OpenAPI definition JSON to the website tree
# to make it available to the world in a canonical place:
# https://spec.matrix.org/latest/client-server-api/api.json
# Works for /unstable/ and /v1.1/ as well.
- name: "๐Ÿ“ฅ Spec definition download"
uses: actions/download-artifact@v2
with:
name: openapi-artifact
- name: "๐Ÿ“ Unpack the OpenAPI definitions in the right location"
run: |
tar -xzf openapi.tar.gz
- name: "๐Ÿ“ฆ Tarball creation"
run: tar -czf spec.tar.gz spec
- name: "๐Ÿ“ค Artifact upload"
uses: actions/upload-artifact@v2
with:
name: spec-artifact
path: spec.tar.gz
htmlcheck:
name: "๐Ÿ”Ž Validate generated HTML"
runs-on: ubuntu-latest
needs: [calculate-baseurl, build-spec]
steps:
- name: "๐Ÿ“ฅ Source checkout"
uses: actions/checkout@v2
- name: "๐Ÿ“ฅ Fetch built spec"
uses: actions/download-artifact@v2
with:
name: spec-artifact
- name: "๐Ÿ“ Unpack the spec"
# we have to unpack it into the right path given the baseurl, so that the
# links are correct.
# eg if baseurl is `/unstable`, we want to put the site in `spec/unstable`.
run: |
mkdir -p "spec${baseURL}"
tar -C "spec${baseURL}" --strip-components=1 -xvzf spec.tar.gz
env:
baseURL: "${{ needs.calculate-baseurl.outputs.baseURL }}"
- name: "Run htmltest"
uses: wjdp/htmltest-action@master
with:
config: .htmltest.yaml
build-historical-spec:
name: "๐Ÿ“– Build the historical backup spec"
runs-on: ubuntu-latest
needs: [build-openapi]
if: ${{ startsWith(github.ref, 'refs/tags/') }}
steps:
- name: "โž• Setup Node"
uses: actions/setup-node@v2
with:
node-version: '14'
- name: "โž• Setup Hugo"
uses: peaceiris/actions-hugo@c03b5dbed22245418539b65eb9a3b1d5fdd9a0a6
with:
hugo-version: '0.93.3'
extended: true
- name: "๐Ÿ“ฅ Source checkout"
uses: actions/checkout@v2
- name: "โš™๏ธ npm"
run: |
npm i
npm run get-proposals
- name: "โš™๏ธ hugo"
# Create a baseURL like `/v1.2` out of the `v1.2` tag
run: |
echo -e '[params.version]\nstatus="historical"' > historical.toml
hugo --config config.toml,historical.toml --baseURL "/${GITHUB_REF/refs\/tags\//}" -d "spec"
- name: "๐Ÿ“ฅ Spec definition download"
uses: actions/download-artifact@v2
with:
name: openapi-artifact
- name: "๐Ÿ“ Unpack the OpenAPI definitions in the right location"
run: |
tar -xzf openapi.tar.gz
- name: "๐Ÿ“ฆ Tarball creation"
run: tar -czf spec-historical.tar.gz spec
- name: "๐Ÿ“ค Artifact upload"
uses: actions/upload-artifact@v2
with:
name: spec-historical-artifact
path: spec-historical.tar.gz