From ff48fa320ebd478c2979ae01865288c4f6d011ac Mon Sep 17 00:00:00 2001 From: Stavros Date: Thu, 15 May 2025 16:41:26 +0300 Subject: [PATCH] feat: nightly release workflow --- .github/workflows/ci.yml | 14 +- .github/workflows/nightly.yml | 267 ++++++++++++++++++++++++++++++++++ .github/workflows/release.yml | 32 +++- .gitignore | 5 +- CONTRIBUTING.md | 13 +- air.toml | 2 +- cmd/root.go | 2 +- internal/assets/version | 1 - 8 files changed, 313 insertions(+), 23 deletions(-) create mode 100644 .github/workflows/nightly.yml delete mode 100644 internal/assets/version diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4de1065..eab454c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,21 +12,23 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup Go + - name: Setup bun + uses: oven-sh/setup-bun@v2 + + - name: Setup go uses: actions/setup-go@v5 with: go-version: "^1.23.2" - - name: Setup bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - name: Install frontend dependencies run: | cd frontend bun install + - name: Set version + run: | + echo testing > internal/assets/version + - name: Build frontend run: | cd frontend diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 0000000..cbfe753 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,267 @@ +name: Nightly Release +on: + workflow_dispatch: + +jobs: + create-release: + runs-on: ubuntu-latest + steps: + - name: Delete old release + run: gh release delete --cleanup-tag --yes nightly + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OWNER: ${{ github.repository_owner }} + REPO: ${{ github.event.repository.name }} + + - name: Create release + uses: softprops/action-gh-release@v2 + with: + prerelease: true + tag_name: nightly + + binary-build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: nightly + + - name: Install bun + uses: oven-sh/setup-bun@v2 + + - name: Install go + uses: actions/setup-go@v5 + with: + go-version: "^1.23.2" + + - name: Install frontend dependencies + run: | + cd frontend + bun install + + - name: Install backend dependencies + run: | + go mod tidy + + - name: Set version + run: | + echo nightly > internal/assets/version + + - name: Build frontend + run: | + cd frontend + bun run build + + - name: Build + run: | + cp -r frontend/dist internal/assets/dist + CGO_ENABLED=0 go build -ldflags "-s -w" -o tinyauth-amd64 + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: tinyauth-amd64 + path: tinyauth-amd64 + + binary-build-arm: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: nightly + + - name: Install bun + uses: oven-sh/setup-bun@v2 + + - name: Install go + uses: actions/setup-go@v5 + with: + go-version: "^1.23.2" + + - name: Install frontend dependencies + run: | + cd frontend + bun install + + - name: Install backend dependencies + run: | + go mod tidy + + - name: Set version + run: | + echo nightly > internal/assets/version + + - name: Build frontend + run: | + cd frontend + bun run build + + - name: Build + run: | + cp -r frontend/dist internal/assets/dist + CGO_ENABLED=0 go build -ldflags "-s -w" -o tinyauth-arm64 + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: tinyauth-arm64 + path: tinyauth-arm64 + + image-build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: nightly + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository_owner }}/tinyauth + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Set version + run: | + echo nightly > internal/assets/version + + - name: Build and push + uses: docker/build-push-action@v6 + id: build + with: + platforms: linux/amd64 + labels: ${{ steps.meta.outputs.labels }} + tags: ghcr.io/${{ github.repository_owner }}/tinyauth + outputs: type=image,push-by-digest=true,name-canonical=true,push=true + + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-linux-amd64 + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + image-build-arm: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: nightly + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository_owner }}/tinyauth + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Set version + run: | + echo nightly > internal/assets/version + + - name: Build and push + uses: docker/build-push-action@v6 + id: build + with: + platforms: linux/arm64 + labels: ${{ steps.meta.outputs.labels }} + tags: ghcr.io/${{ github.repository_owner }}/tinyauth + outputs: type=image,push-by-digest=true,name-canonical=true,push=true + + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-linux-arm64 + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + image-merge: + runs-on: ubuntu-latest + needs: + - image-build + - image-build-arm + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository_owner }}/tinyauth + tags: | + type=raw,nightly + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf 'ghcr.io/${{ github.repository_owner }}/tinyauth@sha256:%s ' *) + + update-release: + runs-on: ubuntu-latest + needs: + - binary-build + - binary-build-arm + steps: + - uses: actions/download-artifact@v4 + with: + pattern: tinyauth-* + path: binaries + merge-multiple: true + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: binaries/* + tag_name: nightly diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 33e63de..be51c73 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,11 +12,11 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest + - name: Install bun + uses: oven-sh/setup-bun@v2 - - uses: actions/setup-go@v5 + - name: Install go + uses: actions/setup-go@v5 with: go-version: "^1.23.2" @@ -29,6 +29,10 @@ jobs: run: | go mod tidy + - name: Set version + run: | + echo ${{ github.ref_name }} > internal/assets/version + - name: Build frontend run: | cd frontend @@ -51,11 +55,11 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest + - name: Install bun + uses: oven-sh/setup-bun@v2 - - uses: actions/setup-go@v5 + - name: Install go + uses: actions/setup-go@v5 with: go-version: "^1.23.2" @@ -68,6 +72,10 @@ jobs: run: | go mod tidy + - name: Set version + run: | + echo ${{ github.ref_name }} > internal/assets/version + - name: Build frontend run: | cd frontend @@ -106,6 +114,10 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Set version + run: | + echo ${{ github.ref_name }} > internal/assets/version + - name: Build and push uses: docker/build-push-action@v6 id: build @@ -151,6 +163,10 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Set version + run: | + echo ${{ github.ref_name }} > internal/assets/version + - name: Build and push uses: docker/build-push-action@v6 id: build diff --git a/.gitignore b/.gitignore index 85a9ff8..8cb2bae 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,7 @@ secret_oauth.txt .env # tmp directory -tmp \ No newline at end of file +tmp + +# version files +internal/assets/version \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3e664a0..079d181 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -Contributing is relatively easy, you just need to follow the steps carefully and you will be up and running with a development server in less than 5 minutes. +Contributing is relatively easy, you just need to follow the steps below and you will be up and running with a development server in less than five minutes. ## Requirements @@ -20,7 +20,7 @@ cd tinyauth ## Install requirements -Although you will not need the requirements in your machine since the development will happen in docker, I still recommend to install them because this way you will not have import errors, to install the go requirements, run: +Although you will not need the requirements in your machine since the development will happen in docker, I still recommend to install them because this way you will not have import errors. To install the go requirements run: ```sh go mod tidy @@ -35,7 +35,7 @@ bun install ## Create your `.env` file -In order to configure the app you need to create an environment file, this can be done by copying the `.env.example` file to `.env` and modifying the environment variables inside to suit your needs. +In order to configure the app you need to create an environment file, this can be done by copying the `.env.example` file to `.env` and modifying the environment variables to suit your needs. ## Developing @@ -46,11 +46,14 @@ I have designed the development workflow to be entirely in docker, this is becau dev.example.com -> 127.0.0.1 ``` -Then you can just make sure the domains are correct in the example docker compose file and run: +> [!TIP] +> You can use [sslip.io](https://sslip.io) as a domain if you don't have one to develop with. + +Then you can just make sure the domains are correct in the development docker compose file and run: ```sh docker compose -f docker-compose.dev.yml up --build ``` > [!NOTE] -> I would recommend copying the example `docker-compose.dev.yml` into a `docker-compose.test.yml` file, so as you don't accidentally commit any sensitive information. +> I recommend copying the example `docker-compose.dev.yml` into a `docker-compose.test.yml` file, so as you don't accidentally commit any sensitive information. diff --git a/air.toml b/air.toml index 58e2132..1353f66 100644 --- a/air.toml +++ b/air.toml @@ -2,7 +2,7 @@ root = "/tinyauth" tmp_dir = "tmp" [build] -pre_cmd = ["mkdir -p internal/assets/dist", "echo 'backend running' > internal/assets/dist/index.html"] +pre_cmd = ["mkdir -p internal/assets/dist", "echo 'backend running' > internal/assets/dist/index.html", "echo development > internal/assets/version"] cmd = "go build -o ./tmp/tinyauth ." bin = "tmp/tinyauth" include_ext = ["go"] diff --git a/cmd/root.go b/cmd/root.go index eabbfb6..84822c1 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -50,7 +50,7 @@ var rootCmd = &cobra.Command{ // Logger log.Logger = log.Level(zerolog.Level(config.LogLevel)) - log.Info().Str("version", assets.Version).Msg("Starting tinyauth") + log.Info().Str("version", strings.TrimSpace(assets.Version)).Msg("Starting tinyauth") // Users log.Info().Msg("Parsing users") diff --git a/internal/assets/version b/internal/assets/version deleted file mode 100644 index e682ea4..0000000 --- a/internal/assets/version +++ /dev/null @@ -1 +0,0 @@ -v3.3.0 \ No newline at end of file