Skip to content

Commit

Permalink
Cleanup from first release with dagger
Browse files Browse the repository at this point in the history
  • Loading branch information
marccampbell committed Oct 18, 2024
1 parent 24ddfa7 commit 9eb0cc1
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 152 deletions.
53 changes: 0 additions & 53 deletions .goreleaser-nodocker.yaml

This file was deleted.

2 changes: 1 addition & 1 deletion .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ brews:
- homepage: https://docs.replicated.com/reference/replicated-cli-installing
description: "Package Replicated applications and manage releases, channels, customers and entitlements using a command-line interface."
repository:
name: replicatedhq/replicated
name: homebrew-replicated
owner: replicatedhq
branch: main
install: bin.install "replicated"
Expand Down
35 changes: 6 additions & 29 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,37 +1,10 @@
API_PKGS=apps channels releases

VERSION=$(shell git describe)
ABBREV_VERSION=$(shell git describe --abbrev=0)
VERSION_PACKAGE = github.com/replicatedhq/replicated/pkg/version
DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"`
BUILDTAGS = containers_image_ostree_stub exclude_graphdriver_devicemapper exclude_graphdriver_btrfs containers_image_openpgp

export GO111MODULE=on

GIT_TREE = $(shell git rev-parse --is-inside-work-tree 2>/dev/null)
ifneq "$(GIT_TREE)" ""
define GIT_UPDATE_INDEX_CMD
git update-index --assume-unchanged
endef
define GIT_SHA
`git rev-parse HEAD`
endef
else
define GIT_UPDATE_INDEX_CMD
echo "Not a git repo, skipping git update-index"
endef
define GIT_SHA
""
endef
endif

define LDFLAGS
-ldflags "\
-X ${VERSION_PACKAGE}.version=${VERSION} \
-X ${VERSION_PACKAGE}.gitSHA=${GIT_SHA} \
-X ${VERSION_PACKAGE}.buildTime=${DATE} \
"
endef
export CGO_ENABLED=0

.PHONY: test-unit
test-unit:
Expand Down Expand Up @@ -138,4 +111,8 @@ docs:

