From 16f67607f0c08306fba2bd69afa7d5b94b53479b Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Tue, 30 Mar 2021 18:42:29 +0200 Subject: [PATCH] Container dev workflow (#35) Co-authored-by: CrazyMax --- .dockerignore | 2 + .github/CONTRIBUTING.md | 20 +++++---- .github/ISSUE_TEMPLATE/bug_report.md | 3 +- .github/workflows/ci.yml | 14 +++--- .github/workflows/pre-checkin.yml | 30 ------------- .github/workflows/test.yml | 32 ++++++------- docker-bake.hcl | 67 ++++++++++++++++++++++++++++ hack/build.Dockerfile | 42 +++++++++++++++++ hack/test.Dockerfile | 21 +++++++++ hack/vendor.Dockerfile | 23 ++++++++++ 10 files changed, 189 insertions(+), 65 deletions(-) create mode 100644 .dockerignore delete mode 100644 .github/workflows/pre-checkin.yml create mode 100644 docker-bake.hcl create mode 100644 hack/build.Dockerfile create mode 100644 hack/test.Dockerfile create mode 100644 hack/vendor.Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ccc2930 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +/coverage +/node_modules diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index dac2500..8f857dc 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -2,18 +2,20 @@ Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. -Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE). +Contributions to this project are [released](https://docs.github.com/en/github/site-policy/github-terms-of-service#6-contributions-under-repository-license) +to the public under the [project's open source license](LICENSE). ## Submitting a pull request 1. [Fork](https://github.com/crazy-max/ghaction-github-status/fork) and clone the repository 2. Configure and install the dependencies: `yarn install` -3. Make sure the tests pass on your machine: `yarn run test` -4. Create a new branch: `git checkout -b my-branch-name` -5. Make your change, add tests, and make sure the tests still pass -6. Run pre-checkin: `yarn run pre-checkin` -7. Push to your fork and [submit a pull request](https://github.com/crazy-max/ghaction-github-status/compare) -8. Pat your self on the back and wait for your pull request to be reviewed and merged. +3. Create a new branch: `git checkout -b my-branch-name` +4. Make your changes +5. Make sure the tests pass: `docker buildx bake test` +6. Format code and build javascript artifacts: `docker buildx bake pre-checkin` +7. Validate all code has correctly formatted and built: `docker buildx bake validate` +8. Push to your fork and [submit a pull request](https://github.com/crazy-max/ghaction-github-status/compare) +9. Pat your self on the back and wait for your pull request to be reviewed and merged. Here are a few things you can do that will increase the likelihood of your pull request being accepted: @@ -26,5 +28,5 @@ Here are a few things you can do that will increase the likelihood of your pull ## Resources - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) -- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) -- [GitHub Help](https://help.github.com) +- [Using Pull Requests](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) +- [GitHub Help](https://docs.github.com/en) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f7ca2d7..1f16063 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -30,4 +30,5 @@ about: Create a report to help us improve ### Logs -> Download the [log file of your build](https://help.github.com/en/actions/configuring-and-managing-workflows/managing-a-workflow-run#downloading-logs) and [attach it](https://help.github.com/en/github/managing-your-work-on-github/file-attachments-on-issues-and-pull-requests) to this issue. +> Download the [log file of your build](https://docs.github.com/en/actions/managing-workflow-runs/using-workflow-run-logs#downloading-logs) +> and [attach it](https://docs.github.com/en/github/managing-your-work-on-github/file-attachments-on-issues-and-pull-requests) to this issue. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3fcf166..893675c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,14 +3,16 @@ name: ci on: schedule: - cron: '0 10 * * *' # everyday at 10am - pull_request: - branches: - - master - - releases/v* push: branches: - - master - - releases/v* + - 'master' + - 'releases/v*' + tags: + - 'v*' + pull_request: + branches: + - 'master' + - 'releases/v*' jobs: ci: diff --git a/.github/workflows/pre-checkin.yml b/.github/workflows/pre-checkin.yml deleted file mode 100644 index 38808c1..0000000 --- a/.github/workflows/pre-checkin.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: pre-checkin - -on: - push: - paths-ignore: - - '**.md' - pull_request: - paths-ignore: - - '**.md' - -jobs: - pre-checkin: - runs-on: ubuntu-latest - steps: - - - name: Checkout - uses: actions/checkout@v2 - - - name: Install - run: yarn install - - - name: Pre-checkin - run: yarn run pre-checkin - - - name: Check for uncommitted changes - run: | - if [[ `git status --porcelain` ]]; then - git status --porcelain - echo "::warning::Found changes. Please run 'yarn run pre-checkin' and push" - fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index be77ee7..93790e9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,38 +3,32 @@ name: test on: push: branches: - - master - - releases/v* - paths-ignore: - - '**.md' + - 'master' + - 'releases/v*' pull_request: - paths-ignore: - - '**.md' + branches: + - 'master' + - 'releases/v*' jobs: test: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: - - ubuntu-latest - - macOS-latest - - windows-latest + runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - - name: Install - run: yarn install + name: Validate + uses: docker/bake-action@v1 + with: + targets: validate - name: Test - run: yarn run test + uses: docker/bake-action@v1 + with: + targets: test - name: Upload coverage uses: codecov/codecov-action@v1 - if: success() with: - token: ${{ secrets.CODECOV_TOKEN }} file: ./coverage/clover.xml diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 0000000..7054cf7 --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,67 @@ +variable "NODE_VERSION" { + default = "12" +} + +target "node-version" { + args = { + NODE_VERSION = NODE_VERSION + } +} + +group "default" { + targets = ["build"] +} + +group "pre-checkin" { + targets = ["vendor-update", "format", "build"] +} + +group "validate" { + targets = ["format-validate", "build-validate", "vendor-validate"] +} + +target "build" { + inherits = ["node-version"] + dockerfile = "./hack/build.Dockerfile" + target = "build-update" + output = ["."] +} + +target "build-validate" { + inherits = ["node-version"] + dockerfile = "./hack/build.Dockerfile" + target = "build-validate" +} + +target "format" { + inherits = ["node-version"] + dockerfile = "./hack/build.Dockerfile" + target = "format-update" + output = ["."] +} + +target "format-validate" { + inherits = ["node-version"] + dockerfile = "./hack/build.Dockerfile" + target = "format-validate" +} + +target "vendor-update" { + inherits = ["node-version"] + dockerfile = "./hack/vendor.Dockerfile" + target = "update" + output = ["."] +} + +target "vendor-validate" { + inherits = ["node-version"] + dockerfile = "./hack/vendor.Dockerfile" + target = "validate" +} + +target "test" { + inherits = ["node-version"] + dockerfile = "./hack/test.Dockerfile" + target = "test-coverage" + output = ["./coverage"] +} diff --git a/hack/build.Dockerfile b/hack/build.Dockerfile new file mode 100644 index 0000000..a0796d7 --- /dev/null +++ b/hack/build.Dockerfile @@ -0,0 +1,42 @@ +# syntax=docker/dockerfile:1.2 +ARG NODE_VERSION + +FROM node:${NODE_VERSION}-alpine AS base +RUN apk add --no-cache cpio findutils git +WORKDIR /src + +FROM base AS deps +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn install + +FROM deps AS build +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn run build && mkdir /out && cp -Rf dist /out/ + +FROM scratch AS build-update +COPY --from=build /out / + +FROM build AS build-validate +RUN --mount=type=bind,target=.,rw \ + git add -A && cp -rf /out/* .; \ + if [ -n "$(git status --porcelain -- dist)" ]; then \ + echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"'; \ + git status --porcelain -- dist; \ + exit 1; \ + fi + +FROM deps AS format +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn run format \ + && mkdir /out && find . -name '*.ts' -not -path './node_modules/*' | cpio -pdm /out + +FROM scratch AS format-update +COPY --from=format /out / + +FROM deps AS format-validate +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn run format-check \ diff --git a/hack/test.Dockerfile b/hack/test.Dockerfile new file mode 100644 index 0000000..06c5d67 --- /dev/null +++ b/hack/test.Dockerfile @@ -0,0 +1,21 @@ +# syntax=docker/dockerfile:1.2 +ARG NODE_VERSION + +FROM node:${NODE_VERSION}-alpine AS base +RUN apk add --no-cache git +WORKDIR /src + +FROM base AS deps +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn install + +FROM deps AS test +ENV RUNNER_TEMP=/tmp/github_runner +ENV RUNNER_TOOL_CACHE=/tmp/github_tool_cache +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn run test --coverageDirectory=/tmp/coverage + +FROM scratch AS test-coverage +COPY --from=test /tmp/coverage / diff --git a/hack/vendor.Dockerfile b/hack/vendor.Dockerfile new file mode 100644 index 0000000..dd7906b --- /dev/null +++ b/hack/vendor.Dockerfile @@ -0,0 +1,23 @@ +# syntax=docker/dockerfile:1.2 +ARG NODE_VERSION + +FROM node:${NODE_VERSION}-alpine AS base +RUN apk add --no-cache git +WORKDIR /src + +FROM base AS vendored +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn install && mkdir /out && cp yarn.lock /out + +FROM scratch AS update +COPY --from=vendored /out / + +FROM vendored AS validate +RUN --mount=type=bind,target=.,rw \ + git add -A && cp -rf /out/* .; \ + if [ -n "$(git status --porcelain -- yarn.lock)" ]; then \ + echo >&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor-update"'; \ + git status --porcelain -- yarn.lock; \ + exit 1; \ + fi