From dff7a601084b6c282af73dd512cb0cb9c13b7bb6 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Sat, 18 May 2024 05:52:48 -0400 Subject: [PATCH] feat: add ability to create releases from a github workflow This automates all the drudge-work necessary for creating a release, freeing up time to do actual development. --- .editorconfig | 17 ++++ .github/.ruby-version | 1 + .github/Gemfile | 6 ++ .github/Gemfile.lock | 68 +++++++++++++++ .github/dependabot.yml | 4 + .github/workflows/bump-version.yml | 52 ++++++++++++ .github/workflows/ci.yml | 15 +--- .github/workflows/codeql-analysis.yml | 10 ++- .github/workflows/lint.yml | 13 ++- .github/workflows/tagged-release.yml | 114 ++++++++++++++++++++++++++ Makefile | 2 + 11 files changed, 278 insertions(+), 24 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/.ruby-version create mode 100644 .github/Gemfile create mode 100644 .github/Gemfile.lock create mode 100644 .github/workflows/bump-version.yml create mode 100644 .github/workflows/tagged-release.yml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d58eb07 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[*] +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[Makefile] +insert_final_newline = true +indent_style = tab +indent_size = 4 + +[*.go] +insert_final_newline = true +indent_style = tab +indent_size = 4 diff --git a/.github/.ruby-version b/.github/.ruby-version new file mode 100644 index 0000000..bea438e --- /dev/null +++ b/.github/.ruby-version @@ -0,0 +1 @@ +3.3.1 diff --git a/.github/Gemfile b/.github/Gemfile new file mode 100644 index 0000000..ff72eaf --- /dev/null +++ b/.github/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +ruby file: ".ruby-version" + +gem "fpm" +gem "package_cloud" diff --git a/.github/Gemfile.lock b/.github/Gemfile.lock new file mode 100644 index 0000000..d05f444 --- /dev/null +++ b/.github/Gemfile.lock @@ -0,0 +1,68 @@ +GEM + remote: https://rubygems.org/ + specs: + arr-pm (0.0.12) + backports (3.25.0) + cabin (0.9.0) + clamp (1.0.1) + domain_name (0.6.20240107) + dotenv (3.1.2) + fpm (1.15.1) + arr-pm (~> 0.0.11) + backports (>= 2.6.2) + cabin (>= 0.6.0) + clamp (~> 1.0.0) + pleaserun (~> 0.0.29) + rexml + stud + highline (2.0.3) + http-accept (1.7.0) + http-cookie (1.0.5) + domain_name (~> 0.5) + insist (1.0.0) + json_pure (2.3.1) + mime-types (3.5.2) + mime-types-data (~> 3.2015) + mime-types-data (3.2024.0507) + mustache (0.99.8) + netrc (0.11.0) + package_cloud (0.3.14) + highline (~> 2.0.0) + json_pure (~> 2.3.0) + rainbow (= 2.2.2) + rest-client (~> 2.0) + thor (~> 1.2) + pleaserun (0.0.32) + cabin (> 0) + clamp + dotenv + insist + mustache (= 0.99.8) + stud + rainbow (2.2.2) + rake + rake (13.2.1) + rest-client (2.1.0) + http-accept (>= 1.7.0, < 2.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) + rexml (3.2.8) + strscan (>= 3.0.9) + strscan (3.1.0) + stud (0.0.23) + thor (1.3.1) + +PLATFORMS + arm64-darwin-23 + ruby + +DEPENDENCIES + fpm + package_cloud + +RUBY VERSION + ruby 3.3.1p55 + +BUNDLED WITH + 2.5.9 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 99b6fb4..856ab51 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,6 +1,10 @@ --- version: 2 updates: + - package-ecosystem: "bundler" + directory: "/.github" + schedule: + interval: "daily" - package-ecosystem: "docker" directory: "/" schedule: diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml new file mode 100644 index 0000000..9894bf2 --- /dev/null +++ b/.github/workflows/bump-version.yml @@ -0,0 +1,52 @@ +--- +name: "bump-version" + +# yamllint disable-line rule:truthy +on: + workflow_dispatch: + inputs: + bump_type: + description: "Bump type" + default: "patch" + required: true + type: choice + options: + - patch + - minor + - major + +env: + GITHUB_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} + +jobs: + bump-version: + name: bump-version + runs-on: ubuntu-22.04 + + steps: + - name: Checkout + uses: actions/checkout@v4.1.4 + with: + fetch-depth: 0 + token: ${{ env.GITHUB_ACCESS_TOKEN }} + + - name: Get Latest Tag + id: latest-tag + run: | + echo GIT_LATEST_TAG="$(git describe --tags "$(git rev-list --tags --max-count=1)")" >>"$GITHUB_OUTPUT" + + - name: Compute Next Tag + id: next-tag + uses: docker://ghcr.io/dokku/semver-generator:latest + with: + bump: ${{ github.event.inputs.bump_type }} + input: ${{ steps.latest-tag.outputs.GIT_LATEST_TAG }} + + - name: Create and Push Tag + run: | + git config --global user.name 'Dokku Bot' + git config --global user.email no-reply@dokku.com + git tag "$GIT_NEXT_TAG" + git push origin "$GIT_NEXT_TAG" + env: + GIT_NEXT_TAG: ${{ steps.next-tag.outputs.version }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65821b4..75f5291 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,18 +5,15 @@ name: CI on: pull_request: branches: - - '*' + - "*" push: branches: - - 'master' - - 'release' + - "main" jobs: build: name: build runs-on: ubuntu-22.04 - strategy: - fail-fast: true env: GITHUB_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }} @@ -35,11 +32,3 @@ jobs: with: name: build path: build/**/* - - name: make release-in-docker - run: | - if [[ "${GITHUB_REF#refs/heads/}" == "release" ]]; then - export CI_BRANCH=${GITHUB_REF#refs/heads/} - export PACKAGECLOUD_REPOSITORY=dokku/dokku - rm .env.docker - make .env.docker release-in-docker release-packagecloud-in-docker - fi diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 432591e..dd6ed78 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -4,11 +4,13 @@ name: "CodeQL" # yamllint disable-line rule:truthy on: push: - branches: [master] + branches: + - "main" pull_request: - branches: [master] + branches: + - "main" schedule: - - cron: '31 22 * * 5' + - cron: "31 22 * * 5" jobs: analyze: @@ -22,7 +24,7 @@ jobs: strategy: fail-fast: false matrix: - language: ['go'] + language: ["go"] steps: - name: Checkout repository diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9511f14..d3b3a89 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,14 +1,14 @@ --- -name: 'lint' +name: "lint" # yamllint disable-line rule:truthy on: pull_request: branches: - - '*' + - "*" push: branches: - - 'master' + - "main" jobs: hadolint: @@ -19,7 +19,6 @@ jobs: uses: actions/checkout@v4 - name: Run hadolint uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf - # v1.5.0 => c27bd9edc1e95eed30474db8f295ff5807ebca14 markdown-lint: name: markdown-lint @@ -31,8 +30,8 @@ jobs: uses: avto-dev/markdown-lint@04d43ee9191307b50935a753da3b775ab695eceb # v1.5.0 => 04d43ee9191307b50935a753da3b775ab695eceb with: - config: '.github/linters/.markdown-lint.yml' - args: './README.md' + config: ".github/linters/.markdown-lint.yml" + args: "./README.md" shellcheck: name: shellcheck @@ -71,4 +70,4 @@ jobs: uses: ibiqlik/action-yamllint@2576378a8e339169678f9939646ee3ee325e845c # v3.0.2 => c19bd0523a9011c3a3960fe6640a0882b59af15d with: - config_file: '.github/linters/.yamllint.yml' + config_file: ".github/linters/.yamllint.yml" diff --git a/.github/workflows/tagged-release.yml b/.github/workflows/tagged-release.yml new file mode 100644 index 0000000..9b3dc74 --- /dev/null +++ b/.github/workflows/tagged-release.yml @@ -0,0 +1,114 @@ +--- +name: "tagged-release" + +# yamllint disable-line rule:truthy +on: + push: + tags: + - "*" + +permissions: + attestations: write + id-token: write + contents: write + +jobs: + tagged-release: + name: tagged-release + runs-on: ubuntu-22.04 + env: + CI_BRANCH: release + PACKAGECLOUD_REPOSITORY: dokku/dokku + VERSION: ${{ github.ref_name }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: "go.mod" + + - name: Get Repository Name + id: repo-name + run: | + echo "REPOSITORY_NAME=$(echo "${{ github.repository }}" | cut -d '/' -f 2)" >> $GITHUB_OUTPUT + + - name: Build binaries + uses: crazy-max/ghaction-xgo@v3 + with: + xgo_version: latest + go_version: 1.21 + dest: dist + prefix: ${{ steps.repo-name.outputs.REPOSITORY_NAME }} + targets: darwin/amd64,darwin/arm64,linux/arm64,linux/amd64,windows/amd64 + v: true + x: false + race: false + ldflags: -s -w -X main.Version=${{ github.ref_name }} + buildmode: default + trimpath: true + + - name: Attest Build Provenance - darwin-amd64 + uses: actions/attest-build-provenance@v1.1.2 + with: + subject-path: "dist/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-darwin-amd64" + + - name: Attest Build Provenance - darwin-arm64 + uses: actions/attest-build-provenance@v1.1.2 + with: + subject-path: "dist/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-darwin-arm64" + + - name: Attest Build Provenance - linux-amd64 + uses: actions/attest-build-provenance@v1.1.2 + with: + subject-path: "dist/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-linux-amd64" + + - name: Attest Build Provenance - linux-arm64 + uses: actions/attest-build-provenance@v1.1.2 + with: + subject-path: "dist/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-linux-arm64" + + - name: Attest Build Provenance - windows-amd64 + uses: actions/attest-build-provenance@v1.1.2 + with: + subject-path: "dist/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-windows-amd64.exe" + + - name: Setup Ruby + uses: ruby/setup-ruby@v1.176.0 + with: + bundler-cache: true + working-directory: .github + + - name: Build Debian Packages + run: | + mkdir -p build/linux + + cp dist/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-linux-amd64 build/linux/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-amd64 + cp dist/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-linux-arm64 build/linux/${{ steps.repo-name.outputs.REPOSITORY_NAME }}-arm64 + + bundle exec make build/deb/${{ steps.repo-name.outputs.REPOSITORY_NAME }}_${{ github.ref_name }}_arm64.deb + bundle exec make build/deb/${{ steps.repo-name.outputs.REPOSITORY_NAME }}_${{ github.ref_name }}_amd64.deb + cp build/deb/*.deb dist/ + env: + BUNDLE_GEMFILE: .github/Gemfile + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist/* + + - name: Release to PackageCloud + run: bundle exec make release-packagecloud + env: + BUNDLE_GEMFILE: .github/Gemfile + PACKAGECLOUD_TOKEN: ${{ secrets.PACKAGECLOUD_TOKEN }} + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: dist/* + generate_release_notes: true + make_latest: "true" diff --git a/Makefile b/Makefile index f634819..621b507 100644 --- a/Makefile +++ b/Makefile @@ -165,10 +165,12 @@ release-packagecloud: release-packagecloud-deb: build/deb/$(NAME)_$(VERSION)_amd64.deb build/deb/$(NAME)_$(VERSION)_arm64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/ubuntu/focal build/deb/$(NAME)_$(VERSION)_amd64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/ubuntu/jammy build/deb/$(NAME)_$(VERSION)_amd64.deb + package_cloud push $(PACKAGECLOUD_REPOSITORY)/ubuntu/noble build/deb/$(NAME)_$(VERSION)_amd64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/debian/bullseye build/deb/$(NAME)_$(VERSION)_amd64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/debian/bookworm build/deb/$(NAME)_$(VERSION)_amd64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/ubuntu/focal build/deb/$(NAME)_$(VERSION)_arm64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/ubuntu/jammy build/deb/$(NAME)_$(VERSION)_arm64.deb + package_cloud push $(PACKAGECLOUD_REPOSITORY)/ubuntu/noble build/deb/$(NAME)_$(VERSION)_arm64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/debian/bullseye build/deb/$(NAME)_$(VERSION)_arm64.deb package_cloud push $(PACKAGECLOUD_REPOSITORY)/debian/bookworm build/deb/$(NAME)_$(VERSION)_arm64.deb