From b96f04b830d3f8bb8997998519a8fe207ae99512 Mon Sep 17 00:00:00 2001 From: Ben Hale Date: Sat, 3 Oct 2020 13:54:03 -0700 Subject: [PATCH] Initial Pipelines This change includes all the existing contributions from the pipeline builder for this repository. Signed-off-by: Ben Hale --- .github/dependabot.yml | 16 ++ .github/labels.yml | 27 ++++ .github/release-drafter.yml | 32 ++++ .github/workflows/create-package.yml | 137 +++++++++++++++++ .github/workflows/minimal-labels.yml | 30 ++++ .github/workflows/synchronize-labels.yml | 17 +++ .github/workflows/tests.yml | 138 +++++++++++++++++ .github/workflows/update-draft-release.yml | 163 +++++++++++++++++++++ CODEOWNERS | 1 + 9 files changed, 561 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/labels.yml create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/create-package.yml create mode 100644 .github/workflows/minimal-labels.yml create mode 100644 .github/workflows/synchronize-labels.yml create mode 100644 .github/workflows/tests.yml create mode 100644 .github/workflows/update-draft-release.yml create mode 100644 CODEOWNERS diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..1d28333 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,16 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: daily + labels: + - semver:patch + - type:dependency-upgrade + - package-ecosystem: gomod + directory: / + schedule: + interval: daily + labels: + - semver:patch + - type:dependency-upgrade diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 0000000..270dd19 --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,27 @@ +- name: semver:major + description: A change requiring a major version bump + color: f9d0c4 +- name: semver:minor + description: A change requiring a minor version bump + color: f9d0c4 +- name: semver:patch + description: A change requiring a patch version bump + color: f9d0c4 +- name: type:bug + description: A general bug + color: e3d9fc +- name: type:dependency-upgrade + description: A dependency upgrade + color: e3d9fc +- name: type:documentation + description: A documentation update + color: e3d9fc +- name: type:enhancement + description: A general enhancement + color: e3d9fc +- name: type:question + description: A user question + color: e3d9fc +- name: type:task + description: A general task + color: e3d9fc diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 0000000..b5c1d5b --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,32 @@ +template: $CHANGES +name-template: $RESOLVED_VERSION +tag-template: v$RESOLVED_VERSION +categories: + - title: ⭐️ Enhancements + labels: + - type:enhancement + - title: "\U0001F41E Bug Fixes" + labels: + - type:bug + - title: "\U0001F4D4 Documentation" + labels: + - type:documentation + - title: ⛏ Dependency Upgrades + labels: + - type:dependency-upgrade + - title: "\U0001F6A7 Tasks" + labels: + - type:task +exclude-labels: + - type:question +version-resolver: + major: + labels: + - semver:major + minor: + labels: + - semver:minor + patch: + labels: + - semver:patch + default: patch diff --git a/.github/workflows/create-package.yml b/.github/workflows/create-package.yml new file mode 100644 index 0000000..5ff6f2a --- /dev/null +++ b/.github/workflows/create-package.yml @@ -0,0 +1,137 @@ +name: Create Package +"on": + release: + types: + - published +jobs: + create-package: + name: Create Package + runs-on: + - ubuntu-latest + steps: + - uses: actions/checkout@v2 + - id: version + name: Compute Version + run: | + #!/usr/bin/env bash + + set -euo pipefail + + PATTERN="refs/tags/v([0-9]+\.[0-9]+\.[0-9]+)" + if [[ ${GITHUB_REF} =~ ${PATTERN} ]]; then + VERSION=${BASH_REMATCH[1]} + else + VERSION=$(git rev-parse --short HEAD) + fi + + echo "::set-output name=version::${VERSION}" + printf "Selected %s from + * ref: %s + * sha: %s + " "${VERSION}" "${GITHUB_REF}" "${GITHUB_SHA}" + - uses: actions/setup-go@v2 + with: + go-version: "1.15" + - name: Install Create Package + run: | + #!/usr/bin/env bash + + set -euo pipefail + + GO111MODULE=on go get -u -ldflags="-s -w" github.com/paketo-buildpacks/libpak/cmd/create-package + - name: Create Package + run: | + #!/usr/bin/env bash + + set -euo pipefail + + if [[ -n "${INCLUDE_DEPENDENCIES+x}" ]]; then + create-package \ + --cache-location "${HOME}"/carton-cache \ + --destination "${HOME}"/buildpack \ + --include-dependencies \ + --version "${VERSION}" + else + create-package \ + --destination "${HOME}"/buildpack \ + --version "${VERSION}" + fi + + [[ -e package.toml ]] && cp package.toml "${HOME}"/package.toml + printf '[buildpack]\nuri = "%s"' "${HOME}"/buildpack >> "${HOME}"/package.toml + env: + VERSION: ${{ steps.version.outputs.version }} + - name: Install Crane + run: | + #!/usr/bin/env bash + + set -euo pipefail + + GO111MODULE=on go get -u -ldflags="-s -w" github.com/google/go-containerregistry/cmd/crane + - name: Install pack + run: | + #!/usr/bin/env bash + + set -euo pipefail + + mkdir -p "${HOME}"/bin + echo "::add-path::${HOME}/bin" + + curl \ + --location \ + --show-error \ + --silent \ + "https://github.com/buildpacks/pack/releases/download/v${PACK_VERSION}/pack-v${PACK_VERSION}-linux.tgz" \ + | tar -C "${HOME}"/bin/ -xzv pack + env: + PACK_VERSION: 0.13.1 + - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master + with: + service_account_key: ${{ secrets.JAVA_GCLOUD_SERVICE_ACCOUNT_KEY }} + - name: Configure gcloud docker credentials + run: gcloud auth configure-docker + - id: package + name: Package Buildpack + run: | + #!/usr/bin/env bash + + set -euo pipefail + + if [[ -n "${PUBLISH+x}" ]]; then + pack package-buildpack \ + "${PACKAGE}:${VERSION}" \ + --config "${HOME}"/package.toml \ + --publish + + echo "::set-output name=digest::$(crane digest "${PACKAGE}:${VERSION}")" + else + pack package-buildpack \ + "${PACKAGE}:${VERSION}" \ + --config "${HOME}"/package.toml + fi + env: + PACKAGE: gcr.io/paketo-buildpacks/sbt + PUBLISH: "true" + VERSION: ${{ steps.version.outputs.version }} + - name: Update release with digest + run: | + #!/usr/bin/env bash + + set -euo pipefail + + PAYLOAD=$(cat "${GITHUB_EVENT_PATH}") + + RELEASE_ID=$(jq -n -r --argjson PAYLOAD "${PAYLOAD}" '$PAYLOAD.release.id') + RELEASE_TAG_NAME=$(jq -n -r --argjson PAYLOAD "${PAYLOAD}" '$PAYLOAD.release.tag_name') + RELEASE_NAME=$(jq -n -r --argjson PAYLOAD "${PAYLOAD}" '$PAYLOAD.release.name') + RELEASE_BODY=$(jq -n -r --argjson PAYLOAD "${PAYLOAD}" '$PAYLOAD.release.body') + + gh api \ + --method PATCH \ + "/repos/:owner/:repo/releases/${RELEASE_ID}" \ + --field "tag_name=${RELEASE_TAG_NAME}" \ + --field "name=${RELEASE_NAME}" \ + --field "body=${RELEASE_BODY///\`${DIGEST}\`}" + env: + DIGEST: ${{ steps.package.outputs.digest }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/minimal-labels.yml b/.github/workflows/minimal-labels.yml new file mode 100644 index 0000000..eb91320 --- /dev/null +++ b/.github/workflows/minimal-labels.yml @@ -0,0 +1,30 @@ +name: Minimal Labels +"on": + pull_request: + types: + - opened + - synchronize + - reopened + - labeled + - unlabeled +jobs: + semver: + name: Minimal Semver Labels + runs-on: + - ubuntu-latest + steps: + - uses: mheap/github-action-required-labels@v1 + with: + count: 1 + labels: semver:major, semver:minor, semver:patch + mode: exactly + type: + name: Minimal Type Labels + runs-on: + - ubuntu-latest + steps: + - uses: mheap/github-action-required-labels@v1 + with: + count: 1 + labels: type:bug, type:dependency-upgrade, type:documentation, type:enhancement, type:question, type:task + mode: exactly diff --git a/.github/workflows/synchronize-labels.yml b/.github/workflows/synchronize-labels.yml new file mode 100644 index 0000000..598e7ad --- /dev/null +++ b/.github/workflows/synchronize-labels.yml @@ -0,0 +1,17 @@ +name: Synchronize Labels +"on": + push: + branches: + - main + paths: + - .github/labels.yml +jobs: + synchronize: + name: Synchronize Labels + runs-on: + - ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: micnncim/action-label-syncer@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..20d4627 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,138 @@ +name: Tests +"on": + pull_request: {} + push: + branches: + - main +jobs: + package: + name: Package Test + runs-on: + - ubuntu-latest + steps: + - uses: actions/checkout@v2 + - id: version + name: Compute Version + run: | + #!/usr/bin/env bash + + set -euo pipefail + + PATTERN="refs/tags/v([0-9]+\.[0-9]+\.[0-9]+)" + if [[ ${GITHUB_REF} =~ ${PATTERN} ]]; then + VERSION=${BASH_REMATCH[1]} + else + VERSION=$(git rev-parse --short HEAD) + fi + + echo "::set-output name=version::${VERSION}" + printf "Selected %s from + * ref: %s + * sha: %s + " "${VERSION}" "${GITHUB_REF}" "${GITHUB_SHA}" + - uses: actions/setup-go@v2 + with: + go-version: "1.15" + - uses: actions/cache@v2 + with: + key: ${{ runner.os }}-go-${{ hashFiles('**/buildpack.toml') }} + path: ${{ env.HOME }}/carton-cache + restore-keys: ${{ runner.os }}-go- + - name: Install Create Package + run: | + #!/usr/bin/env bash + + set -euo pipefail + + GO111MODULE=on go get -u -ldflags="-s -w" github.com/paketo-buildpacks/libpak/cmd/create-package + - name: Create Package + run: | + #!/usr/bin/env bash + + set -euo pipefail + + if [[ -n "${INCLUDE_DEPENDENCIES+x}" ]]; then + create-package \ + --cache-location "${HOME}"/carton-cache \ + --destination "${HOME}"/buildpack \ + --include-dependencies \ + --version "${VERSION}" + else + create-package \ + --destination "${HOME}"/buildpack \ + --version "${VERSION}" + fi + + [[ -e package.toml ]] && cp package.toml "${HOME}"/package.toml + printf '[buildpack]\nuri = "%s"' "${HOME}"/buildpack >> "${HOME}"/package.toml + env: + INCLUDE_DEPENDENCIES: "true" + VERSION: ${{ steps.version.outputs.version }} + - name: Install pack + run: | + #!/usr/bin/env bash + + set -euo pipefail + + mkdir -p "${HOME}"/bin + echo "::add-path::${HOME}/bin" + + curl \ + --location \ + --show-error \ + --silent \ + "https://github.com/buildpacks/pack/releases/download/v${PACK_VERSION}/pack-v${PACK_VERSION}-linux.tgz" \ + | tar -C "${HOME}"/bin/ -xzv pack + env: + PACK_VERSION: 0.13.1 + - name: Package Buildpack + run: | + #!/usr/bin/env bash + + set -euo pipefail + + if [[ -n "${PUBLISH+x}" ]]; then + pack package-buildpack \ + "${PACKAGE}:${VERSION}" \ + --config "${HOME}"/package.toml \ + --publish + + echo "::set-output name=digest::$(crane digest "${PACKAGE}:${VERSION}")" + else + pack package-buildpack \ + "${PACKAGE}:${VERSION}" \ + --config "${HOME}"/package.toml + fi + env: + PACKAGE: test + VERSION: ${{ steps.version.outputs.version }} + unit: + name: Unit Test + runs-on: + - ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: "1.15" + - uses: actions/cache@v2 + with: + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + path: ${{ env.HOME }}/go/pkg/mod + restore-keys: ${{ runner.os }}-go- + - name: Install richgo + run: | + #!/usr/bin/env bash + + set -euo pipefail + + GO111MODULE=on go get -u -ldflags="-s -w" github.com/kyoh86/richgo + - name: Run Tests + run: | + #!/usr/bin/env bash + + set -euo pipefail + + richgo test ./... + env: + RICHGO_FORCE_COLOR: "1" diff --git a/.github/workflows/update-draft-release.yml b/.github/workflows/update-draft-release.yml new file mode 100644 index 0000000..b86a43f --- /dev/null +++ b/.github/workflows/update-draft-release.yml @@ -0,0 +1,163 @@ +name: Update Draft Release +"on": + push: + branches: + - main +jobs: + update: + name: Update Draft Release + runs-on: + - ubuntu-latest + steps: + - id: release-drafter + uses: release-drafter/release-drafter@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/checkout@v2 + - name: Install yj + run: | + #!/usr/bin/env bash + + set -euo pipefail + + mkdir -p "${HOME}"/bin + echo "::add-path::${HOME}/bin" + + curl \ + --location \ + --show-error \ + --silent \ + --output "${HOME}"/bin/yj \ + "https://github.com/sclevine/yj/releases/download/v${YJ_VERSION}/yj-linux" + + chmod +x "${HOME}"/bin/yj + env: + YJ_VERSION: 5.0.0 + - name: Update draft release with buildpack information + run: | + #!/usr/bin/env bash + + set -euo pipefail + + PAYLOAD=$(yj -tj < buildpack.toml | jq '{ primary: . }') + + if [[ -e package.toml ]]; then + for PACKAGE in $(yj -t < package.toml | jq -r '.dependencies[].image'); do + PAYLOAD=$(jq -n -r \ + --argjson PAYLOAD "${PAYLOAD}" \ + --argjson BUILDPACK "$(crane export "${PACKAGE}" - \ + | tar xOf - --absolute-names --wildcards "/cnb/buildpacks/*/*/buildpack.toml" \ + | yj -tj)" \ + '$PAYLOAD | .buildpacks += [ $BUILDPACK ]') + done + fi + + jq -n -r \ + --argjson PAYLOAD "${PAYLOAD}" \ + --arg RELEASE_NAME "${RELEASE_NAME}" \ + '"\($PAYLOAD.primary.buildpack.name) \($RELEASE_NAME)"' \ + > "${HOME}"/name + + jq -n -r \ + --argjson PAYLOAD "${PAYLOAD}" \ + --arg RELEASE_BODY "${RELEASE_BODY}" \ + ' + def id(b): + "**ID**: `\(b.buildpack.id)`" + ; + + def included_buildpackages(b): [ + "#### Included Buildpackages:", + "Name | ID | Version", + ":--- | :- | :------", + ( b | sort_by(.buildpack.name | ascii_downcase) | map("\(.buildpack.name) | `\(.buildpack.id)` | `\(.buildpack.version)`") ), + "" + ]; + + def stacks(s): [ + "#### Supported Stacks:", + ( s | sort_by(.id | ascii_downcase) | map("- `\(.id)`") ), + "" + ]; + + def default_dependency_versions(d): [ + "#### Default Dependency Versions:", + "ID | Version", + ":- | :------", + ( d | to_entries | sort_by(.key | ascii_downcase) | map("`\(.key)` | `\(.value)`") ), + "" + ]; + + def dependencies(d): [ + "#### Dependencies:", + "Name | Version | SHA256", + ":--- | :------ | :-----", + ( d | sort_by(.name | ascii_downcase) | map("\(.name) | `\(.version)` | `\(.sha256)`")), + "" + ]; + + def order_groupings(o): [ + "
", + "Order Groupings", + "", + ( o | map([ + "ID | Version | Optional", + ":- | :------ | :-------", + ( .group | map([ "`\(.id)` | `\(.version)`", ( select(.optional) | "| `\(.optional)`" ) ] | join(" ")) ), + "" + ])), + "
", + "" + ]; + + def primary_buildpack(p): [ + id(p.primary), + "**Digest**: ", + "", + ( select(p.buildpacks) | included_buildpackages(p.buildpacks) ), + ( select(p.primary.stacks) | stacks(p.primary.stacks) ), + ( select(p.primary.metadata."default-versions") | default_dependency_versions(p.primary.metadata."default-versions") ), + ( select(p.primary.metadata.dependencies) | dependencies(p.primary.metadata.dependencies) ), + ( select(p.primary.order) | order_groupings(p.primary.order) ), + ( select(p.buildpacks) | "---" ), + "" + ]; + + def nested_buildpack(b): [ + "
", + "\(b.buildpack.name) \(b.buildpack.version)", + "", + id(b), + "", + ( select(b.stacks) | stacks(b.stacks) ), + ( select(b.metadata."default-versions") | default_dependency_versions(b.metadata."default-versions") ), + ( select(b.metadata.dependencies) | dependencies(b.metadata.dependencies) ), + ( select(b.order) | order_groupings(b.order) ), + "---", + "", + "
", + "" + ]; + + $PAYLOAD | [ + primary_buildpack(.), + ( select(.buildpacks) | [ .buildpacks | sort_by(.buildpack.name | ascii_downcase) | map(nested_buildpack(.)) ] ), + "", + "---", + "", + $RELEASE_BODY + ] | flatten | join("\n") + ' > "${HOME}"/body + + gh api \ + --method PATCH \ + "/repos/:owner/:repo/releases/${RELEASE_ID}" \ + --field "tag_name=${RELEASE_TAG_NAME}" \ + --field "name=@${HOME}/name" \ + --field "body=@${HOME}/body" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_BODY: ${{ steps.release-drafter.outputs.body }} + RELEASE_ID: ${{ steps.release-drafter.outputs.id }} + RELEASE_NAME: ${{ steps.release-drafter.outputs.name }} + RELEASE_TAG_NAME: ${{ steps.release-drafter.outputs.tag_name }} diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..c3b2fc0 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @paketo-buildpacks/java-buildpacks \ No newline at end of file