.PHONE: release
release:
dagger call release --one-password-service-account env:OP_SERVICE_ACCOUNT_PRODUCTION --version $(version)
dagger call release \
--one-password-service-account-production env:OP_SERVICE_ACCOUNT_PRODUCTION \
--version $(version) \
--github-token env:GITHUB_TOKEN \
--progress plain
145 changes: 127 additions & 18 deletions dagger/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import (
"context"
"dagger/replicated/internal/dagger"
"encoding/json"
"errors"
"fmt"
"net/http"
"strings"

"github.com/Masterminds/semver"
)
Expand All @@ -27,32 +29,68 @@ func (r *Replicated) Release(
clean bool,

onePasswordServiceAccountProduction *dagger.Secret,

githubToken *dagger.Secret,
) error {
gitTreeOK, err := checkGitTree(ctx, source)
gitTreeOK, err := checkGitTree(ctx, source, githubToken)
if err != nil {
return err
}
if !gitTreeOK {
return fmt.Errorf("git tree is not clean")
return fmt.Errorf("Your git tree is not clean. You cannot release what's not commited.")
}

major, minor, patch, err := parseVersion(ctx, version)
latestVersion, err := getLatestVersion(ctx)
if err != nil {
return err
}

_ = dag.Container().
major, minor, patch, err := parseVersion(ctx, latestVersion, version)
if err != nil {
return err
}

fmt.Printf("Releasing as version %d.%d.%d\n", major, minor, patch)

githubTokenPlaintext, err := githubToken.Plaintext(ctx)
if err != nil {
return err
}
tagContainer := dag.Container().
From("alpine/git:latest").
WithMountedDirectory("/go/src/github.com/replicatedhq/replicated", source).
WithWorkdir("/go/src/github.com/replicatedhq/replicated").
WithExec([]string{"git", "tag", fmt.Sprintf("v%d.%d.%d", major, minor, patch)}).
WithExec([]string{"git", "push", "origin", fmt.Sprintf("v%d.%d.%d", major, minor, patch)})
WithExec([]string{"git", "remote", "add", "tag", fmt.Sprintf("https://%[email protected]/replicatedhq/replicated.git", githubTokenPlaintext)}).
With(CacheBustingExec([]string{"git", "tag", fmt.Sprintf("v%d.%d.%d", major, minor, patch)})).
With(CacheBustingExec([]string{"git", "push", "tag", fmt.Sprintf("v%d.%d.%d", major, minor, patch)}))
_, err = tagContainer.Stdout(ctx)
if err != nil {
return err
}

// copy the source that has the tag included in it
updatedSource := tagContainer.Directory("/go/src/github.com/replicatedhq/replicated")

// replace the version in the Makefile
buildFileContent, err := updatedSource.File("./pkg/version/build.go").Contents(ctx)
if err != nil {
return err
}
buildFileContent = strings.ReplaceAll(buildFileContent, "const version = \"unknown\"", fmt.Sprintf("const version = \"%s\"", version))
updatedSource = updatedSource.WithNewFile("./pkg/version/build.go", buildFileContent)

goModCache := dag.CacheVolume("replicated-go-mod-122")
goBuildCache := dag.CacheVolume("replicated-go-build-121")

replicatedBinary := dag.Container().
From("golang:1.22").
WithMountedDirectory("/go/src/github.com/replicatedhq/replicated", source).
WithMountedDirectory("/go/src/github.com/replicatedhq/replicated", updatedSource).
WithWorkdir("/go/src/github.com/replicatedhq/replicated").
WithExec([]string{"make", "build"}).
WithMountedCache("/go/pkg/mod", goModCache).
WithEnvVariable("GOMODCACHE", "/go/pkg/mod").
WithMountedCache("/go/build-cache", goBuildCache).
WithEnvVariable("GOCACHE", "/go/build-cache").
With(CacheBustingExec([]string{"make", "build"})).
File("/go/src/github.com/replicatedhq/replicated/bin/replicated")

dockerContainer := dag.Container().
Expand All @@ -65,6 +103,10 @@ func (r *Replicated) Release(
WithWorkdir("/out").
WithEntrypoint([]string{"/replicated"}).
WithFile("/replicated", replicatedBinary)
_, err = dockerContainer.Stdout(ctx)
if err != nil {
return err
}

username, err := dag.Onepassword().FindSecret(
onePasswordServiceAccountProduction,
Expand Down Expand Up @@ -96,12 +138,17 @@ func (r *Replicated) Release(
panic(err)
}

goreleaserContainer := dag.Goreleaser(dagger.GoreleaserOpts{
Version: goreleaserVersion,
}).Ctr().WithSecretVariable("GITHUB_TOKEN", githubToken)

if snapshot {
_, err := dag.
Goreleaser(dagger.GoreleaserOpts{
Version: goreleaserVersion,
Ctr: goreleaserContainer,
}).
WithSource(source).
WithSource(updatedSource).
Snapshot(ctx, dagger.GoreleaserSnapshotOpts{
Clean: clean,
})
Expand All @@ -112,8 +159,9 @@ func (r *Replicated) Release(
_, err := dag.
Goreleaser(dagger.GoreleaserOpts{
Version: goreleaserVersion,
Ctr: goreleaserContainer,
}).
WithSource(source).
WithSource(updatedSource).
Release(ctx, dagger.GoreleaserReleaseOpts{
Clean: clean,
})
Expand All @@ -125,11 +173,7 @@ func (r *Replicated) Release(
return nil
}

func parseVersion(ctx context.Context, version string) (int64, int64, int64, error) {
latestVersion, err := getLatestVersion(ctx)
if err != nil {
return 0, 0, 0, err
}
func parseVersion(ctx context.Context, latestVersion string, version string) (int64, int64, int64, error) {
parsedLatestVersion, err := semver.NewVersion(latestVersion)
if err != nil {
return 0, 0, 0, err
Expand Down Expand Up @@ -168,8 +212,14 @@ func getLatestVersion(ctx context.Context) (string, error) {
return release.TagName, nil
}

var (
ErrGitTreeNotClean = errors.New("Your git tree is not clean. You cannot release what's not commited.")
ErrMainBranch = errors.New("You must be on the main branch to release")
ErrCommitNotInGitHub = errors.New("You must merge your changes into the main branch before releasing")
)

// checkGitTree will return true if the local git tree is clean
func checkGitTree(ctx context.Context, source *dagger.Directory) (bool, error) {
func checkGitTree(ctx context.Context, source *dagger.Directory, githubToken *dagger.Secret) (bool, error) {
container := dag.Container().
From("alpine/git:latest").
WithMountedDirectory("/go/src/github.com/replicatedhq/replicated", source).
Expand All @@ -181,8 +231,67 @@ func checkGitTree(ctx context.Context, source *dagger.Directory) (bool, error) {
return false, err
}

if len(output) == 0 {
return true, nil
if len(output) > 0 {
return false, ErrGitTreeNotClean
}

container = dag.Container().
From("alpine/git:latest").
WithMountedDirectory("/go/src/github.com/replicatedhq/replicated", source).
WithWorkdir("/go/src/github.com/replicatedhq/replicated").
WithExec([]string{"git", "branch"})

output, err = container.Stdout(ctx)
if err != nil {
return false, err
}

if !strings.Contains(output, "* main") {
return false, ErrMainBranch
}

container = dag.Container().
From("alpine/git:latest").
WithMountedDirectory("/go/src/github.com/replicatedhq/replicated", source).
WithWorkdir("/go/src/github.com/replicatedhq/replicated").
WithExec([]string{"git", "rev-parse", "HEAD"})

commit, err := container.Stdout(ctx)
if err != nil {
return false, err
}

req, err := http.NewRequest("GET", fmt.Sprintf("https://api.github.com/repos/replicatedhq/replicated/commits/%s", commit), nil)
if err != nil {
return false, err
}

githubTokenPlaintext, err := githubToken.Plaintext(ctx)
if err != nil {
return false, err
}

req.Header.Set("Authorization", fmt.Sprintf("token %s", githubTokenPlaintext))

resp, err := http.DefaultClient.Do(req)
if err != nil {
return false, err
}
defer resp.Body.Close()

type GitHubResponse struct {
SHA string `json:"sha"`
NodeID string `json:"node_id"`
Status string `json:"status"`
}

var ghResp GitHubResponse
if err := json.NewDecoder(resp.Body).Decode(&ghResp); err != nil {
return false, err
}

if ghResp.Status == "422" {
return false, ErrCommitNotInGitHub
}

return false, nil
Expand Down
6 changes: 1 addition & 5 deletions pkg/version/build.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
package version

// NOTE: these variables are injected at build time

var (
version, gitSHA, buildTime string
)
const version = "unknown"
Loading

0 comments on commit 9eb0cc1

Please sign in to comment.