From fe767ba78e760ff94629c2a9efdb164e06d91f0c Mon Sep 17 00:00:00 2001 From: 3u13r Date: Tue, 14 Mar 2023 14:53:33 +0100 Subject: [PATCH] introduce version.txt (#1412) --- .bazelrc | 2 +- .github/actions/build_ko/action.yml | 6 +- .../actions/build_micro_service/action.yml | 2 +- .github/actions/build_operator/action.yml | 12 +- .github/actions/os_build_variables/action.yml | 3 - .github/actions/pseudo_version/action.yml | 24 ++-- .github/workflows/build-apko-image.yml | 2 +- .github/workflows/build-os-image.yml | 2 +- hack/pseudo-version/internal/git/BUILD.bazel | 7 +- hack/pseudo-version/internal/git/git.go | 108 +----------------- hack/pseudo-version/pseudo-version.go | 31 ++--- tools/{dnf-init => dnf-init.sh} | 3 +- tools/{dnf-tree => dnf-tree.sh} | 3 +- .../{workspace_status => workspace_status.sh} | 8 +- version.txt | 1 + 15 files changed, 53 insertions(+), 161 deletions(-) rename tools/{dnf-init => dnf-init.sh} (83%) rename tools/{dnf-tree => dnf-tree.sh} (95%) rename tools/{workspace_status => workspace_status.sh} (81%) create mode 100644 version.txt diff --git a/.bazelrc b/.bazelrc index 77ca13e73..cecc519ec 100644 --- a/.bazelrc +++ b/.bazelrc @@ -12,7 +12,7 @@ build --incompatible_enable_cc_toolchain_resolution build --action_env BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 # inject version information into binaries -build --stamp --workspace_status_command=tools/workspace_status +build --stamp --workspace_status_command=tools/workspace_status.sh # strip binaries for better reproducibility build --strip=always diff --git a/.github/actions/build_ko/action.yml b/.github/actions/build_ko/action.yml index 57e173509..406d4aa88 100644 --- a/.github/actions/build_ko/action.yml +++ b/.github/actions/build_ko/action.yml @@ -83,11 +83,11 @@ runs: fi fi - if [[ -n "${{ steps.pseudo-version.outputs.pseudoVersion }}" ]]; then + if [[ -n "${{ steps.pseudo-version.outputs.version }}" ]]; then if [[ -n "${tags}" ]]; then - tags="${tags},${{ steps.pseudo-version.outputs.pseudoVersion }}" + tags="${tags},${{ steps.pseudo-version.outputs.version }}" else - tags="${{ steps.pseudo-version.outputs.pseudoVersion }}" + tags="${{ steps.pseudo-version.outputs.version }}" fi fi diff --git a/.github/actions/build_micro_service/action.yml b/.github/actions/build_micro_service/action.yml index 1bf908f10..e3405ebcd 100644 --- a/.github/actions/build_micro_service/action.yml +++ b/.github/actions/build_micro_service/action.yml @@ -49,7 +49,7 @@ runs: tags: | type=raw,value=latest,enable={{is_default_branch}} type=raw,value=${{ inputs.pushTag }},enable=${{ '' != inputs.pushTag }} - type=raw,value=${{ steps.pseudo-version.outputs.pseudoVersion }},enable=${{ '' != steps.pseudo-version.outputs.pseudoVersion }} + type=raw,value=${{ steps.pseudo-version.outputs.version }},enable=${{ '' != steps.pseudo-version.outputs.version }} type=ref,event=branch - name: Log in to the Container registry diff --git a/.github/actions/build_operator/action.yml b/.github/actions/build_operator/action.yml index 52533f4c7..7923b790f 100644 --- a/.github/actions/build_operator/action.yml +++ b/.github/actions/build_operator/action.yml @@ -53,7 +53,7 @@ runs: tags: | type=raw,value=latest,enable={{is_default_branch}} type=raw,value=${{ inputs.pushTag }},enable=${{ '' != inputs.pushTag }} - type=raw,value=${{ steps.pseudo-version.outputs.pseudoVersion }},enable=${{ '' != steps.pseudo-version.outputs.pseudoVersion }} + type=raw,value=${{ steps.pseudo-version.outputs.version }},enable=${{ '' != steps.pseudo-version.outputs.version }} type=ref,event=branch - name: Build and push container image @@ -75,11 +75,11 @@ runs: cosignPassword: ${{ inputs.cosignPassword }} - name: Bundle for pseudo version - if: steps.pseudo-version.outputs.pseudoVersion != '' && inputs.pushTag == '' + if: steps.pseudo-version.outputs.version != '' && inputs.pushTag == '' shell: bash working-directory: ${{ inputs.sourceDir }} env: - VERSION: ${{ steps.pseudo-version.outputs.pseudoVersion }} + VERSION: ${{ steps.pseudo-version.outputs.version }} run: make bundle VERSION=${VERSION#v} - name: Bundle for semantic version @@ -99,7 +99,7 @@ runs: tags: | type=raw,value=latest,enable={{is_default_branch}} type=raw,value=${{ inputs.pushTag }},enable=${{ '' != inputs.pushTag }} - type=raw,value=${{ steps.pseudo-version.outputs.pseudoVersion }},enable=${{ '' != steps.pseudo-version.outputs.pseudoVersion }} + type=raw,value=${{ steps.pseudo-version.outputs.version }},enable=${{ '' != steps.pseudo-version.outputs.version }} type=ref,event=branch - name: Build and push bundle image @@ -121,11 +121,11 @@ runs: cosignPassword: ${{ inputs.cosignPassword }} - name: Build and push catalog for pseudo versions - if: steps.pseudo-version.outputs.pseudoVersion != '' && inputs.pushTag == '' + if: steps.pseudo-version.outputs.version != '' && inputs.pushTag == '' shell: bash working-directory: ${{ inputs.sourceDir }} env: - VERSION: ${{ steps.pseudo-version.outputs.pseudoVersion }} + VERSION: ${{ steps.pseudo-version.outputs.version }} run: make VERSION=${VERSION#v} catalog-build catalog-push - name: Build and push catalog for releases diff --git a/.github/actions/os_build_variables/action.yml b/.github/actions/os_build_variables/action.yml index ec2074a99..5977bcb18 100644 --- a/.github/actions/os_build_variables/action.yml +++ b/.github/actions/os_build_variables/action.yml @@ -205,8 +205,6 @@ runs: imageType: ${{ inputs.imageType }} timestamp: ${{ steps.version.outputs.timestamp }} semver: ${{ steps.version.outputs.semanticVersion }} - pseudover: ${{ steps.version.outputs.pseudoVersion }} - branchName: ${{ steps.version.outputs.branchName }} uploadVariant: ${{ inputs.uploadVariant }} run: | echo "resourceGroupName=constellation-images" >> $GITHUB_OUTPUT @@ -265,7 +263,6 @@ runs: imageVersion: ${{ inputs.imageVersion }} imageType: ${{ inputs.imageType }} timestamp: ${{ steps.version.outputs.timestamp }} - semver: ${{ steps.version.outputs.semanticVersion }} run: | echo "project=constellation-images" >> $GITHUB_OUTPUT echo "bucket=constellation-images" >> $GITHUB_OUTPUT diff --git a/.github/actions/pseudo_version/action.yml b/.github/actions/pseudo_version/action.yml index 675c5f2a2..947b00c1a 100644 --- a/.github/actions/pseudo_version/action.yml +++ b/.github/actions/pseudo_version/action.yml @@ -2,15 +2,12 @@ name: Determine pseudo version description: "Determine go-like pseudo version to use as container image tag." outputs: - pseudoVersion: - description: "Pseudo version based on the current HEAD" - value: ${{ steps.pseudo-version.outputs.pseudoVersion }} semanticVersion: description: "Semantic version based on the current HEAD" value: ${{ steps.pseudo-version.outputs.semanticVersion }} - releaseVersion: - description: "Release version based on branch name" - value: ${{ steps.pseudo-version.outputs.releaseVersion }} + version: + description: "Version based on branch name" + value: ${{ steps.pseudo-version.outputs.version }} timestamp: description: "Commit timestamp based on the current HEAD" value: ${{ steps.pseudo-version.outputs.timestamp }} @@ -22,27 +19,22 @@ outputs: runs: using: "composite" steps: - - name: get pseudo version + - name: get version id: pseudo-version shell: bash working-directory: hack/pseudo-version run: | - if $(git rev-parse --is-shallow-repository); then - git fetch --prune --unshallow --tags -v - else - git fetch --tags -v - fi homedir="$(getent passwd $(id -u) | cut -d ":" -f 6)" export GOCACHE=${homedir}/.cache/go-build export GOPATH=${homedir}/go export GOMODCACHE=${homedir}/.cache/go-mod - pseudoVersion=$(go run .) + + version=$(go run .) semanticVersion=$(go run . -semantic-version) timestamp=$(go run . -print-timestamp) branchName=$(go run . -print-branch) - releaseVersion=$(go run . -print-release-branch) - echo "pseudoVersion=${pseudoVersion}" >> $GITHUB_OUTPUT + + echo "version=${version}" >> $GITHUB_OUTPUT echo "semanticVersion=${semanticVersion}" >> $GITHUB_OUTPUT echo "timestamp=${timestamp}" >> $GITHUB_OUTPUT echo "branchName=${branchName}" >> $GITHUB_OUTPUT - echo "releaseVersion=${releaseVersion}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/build-apko-image.yml b/.github/workflows/build-apko-image.yml index 88546d79e..9be108d81 100644 --- a/.github/workflows/build-apko-image.yml +++ b/.github/workflows/build-apko-image.yml @@ -30,7 +30,7 @@ jobs: uses: ./.github/actions/build_apko with: containerTags: | - ${{ steps.pseudo-version.outputs.pseudoVersion }} + ${{ steps.pseudo-version.outputs.version }} ${{ github.ref_name == 'main' && 'latest' || github.ref_name }} registry: ghcr.io githubToken: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build-os-image.yml b/.github/workflows/build-os-image.yml index 76c1787e1..1782f09a0 100644 --- a/.github/workflows/build-os-image.yml +++ b/.github/workflows/build-os-image.yml @@ -196,7 +196,7 @@ jobs: env: REF: ${{ steps.ref.outputs.ref }} STREAM: ${{ steps.stream.outputs.stream }} - IMAGE_VERSION: ${{ inputs.imageVersion || steps.version.outputs.pseudoVersion }} + IMAGE_VERSION: ${{ inputs.imageVersion || steps.version.outputs.version }} run: | { echo "imageVersion=${IMAGE_VERSION}" diff --git a/hack/pseudo-version/internal/git/BUILD.bazel b/hack/pseudo-version/internal/git/BUILD.bazel index 53fae2269..7ac47a391 100644 --- a/hack/pseudo-version/internal/git/BUILD.bazel +++ b/hack/pseudo-version/internal/git/BUILD.bazel @@ -5,10 +5,5 @@ go_library( srcs = ["git.go"], importpath = "github.com/edgelesssys/constellation/v2/hack/pseudo-version/internal/git", visibility = ["//hack/pseudo-version:__subpackages__"], - deps = [ - "@com_github_go_git_go_git_v5//:go-git", - "@com_github_go_git_go_git_v5//plumbing", - "@com_github_go_git_go_git_v5//plumbing/object", - "@com_github_go_git_go_git_v5//plumbing/storer", - ], + deps = ["@com_github_go_git_go_git_v5//:go-git"], ) diff --git a/hack/pseudo-version/internal/git/git.go b/hack/pseudo-version/internal/git/git.go index 491f07714..a8b4ffe05 100644 --- a/hack/pseudo-version/internal/git/git.go +++ b/hack/pseudo-version/internal/git/git.go @@ -7,20 +7,12 @@ SPDX-License-Identifier: AGPL-3.0-only package git import ( - "errors" + "fmt" "regexp" "strings" "time" git "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/go-git/go-git/v5/plumbing/object" - "github.com/go-git/go-git/v5/plumbing/storer" -) - -var ( - versionRegex = regexp.MustCompile(`^v\d+\.\d+\.\d+(?:-pre)?$`) - tagReference = regexp.MustCompile(`^refs/tags/([^/]+)$`) ) // Git represents a git repository. @@ -47,45 +39,6 @@ func (g *Git) Revision() (string, time.Time, error) { return commitRef.Hash().String()[:12], commit.Committer.When, nil } -// FirstParentWithVersionTag returns the first parent of the HEAD commit (or HEAD itself) that has a version tag. -func (g *Git) FirstParentWithVersionTag() (revision string, versionTag string, err error) { - commitRef, err := g.repo.Head() - if err != nil { - return "", "", err - } - commit, err := g.repo.CommitObject(commitRef.Hash()) - if err != nil { - return "", "", err - } - commitToHash, err := g.tagsByRevisionHash() - if err != nil { - return "", "", err - } - - iter := object.NewCommitIterCTime(commit, nil, nil) - if err := iter.ForEach( - func(c *object.Commit) error { - tags, ok := commitToHash[c.Hash.String()] - if !ok { - return nil - } - version := g.findVersionTag(tags) - if version == nil { - return nil - } - versionTag = *version - revision = c.Hash.String() - return storer.ErrStop - }, - ); err != nil { - return "", "", err - } - if revision == "" || versionTag == "" { - return "", "", errors.New("no version tag found") - } - return revision, versionTag, nil -} - // ParsedBranchName returns the name of the current branch. // Special characters are replaced with "-", and the name is lowercased and trimmed to 49 characters. // This makes sure that the branch name is usable as a GCP image name. @@ -117,60 +70,11 @@ func (g *Git) BranchName() (string, error) { return commitRef.Name().Short(), nil } -// tagsByRevisionHash returns a map from revision hash to a list of associated tags. -func (g *Git) tagsByRevisionHash() (map[string][]string, error) { - tags := make(map[string][]string) - refs, err := g.repo.Tags() +// Path returns the path of the git repository. +func (g *Git) Path() (string, error) { + worktree, err := g.repo.Worktree() if err != nil { - return nil, err + return "", fmt.Errorf("failed to get worktree: %w", err) } - if err := refs.ForEach( - func(ref *plumbing.Reference) error { - hash, err := g.tagRefToHash(ref) - if err != nil { - return err - } - message, err := tagRefToName(ref) - if err != nil { - return err - } - tags[hash] = append(tags[hash], message) - return nil - }, - ); err != nil { - return nil, err - } - return tags, nil -} - -// findVersionTag tries to find a tag for a semantic version (e.g.: v1.0.0). -func (g *Git) findVersionTag(tags []string) *string { - for _, tag := range tags { - if versionRegex.MatchString(tag) { - return &tag - } - } - return nil -} - -func (g *Git) tagRefToHash(tagRef *plumbing.Reference) (string, error) { - tagObject, err := g.repo.TagObject(tagRef.Hash()) - switch err { - case nil: - return tagObject.Target.String(), nil - case plumbing.ErrObjectNotFound: - return tagRef.Hash().String(), nil - default: - // Some other error - return "", err - } -} - -// tagRefToName extracts the name of a tag reference. -func tagRefToName(tagRef *plumbing.Reference) (string, error) { - matches := tagReference.FindStringSubmatch(tagRef.Name().String()) - if len(matches) != 2 { - return "", errors.New("invalid tag reference") - } - return matches[1], nil + return worktree.Filesystem.Root(), nil } diff --git a/hack/pseudo-version/pseudo-version.go b/hack/pseudo-version/pseudo-version.go index 909c55253..4df912667 100644 --- a/hack/pseudo-version/pseudo-version.go +++ b/hack/pseudo-version/pseudo-version.go @@ -9,6 +9,8 @@ package main import ( "flag" "fmt" + "os" + "path/filepath" "strings" "time" @@ -24,7 +26,6 @@ func main() { printTimestamp := flag.Bool("print-timestamp", false, "Only print timestamp") timestampFormat := flag.String("timestamp-format", "20060102150405", "Timestamp format") printBranch := flag.Bool("print-branch", false, "Only print branch name") - printReleaseVersion := flag.Bool("print-release-branch", false, "Only print release branch version") major := flag.String("major", "v0", "Optional major version") base := flag.String("base", "", "Optional base version") revisionTimestamp := flag.String("time", "", "Optional revision time") @@ -44,18 +45,18 @@ func main() { log.With(zap.Error(err)).Fatalf("Failed to get parsed branch name") } - rawBranch, err := gitc.BranchName() - if err != nil { - log.With(zap.Error(err)).Fatalf("Failed to get branch name") - } - if *base == "" { - _, versionTag, err := gitc.FirstParentWithVersionTag() + rootPath, err := gitc.Path() if err != nil { - log.With(zap.Error(err)).Warnf("Failed to find base version. Using default.") - versionTag = "" + log.With(zap.Error(err)).Fatalf("Failed to get git root path. Using default base version.") + } else { + versionTag, err := os.ReadFile(filepath.Join(rootPath, "version.txt")) + if err != nil { + log.With(zap.Error(err)).Warnf("Failed to read version.txt. Using default base version.") + } else { + *base = strings.TrimSpace(string(versionTag)) + } } - *base = versionTag } var headRevision string @@ -91,9 +92,13 @@ func main() { fmt.Println(headTime.Format(*timestampFormat)) case *printBranch: fmt.Println(parsedBranch) - case *printReleaseVersion: - fmt.Println(strings.TrimPrefix(rawBranch, "release/")) default: - fmt.Println(version) + if !strings.Contains(*base, "pre") { + // "v2.7.0" inside the version.txt will lead to "v2.7.0" as version + fmt.Println(*base) + } else { + // "2.7.0-pre" inside the version.txt will lead to "v2.7.0-pre.0.20230313121936-bab76e8a9acf" as version + fmt.Println(version) + } } } diff --git a/tools/dnf-init b/tools/dnf-init.sh similarity index 83% rename from tools/dnf-init rename to tools/dnf-init.sh index 87522bd54..b2df3f243 100755 --- a/tools/dnf-init +++ b/tools/dnf-init.sh @@ -1,4 +1,5 @@ -#!/bin/sh +#!/usr/bin/env bash + rm -f rpm/repo.yaml bazel run //:bazeldnf -- init \ --fc 37 \ diff --git a/tools/dnf-tree b/tools/dnf-tree.sh similarity index 95% rename from tools/dnf-tree rename to tools/dnf-tree.sh index 5c939eeaa..14e72f49f 100755 --- a/tools/dnf-tree +++ b/tools/dnf-tree.sh @@ -1,4 +1,5 @@ -#!/bin/sh +#!/usr/bin/env bash + bazel run //:bazeldnf -- fetch \ --repofile rpm/repo.yaml bazel run //:bazeldnf -- rpmtree \ diff --git a/tools/workspace_status b/tools/workspace_status.sh similarity index 81% rename from tools/workspace_status rename to tools/workspace_status.sh index ec7417a23..1f8f82a17 100755 --- a/tools/workspace_status +++ b/tools/workspace_status.sh @@ -13,12 +13,8 @@ ensure_pseudo_version_tool() { } pseudo_version() { - if [[ -f "${REPOSITORY_ROOT}/.version.txt" ]]; then - cat "${REPOSITORY_ROOT}/.version.txt" - else - ensure_pseudo_version_tool - "${REPOSITORY_ROOT}/tools/pseudo-version" -skip-v - fi + ensure_pseudo_version_tool + "${REPOSITORY_ROOT}/tools/pseudo-version" -skip-v } timestamp() { diff --git a/version.txt b/version.txt new file mode 100644 index 000000000..880cd0621 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +v2.7.0-pre