diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 3eec1ff..3536197 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -14,6 +14,20 @@ Contributions to this project are [released](https://help.github.com/articles/gi 6. Push to your fork and [submit a pull request](https://github.com/docker/setup-buildx-action/compare) 7. Pat yourself on the back and wait for your pull request to be reviewed and merged. +## Container based developer flow + +If you don't want to maintain a Node developer environment that fits this project you can use containerized commands instead of invoking yarn directly. + +``` +# format code and build javascript artifacts +docker buildx bake pre-checkin + +# validate all code has correctly formatted and built +docker buildx bake validate +``` + +Note that tests target are currently known to not pass outside Github infrastructure. + Here are a few things you can do that will increase the likelihood of your pull request being accepted: - Make sure the `README.md` and any other relevant **documentation are kept up-to-date**. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a3e05e9..45f6f41 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,6 +12,15 @@ on: - "**.md" jobs: + test-containerized: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v2.3.2 + - + name: Validate + run: docker buildx bake validate test: runs-on: ubuntu-latest steps: diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9c57a11 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +#syntax=docker/dockerfile:1.1-experimental + +FROM node:14 AS deps +WORKDIR /src +COPY package.json yarn.lock ./ +RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \ + yarn install + +FROM scratch AS update-yarn +COPY --from=deps /src/yarn.lock / + +FROM deps AS validate-yarn +RUN status=$(git status --porcelain -- yarn.lock); if [ -n "$status" ]; then echo $status; exit 1; fi + +FROM deps AS base +COPY . . + +FROM base AS build +RUN yarn build + +FROM deps AS test +COPY --from=docker /usr/local/bin/docker /usr/bin/ +ARG TARGETOS +ARG TARGETARCH +ARG BUILDX_VERSION=v0.4.2 +ENV RUNNER_TEMP=/tmp/github_runner +ENV RUNNER_TOOL_CACHE=/tmp/github_tool_cache +RUN mkdir -p /usr/local/lib/docker/cli-plugins && \ + curl -fsSL https://github.com/docker/buildx/releases/download/$BUILDX_VERSION/buildx-$BUILDX_VERSION.$TARGETOS-$TARGETARCH > /usr/local/lib/docker/cli-plugins/buildx && \ + chmod +x /usr/local/lib/docker/cli-plugins/buildx && \ + docker buildx --version && env +COPY . . +RUN yarn run test + +FROM base AS run-format +RUN yarn run format + +FROM scratch AS format +COPY --from=run-format /src/src/*.ts /src/ + +FROM base AS validate-format +RUN yarn run format-check + +FROM scratch AS dist +COPY --from=build /src/dist/ /dist/ + +FROM build AS validate-build +RUN status=$(git status --porcelain -- dist); if [ -n "$status" ]; then echo $status; exit 1; fi + +FROM base AS dev +ENTRYPOINT ["bash"] diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 0000000..f7f1745 --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,42 @@ +group "default" { + targets = ["build"] +} + +group "pre-checkin" { + targets = ["update-yarn", "format", "build"] +} + +group "validate" { + targets = ["validate-format", "validate-build", "validate-yarn"] +} + +target "update-yarn" { + target = "update-yarn" + output = ["."] +} + +target "build" { + target = "dist" + output = ["."] +} + +target "test" { + target = "test" +} + +target "format" { + target = "format" + output = ["."] +} + +target "validate-format" { + target = "validate-format" +} + +target "validate-build" { + target = "validate-build" +} + +target "validate-yarn" { + target = "validate-yarn" +} \ No newline at end of file diff --git a/hack/shell b/hack/shell new file mode 100755 index 0000000..97b23ea --- /dev/null +++ b/hack/shell @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX) +DOCKER_BUILDKIT=1 docker build --iidfile $iidfile --progress=plain . +docker run -it --rm $(cat $iidfile) +docker rmi $(cat $iidfile)