diff --git a/.dockerignore b/.dockerignore index 00a9f54..ccc2930 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,2 @@ -/.dev -/dist -/lib +/coverage /node_modules diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 7ee7fbb..42def06 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -2,7 +2,8 @@ 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 @@ -25,5 +26,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..a7c3fc7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -30,4 +30,4 @@ 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 58844f7..6a11728 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,7 @@ on: pull_request: branches: - 'master' + - 'releases/v*' jobs: ci: diff --git a/.github/workflows/docker.yml b/.github/workflows/image.yml similarity index 80% rename from .github/workflows/docker.yml rename to .github/workflows/image.yml index 5e6e702..a4ee7b4 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/image.yml @@ -1,9 +1,10 @@ -name: docker +name: image on: push: branches: - 'master' + - 'releases/v*' tags: - '*' paths-ignore: @@ -11,6 +12,7 @@ on: pull_request: branches: - 'master' + - 'releases/v*' paths-ignore: - '**.md' @@ -27,18 +29,24 @@ jobs: uses: actions/checkout@v2 - name: Docker meta - id: docker_meta + id: meta uses: crazy-max/ghaction-docker-meta@v1 with: images: | ${{ env.DOCKERHUB_SLUG }} ${{ env.GHCR_SLUG }} tag-edge: true + label-custom: | + org.opencontainers.image.title=Chocolatey Action + org.opencontainers.image.description=GitHub Action for Chocolatey, the package manager for Windows + org.opencontainers.image.vendor=CrazyMax + com.github.actions.name=Chocolatey Action + com.github.actions.description=GitHub Action for Chocolatey, the package manager for Windows + com.github.actions.icon=terminal + com.github.actions.color=blue - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - with: - buildkitd-flags: "--debug" - name: Login to DockerHub if: github.event_name != 'pull_request' @@ -52,22 +60,14 @@ jobs: uses: docker/login-action@v1 with: registry: ghcr.io - username: ${{ secrets.GHCR_USERNAME }} - password: ${{ secrets.GHCR_TOKEN }} + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Build - uses: docker/build-push-action@v2 + uses: docker/bake-action@v1 with: - context: . - file: ./Dockerfile + files: | + ./docker-bake.hcl + ${{ steps.meta.outputs.bake-file }} + targets: image push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.docker_meta.outputs.tags }} - labels: | - ${{ steps.docker_meta.outputs.labels }} - org.opencontainers.image.title=Chocolatey Action - org.opencontainers.image.description=GitHub Action for Chocolatey, the package manager for Windows - org.opencontainers.image.vendor=CrazyMax - com.github.actions.name=Chocolatey Action - com.github.actions.description=GitHub Action for Chocolatey, the package manager for Windows - com.github.actions.icon=terminal - com.github.actions.color=blue diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 0134e68..9c496d5 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -10,6 +10,7 @@ on: pull_request: branches: - 'master' + - 'releases/v*' paths-ignore: - '**.md' @@ -22,4 +23,6 @@ jobs: uses: actions/checkout@v2 - name: Validate - run: docker buildx bake validate + uses: docker/bake-action@v1 + with: + targets: validate diff --git a/dev.Dockerfile b/dev.Dockerfile deleted file mode 100644 index c6e16ae..0000000 --- a/dev.Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -#syntax=docker/dockerfile:1.2 - -FROM node:12 AS deps -WORKDIR /src -COPY package.json yarn.lock ./ -RUN --mount=type=cache,target=/src/node_modules \ - yarn install - -FROM scratch AS update-yarn -COPY --from=deps /src/yarn.lock / - -FROM deps AS validate-yarn -COPY .git .git -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 --mount=type=cache,target=/src/node_modules \ - yarn build - -FROM base AS run-format -RUN --mount=type=cache,target=/src/node_modules \ - yarn run format - -FROM scratch AS format -COPY --from=run-format /src/src/*.ts /src/ - -FROM base AS validate-format -RUN --mount=type=cache,target=/src/node_modules \ - 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 index 3589590..5280adb 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -1,48 +1,83 @@ +variable "NODE_VERSION" { + default = "12" +} + +target "node-version" { + args = { + NODE_VERSION = NODE_VERSION + } +} + group "default" { targets = ["build"] } group "pre-checkin" { - targets = ["update-yarn", "format", "build"] + targets = ["vendor-update", "format", "build"] } group "validate" { - targets = ["validate-format", "validate-build", "validate-yarn"] + targets = ["format-validate", "build-validate", "vendor-validate"] } -target "dockerfile" { - dockerfile = "dev.Dockerfile" +target "build" { + inherits = ["node-version"] + dockerfile = "./hack/build.Dockerfile" + target = "build-update" + output = ["."] } -target "update-yarn" { - inherits = ["dockerfile"] - target = "update-yarn" - output = ["."] +target "build-validate" { + inherits = ["node-version"] + dockerfile = "./hack/build.Dockerfile" + target = "build-validate" } -target "build" { - inherits = ["dockerfile"] - target = "dist" +target "format" { + inherits = ["node-version"] + dockerfile = "./hack/build.Dockerfile" + target = "format-update" output = ["."] } -target "format" { - inherits = ["dockerfile"] - target = "format" +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 "validate-format" { - inherits = ["dockerfile"] - target = "validate-format" +target "vendor-validate" { + inherits = ["node-version"] + dockerfile = "./hack/vendor.Dockerfile" + target = "validate" +} + +# +# +# + +variable "DEFAULT_TAG" { + default = "ghaction-chocolatey:local" +} + +// Special target: https://github.com/crazy-max/ghaction-docker-meta#bake-definition +target "ghaction-docker-meta" { + tags = ["${DEFAULT_TAG}"] } -target "validate-build" { - inherits = ["dockerfile"] - target = "validate-build" +target "image" { + inherits = ["ghaction-docker-meta"] + context = "./image" } -target "validate-yarn" { - inherits = ["dockerfile"] - target = "validate-yarn" +target "image-local" { + inherits = ["image"] + output = ["type=docker"] } 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 diff --git a/Dockerfile b/image/Dockerfile similarity index 89% rename from Dockerfile rename to image/Dockerfile index 84416e9..b2b3fde 100644 --- a/Dockerfile +++ b/image/Dockerfile @@ -1,3 +1,5 @@ +ARG CHOCOLATEY_VERSION="stable" + FROM mono:6.8 as builder RUN rm /etc/apt/sources.list \ @@ -11,8 +13,8 @@ RUN apt-get update \ tar \ wget -ENV CHOCOLATEY_VERSION="stable" \ - ChocolateyInstall="/opt/chocolatey" +ENV ChocolateyInstall="/opt/chocolatey" +ARG CHOCOLATEY_VERSION WORKDIR /usr/local/src RUN wget "https://github.com/chocolatey/choco/archive/${CHOCOLATEY_VERSION}.tar.gz" \ @@ -23,11 +25,9 @@ WORKDIR /usr/local/src/choco RUN chmod +x build.sh zip.sh RUN ./build.sh -FROM alpine:latest +FROM alpine:3.12 LABEL maintainer="CrazyMax" -COPY LICENSE README.md / - COPY --from=builder /usr/local/src/choco/build_output/chocolatey /opt/chocolatey RUN apk --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing add mono-dev \ @@ -38,5 +38,5 @@ RUN apk --update --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/ed && apk del build-dependencies \ && rm -rf /var/cache/apk/* -ADD entrypoint.sh / +COPY entrypoint.sh / ENTRYPOINT [ "/entrypoint.sh" ] diff --git a/entrypoint.sh b/image/entrypoint.sh old mode 100755 new mode 100644 similarity index 100% rename from entrypoint.sh rename to image/entrypoint.sh