diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 352f70d..2df55a4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -22,9 +22,31 @@ jobs: prerelease: true tag_name: nightly - binary-build: + generate-metadata: runs-on: ubuntu-latest needs: create-release + outputs: + VERSION: ${{ steps.metadata.outputs.VERSION }} + COMMIT_HASH: ${{ steps.metadata.outputs.COMMIT_HASH }} + BUILD_TIMESTAMP: ${{ steps.metadata.outputs.BUILD_TIMESTAMP }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: nightly + + - name: Generate metadata + id: metadata + run: | + echo "VERSION=nightly" >> "$GITHUB_OUTPUT" + echo "COMMIT_HASH=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + echo "BUILD_TIMESTAMP=$(date '+%Y-%m-%dT%H:%M:%S')" >> "$GITHUB_OUTPUT" + + binary-build: + runs-on: ubuntu-latest + needs: + - create-release + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -46,11 +68,7 @@ jobs: - name: Install backend dependencies run: | - go mod tidy - - - name: Set version - run: | - echo nightly > internal/assets/version + go mod download - name: Build frontend run: | @@ -60,7 +78,7 @@ jobs: - name: Build run: | cp -r frontend/dist internal/assets/dist - CGO_ENABLED=0 go build -ldflags "-s -w" -o tinyauth-amd64 + go build -ldflags "-s -w -X tinyauth/internal/constants.Version=${{ needs.generate-metadata.outputs.VERSION }} -X tinyauth/internal/constants.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X tinyauth/internal/constants.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-amd64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -70,7 +88,9 @@ jobs: binary-build-arm: runs-on: ubuntu-24.04-arm - needs: create-release + needs: + - create-release + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -92,11 +112,7 @@ jobs: - name: Install backend dependencies run: | - go mod tidy - - - name: Set version - run: | - echo nightly > internal/assets/version + go mod download - name: Build frontend run: | @@ -106,7 +122,7 @@ jobs: - name: Build run: | cp -r frontend/dist internal/assets/dist - CGO_ENABLED=0 go build -ldflags "-s -w" -o tinyauth-arm64 + go build -ldflags "-s -w -X tinyauth/internal/constants.Version=${{ needs.generate-metadata.outputs.VERSION }} -X tinyauth/internal/constants.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X tinyauth/internal/constants.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-arm64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -116,7 +132,9 @@ jobs: image-build: runs-on: ubuntu-latest - needs: create-release + needs: + - create-release + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -139,19 +157,18 @@ jobs: - 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: - context: . 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 + build-args: | + VERSION=${{ needs.generate-metadata.outputs.VERSION }} + COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }} + BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }} - name: Export digest run: | @@ -169,7 +186,9 @@ jobs: image-build-arm: runs-on: ubuntu-24.04-arm - needs: create-release + needs: + - create-release + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -200,11 +219,14 @@ jobs: uses: docker/build-push-action@v6 id: build with: - context: . 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 + build-args: | + VERSION=${{ needs.generate-metadata.outputs.VERSION }} + COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }} + BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }} - name: Export digest run: | @@ -225,7 +247,6 @@ jobs: needs: - image-build - image-build-arm - - create-release steps: - name: Download digests uses: actions/download-artifact@v4 @@ -263,7 +284,6 @@ jobs: needs: - binary-build - binary-build-arm - - create-release steps: - uses: actions/download-artifact@v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6302ee2..e233e45 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,8 +6,29 @@ on: - "v*" jobs: + generate-metadata: + runs-on: ubuntu-latest + outputs: + VERSION: ${{ steps.metadata.outputs.VERSION }} + COMMIT_HASH: ${{ steps.metadata.outputs.COMMIT_HASH }} + BUILD_TIMESTAMP: ${{ steps.metadata.outputs.BUILD_TIMESTAMP }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: nightly + + - name: Generate metadata + id: metadata + run: | + echo "VERSION=nightly" >> "$GITHUB_OUTPUT" + echo "COMMIT_HASH=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + echo "BUILD_TIMESTAMP=$(date '+%Y-%m-%dT%H:%M:%S')" >> "$GITHUB_OUTPUT" + binary-build: runs-on: ubuntu-latest + needs: + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -27,11 +48,7 @@ jobs: - name: Install backend dependencies run: | - go mod tidy - - - name: Set version - run: | - echo ${{ github.ref_name }} > internal/assets/version + go mod download - name: Build frontend run: | @@ -41,7 +58,7 @@ jobs: - name: Build run: | cp -r frontend/dist internal/assets/dist - CGO_ENABLED=0 go build -ldflags "-s -w" -o tinyauth-amd64 + go build -ldflags "-s -w -X tinyauth/internal/constants.Version=${{ needs.generate-metadata.outputs.VERSION }} -X tinyauth/internal/constants.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X tinyauth/internal/constants.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-amd64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -51,6 +68,8 @@ jobs: binary-build-arm: runs-on: ubuntu-24.04-arm + needs: + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -70,11 +89,7 @@ jobs: - name: Install backend dependencies run: | - go mod tidy - - - name: Set version - run: | - echo ${{ github.ref_name }} > internal/assets/version + go mod download - name: Build frontend run: | @@ -84,7 +99,7 @@ jobs: - name: Build run: | cp -r frontend/dist internal/assets/dist - CGO_ENABLED=0 go build -ldflags "-s -w" -o tinyauth-arm64 + go build -ldflags "-s -w -X tinyauth/internal/constants.Version=${{ needs.generate-metadata.outputs.VERSION }} -X tinyauth/internal/constants.CommitHash=${{ needs.generate-metadata.outputs.COMMIT_HASH }} -X tinyauth/internal/constants.BuildTimestamp=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }}" -o tinyauth-arm64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -94,6 +109,8 @@ jobs: image-build: runs-on: ubuntu-latest + needs: + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -114,19 +131,18 @@ 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 with: - context: . 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 + build-args: | + VERSION=${{ needs.generate-metadata.outputs.VERSION }} + COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }} + BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }} - name: Export digest run: | @@ -144,6 +160,8 @@ jobs: image-build-arm: runs-on: ubuntu-24.04-arm + needs: + - generate-metadata steps: - name: Checkout uses: actions/checkout@v4 @@ -164,19 +182,18 @@ 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 with: - context: . 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 + build-args: | + VERSION=${{ needs.generate-metadata.outputs.VERSION }} + COMMIT_HASH=${{ needs.generate-metadata.outputs.COMMIT_HASH }} + BUILD_TIMESTAMP=${{ needs.generate-metadata.outputs.BUILD_TIMESTAMP }} - name: Export digest run: | diff --git a/Dockerfile b/Dockerfile index aab29b8..4bcddd8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,8 @@ +# Arguments +ARG VERSION +ARG COMMIT_HASH +ARG BUILD_TIMESTAMP + # Site builder FROM oven/bun:1.2.12-alpine AS frontend-builder @@ -35,8 +40,8 @@ COPY ./cmd ./cmd COPY ./internal ./internal COPY --from=frontend-builder /frontend/dist ./internal/assets/dist -RUN CGO_ENABLED=0 go build -ldflags "-s -w" - +RUN go build -ldflags "-s -w -X tinyauth/internal/constants.Version=${VERSION} -X tinyauth/internal/constants.CommitHash=${COMMIT_HASH} -X tinyauth/internal/constants.BuildTimestamp=${BUILD_TIMESTAMP}" + # Runner FROM alpine:3.21 AS runner diff --git a/air.toml b/air.toml index 1353f66..58e2132 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", "echo development > internal/assets/version"] +pre_cmd = ["mkdir -p internal/assets/dist", "echo 'backend running' > internal/assets/dist/index.html"] cmd = "go build -o ./tmp/tinyauth ." bin = "tmp/tinyauth" include_ext = ["go"] diff --git a/cmd/root.go b/cmd/root.go index 84822c1..0786f8a 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -8,8 +8,8 @@ import ( totpCmd "tinyauth/cmd/totp" userCmd "tinyauth/cmd/user" "tinyauth/internal/api" - "tinyauth/internal/assets" "tinyauth/internal/auth" + "tinyauth/internal/constants" "tinyauth/internal/docker" "tinyauth/internal/handlers" "tinyauth/internal/hooks" @@ -50,7 +50,7 @@ var rootCmd = &cobra.Command{ // Logger log.Logger = log.Level(zerolog.Level(config.LogLevel)) - log.Info().Str("version", strings.TrimSpace(assets.Version)).Msg("Starting tinyauth") + log.Info().Str("version", strings.TrimSpace(constants.Version)).Msg("Starting tinyauth") // Users log.Info().Msg("Parsing users") diff --git a/cmd/version.go b/cmd/version.go new file mode 100644 index 0000000..0c6f600 --- /dev/null +++ b/cmd/version.go @@ -0,0 +1,24 @@ +package cmd + +import ( + "fmt" + "tinyauth/internal/constants" + + "github.com/spf13/cobra" +) + +// Create the version command +var versionCmd = &cobra.Command{ + Use: "version", + Short: "Print the version number of Tinyauth", + Long: `All software has versions. This is Tinyauth's`, + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("Version: %s\n", constants.Version) + fmt.Printf("Commit Hash: %s\n", constants.CommitHash) + fmt.Printf("Build Timestamp: %s\n", constants.BuildTimestamp) + }, +} + +func init() { + rootCmd.AddCommand(versionCmd) +} diff --git a/frontend/bun.lockb b/frontend/bun.lockb index a0f152b..51ee790 100755 Binary files a/frontend/bun.lockb and b/frontend/bun.lockb differ diff --git a/internal/assets/assets.go b/internal/assets/assets.go index fc88051..6918867 100644 --- a/internal/assets/assets.go +++ b/internal/assets/assets.go @@ -8,8 +8,3 @@ import ( // //go:embed dist var Assets embed.FS - -// Version file -// -//go:embed version -var Version string diff --git a/internal/constants/constants.go b/internal/constants/constants.go index 72480b6..00b6feb 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -16,3 +16,8 @@ type Claims struct { PreferredUsername string `json:"preferred_username"` Groups []string `json:"groups"` } + +// Version information +var Version = "development" +var CommitHash = "n/a" +var BuildTimestamp = "n/a"