Skip to content

Commit

Permalink
Added a prototype for generating jsonschema files (#112)
Browse files Browse the repository at this point in the history
* Added a prototype for generating jsonschema files

Signed-off-by: Fredrik Skogman <kommendorkapten@github.com>

* Removed unused changes to Dockerfile

Signed-off-by: Fredrik Skogman <kommendorkapten@github.com>

* Dockerfile.jsonschema: pin apk versions

Signed-off-by: William Woodruff <william@trailofbits.com>

* Makefile: add jsonschema to all

Signed-off-by: William Woodruff <william@trailofbits.com>

* gen/jsonschema: regen

Signed-off-by: William Woodruff <william@trailofbits.com>

* Dockerfile.jsonschema: optimize git clone slightly

Signed-off-by: William Woodruff <william@trailofbits.com>

* jsonschema: regen

Signed-off-by: William Woodruff <william@trailofbits.com>

* Dockerfile.jsonschema: check out a fixed revision

Signed-off-by: William Woodruff <william@trailofbits.com>

* RELEASE: document JSON schema process

Signed-off-by: William Woodruff <william@trailofbits.com>

---------

Signed-off-by: Fredrik Skogman <kommendorkapten@github.com>
Signed-off-by: William Woodruff <william@trailofbits.com>
Co-authored-by: William Woodruff <william@trailofbits.com>
  • Loading branch information
kommendorkapten and woodruffw authored Jul 31, 2023
1 parent e728c60 commit 9abc8c2
Show file tree
Hide file tree
Showing 38 changed files with 3,882 additions and 1 deletion.
10 changes: 10 additions & 0 deletions Dockerfile.jsonschema
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# 3.18.2
FROM alpine@sha256:25fad2a32ad1f6f510e528448ae1ec69a28ef81916a004d3629874104f8a7f70
RUN apk add --update protoc=3.21.12-r2 protobuf-dev=3.21.12-r2 go=1.20.5-r0 git=2.40.1-r0
RUN go install github.com/chrusty/protoc-gen-jsonschema/cmd/protoc-gen-jsonschema@1.4.1
# This is required to get the field_behavior.proto file
# NOTE: --filter=tree:0 performs a treeless clone; we do this to optimize cloning
# this otherwise relatively heavy repository.
RUN git clone --filter=tree:0 https://github.com/googleapis/googleapis.git \
&& cd googleapis \
&& git checkout 95f0f2b2aee51e460646320d6e8f2ce75c463f5a
16 changes: 15 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@
# limitations under the License.

PROTOC_IMAGE=protobuf-specs-build
JSONSCHEMA_IMAGE=jsonschema-specs-build

# generate all language protobuf code
all: go python typescript ruby rust
all: go python typescript ruby rust jsonschema

# generate Go protobuf code
go: docker-image
Expand Down Expand Up @@ -58,6 +59,14 @@ rust: docker-image
--entrypoint bash ${PROTOC_IMAGE} \
-c "cd gen/pb-rust/codegen && cargo run && rm -rf target/"

jsonschema: docker-image-jsonschema
@echo "Generating JSON schema files"
docker run \
--platform linux/amd64 \
-v ${PWD}:/defs \
--entrypoint sh \
${JSONSCHEMA_IMAGE} \
-c "cd defs/gen/jsonschema && ./jsonschema.sh -I ../../protos -I /googleapis/ --jsonschema_out=schemas ../../protos/*.proto"

# docker already does its own caching so we can attempt a build every time
.PHONY: docker-image
Expand All @@ -73,6 +82,11 @@ docker-image-no-cache:
@echo "Building development docker image with disabled cache"
docker build --no-cache -t ${PROTOC_IMAGE} .

.PHONY: docker-image-jsonschema
docker-image-jsonschema:
@echo "Building docker image for generating JSON schema files"
docker build -t ${JSONSCHEMA_IMAGE} -f Dockerfile.jsonschema .

# clean up generated files (not working? try sudo make clean)
clean:
rm -rf gen/pb-go \
Expand Down
5 changes: 5 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,8 @@ will automatically start.
Prepare a tag with the following pattern `release/typescript/vX.Y.Z` and
push it. The [workflow](.github/workflows/typescript-release.yml)
will automatically start.

### JSON Schema

Prepare a tag with the pattern `release/jsonschema/vX.Y.Z` and push it.
No workflow is required.
10 changes: 10 additions & 0 deletions gen/jsonschema/jsonschema.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/bin/sh

set -u
set -e

protoc --plugin=/root/go/bin/protoc-gen-jsonschema \
--jsonschema_opt=enforce_oneof \
--jsonschema_opt=file_extension=schema.json \
--jsonschema_opt=disallow_additional_properties \
"$@"
35 changes: 35 additions & 0 deletions gen/jsonschema/schemas/Artifact.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"$ref": "#/definitions/Artifact",
"definitions": {
"Artifact": {
"properties": {
"artifact_uri": {
"type": "string",
"description": "Location of the artifact"
},
"artifact": {
"type": "string",
"description": "The raw bytes of the artifact",
"format": "binary",
"binaryEncoding": "base64"
}
},
"additionalProperties": false,
"type": "object",
"oneOf": [
{
"required": [
"artifact_uri"
]
},
{
"required": [
"artifact"
]
}
],
"title": "Artifact"
}
}
}
Loading

0 comments on commit 9abc8c2

Please sign in to comment.