diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..5c5f2f5aa --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,56 @@ +name: Create and upload release artifacts +on: + release: + types: [published, prereleased] + +jobs: + release-artifacts: + runs-on: ubuntu-latest + + permissions: + contents: write + repository-projects: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install Poetry + run: python -m pip install poetry + - name: Install dependencies + run: poetry install + - name: Make release artifacts + run: | + mkdir -p ./dist/schemas + poetry run ./manage.py schemas phenopacket >> ./dist/schemas/phenopacket_schema.json + poetry run ./manage.py schemas experiment >> ./dist/schemas/experiment_schema.json + poetry run ./manage.py schemas discovery >> ./dist/schemas/discovery.json + pushd ./dist/schemas + zip -r ../../json-schemas.zip * + - name: Upload release artifacts + uses: actions/github-script@v7 + with: + script: | + const fs = require("fs"); + + // get tag + const tag = context.ref.replace("refs/tags/", ""); + + // get release from tag + const release = await github.rest.repos.getReleaseByTag({ + owner: context.repo.owner, + repo: context.repo.repo, + tag: tag, + }); + await github.rest.repos.uploadReleaseAsset({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: release.data.id, + name: "json-schemas.zip", + data: await fs.readFileSync("./json-schemas.zip"), + }); diff --git a/chord_metadata_service/chord/management/commands/schemas.py b/chord_metadata_service/chord/management/commands/schemas.py new file mode 100644 index 000000000..c20e1a6ef --- /dev/null +++ b/chord_metadata_service/chord/management/commands/schemas.py @@ -0,0 +1,28 @@ +import json +from typing import Any +from django.core.management.base import BaseCommand, CommandParser + +from chord_metadata_service.chord.data_types import DATA_TYPE_EXPERIMENT, DATA_TYPE_PHENOPACKET +from chord_metadata_service.discovery.schemas import DISCOVERY_SCHEMA +from chord_metadata_service.experiments.schemas import EXPERIMENT_SCHEMA +from chord_metadata_service.phenopackets.schemas import PHENOPACKET_SCHEMA + +NAME_TO_SCHEMA: dict[str, object] = { + DATA_TYPE_PHENOPACKET: PHENOPACKET_SCHEMA, + DATA_TYPE_EXPERIMENT: EXPERIMENT_SCHEMA, + "discovery": DISCOVERY_SCHEMA, +} + + +class Command(BaseCommand): + help = """ + Compiles and returns a JSON-schema in a single JSON file for artifact. + Use in GitHub Actions in order to publish usable schemas on releases. + """ + + def add_arguments(self, parser: CommandParser) -> None: + parser.add_argument("schema", action="store", type=str, choices=NAME_TO_SCHEMA.keys()) + + def handle(self, *args: Any, **options: Any) -> str | None: + schema = NAME_TO_SCHEMA[options["schema"]] + self.stdout.write(json.dumps(schema, indent=2))