Compare commits

..

17 Commits

Author SHA1 Message Date
412e366200 Merge remote-tracking branch 'coopcloud/main' into add-waiting-interrupt-handling
All checks were successful
continuous-integration/drone/pr Build is passing
2023-08-04 19:08:12 +01:00
f5cadcc5f0 Further changes to messages.
All checks were successful
continuous-integration/drone/pr Build is passing
2023-08-04 19:05:49 +01:00
5ae73f700e Merge branch 'fix-deploy-no-catalogue'
Some checks reported errors
continuous-integration/drone/push Build was killed
2023-08-02 10:48:54 +02:00
63d419caae Merge branch 'fix-478' 2023-08-02 10:48:46 +02:00
179b66d65c Merge branch 'fix-476' 2023-08-02 10:48:37 +02:00
c9144d90f3 refactor: integration -> manual 2023-08-02 08:45:24 +02:00
ebf5d82c56 fix: failover if no recipe meta available
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-08-02 00:48:27 +02:00
8bb98ed0ed fix: deploy fresh recipe without versions
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
See coop-cloud/organising#476
2023-08-01 21:47:34 +02:00
23f5745cb8 fix: skip recipe clone / up to date sync for some commands
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
Continues work of 3dc5662821.
2023-08-01 21:19:20 +02:00
2cd453ae8d build: attempt to ignore goreleaser upgrades
Some checks failed
continuous-integration/drone/push Build is failing
See e42cc0f91d.
2023-08-01 19:33:36 +02:00
e42cc0f91d Revert "chore(deps): update goreleaser/goreleaser docker tag to v1.19.2"
This reverts commit 1de45a6508.

See 8fa9419c99.
2023-08-01 19:31:51 +02:00
ae1a6c45f9 Merge branch 'add-waiting-interrupt-handling' of ssh://git.coopcloud.tech:2222/rix/abra into add-waiting-interrupt-handling 2023-08-01 12:53:36 +01:00
65fdaf43cc Attempt to replace the deploy completed message.
All checks were successful
continuous-integration/drone/pr Build is passing
2023-08-01 12:50:15 +01:00
2d135329bb Change message when starting to poll for deployment status. 2023-07-31 22:45:44 +01:00
3e95319969 Add os hook for interrupt signal while waiting for service to converge. 2023-07-31 22:45:44 +01:00
1de45a6508 chore(deps): update goreleaser/goreleaser docker tag to v1.19.2
Some checks failed
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is failing
2023-07-31 07:02:04 +00:00
1208438cba Add os hook for interrupt signal while waiting for service to converge.
All checks were successful
continuous-integration/drone/pr Build is passing
2023-07-30 12:28:11 +01:00
24 changed files with 115 additions and 17 deletions

View File

@ -93,6 +93,7 @@ recipes.
}
}
isLatestHash := false
version := deployedVersion
if version == "unknown" && !internal.Chaos {
catl, err := recipe.ReadRecipeCatalogue(conf)
@ -114,6 +115,7 @@ recipes.
if err != nil {
logrus.Fatal(err)
}
isLatestHash = true
version = formatter.SmallSHA(head.String())
logrus.Warn("no versions detected, using latest commit")
if err := recipe.EnsureLatest(app.Recipe, conf); err != nil {
@ -129,7 +131,7 @@ recipes.
}
}
if version != "unknown" && !internal.Chaos {
if version != "unknown" && !internal.Chaos && !isLatestHash {
if err := recipe.EnsureVersion(app.Recipe, version); err != nil {
logrus.Fatal(err)
}

View File

@ -84,7 +84,11 @@ var appLogsCommand = cli.Command{
Before: internal.SubCommandBefore,
BashComplete: autocomplete.AppNameComplete,
Action: func(c *cli.Context) error {
conf := runtime.New(runtime.WithOffline(internal.Offline))
conf := runtime.New(
runtime.WithOffline(internal.Offline),
runtime.WithEnsureRecipeExists(false),
)
app := internal.ValidateApp(c, conf)
cl, err := client.New(app.Server)

View File

@ -58,7 +58,11 @@ var appNewCommand = cli.Command{
Before: internal.SubCommandBefore,
ArgsUsage: "[<recipe>]",
Action: func(c *cli.Context) error {
conf := runtime.New(runtime.WithOffline(internal.Offline))
conf := runtime.New(
runtime.WithOffline(internal.Offline),
runtime.WithEnsureRecipeUpToDate(false),
)
recipe := internal.ValidateRecipeWithPrompt(c, conf)
if err := recipePkg.EnsureUpToDate(recipe.Name, conf); err != nil {

View File

@ -60,7 +60,11 @@ your SSH keys configured on your account.
Before: internal.SubCommandBefore,
BashComplete: autocomplete.RecipeNameComplete,
Action: func(c *cli.Context) error {
conf := runtime.New(runtime.WithOffline(internal.Offline))
conf := runtime.New(
runtime.WithOffline(internal.Offline),
runtime.WithEnsureRecipeUpToDate(false),
)
recipe := internal.ValidateRecipeWithPrompt(c, conf)
imagesTmp, err := getImageVersions(recipe)

View File

@ -43,7 +43,11 @@ auto-generate it for you. The <recipe> configuration will be updated on the
local file system.
`,
Action: func(c *cli.Context) error {
conf := runtime.New(runtime.WithOffline(internal.Offline))
conf := runtime.New(
runtime.WithOffline(internal.Offline),
runtime.WithEnsureRecipeUpToDate(false),
)
recipe := internal.ValidateRecipeWithPrompt(c, conf)
mainApp, err := internal.GetMainAppImage(recipe)

View File

@ -22,7 +22,11 @@ var recipeVersionCommand = cli.Command{
Before: internal.SubCommandBefore,
BashComplete: autocomplete.RecipeNameComplete,
Action: func(c *cli.Context) error {
conf := runtime.New(runtime.WithOffline(internal.Offline))
conf := runtime.New(
runtime.WithOffline(internal.Offline),
runtime.WithEnsureRecipeUpToDate(false),
)
recipe := internal.ValidateRecipe(c, conf)
catalogue, err := recipePkg.ReadRecipeCatalogue(conf)

View File

@ -236,9 +236,10 @@ func Get(recipeName string, conf *runtime.Config) (Recipe, error) {
meta, err := GetRecipeMeta(recipeName, conf)
if err != nil {
if strings.Contains(err.Error(), "does not exist") {
switch err.(type) {
case RecipeMissingFromCatalogue:
meta = RecipeMeta{}
} else {
default:
return Recipe{}, err
}
}
@ -252,6 +253,11 @@ func Get(recipeName string, conf *runtime.Config) (Recipe, error) {
// EnsureExists ensures that a recipe is locally cloned
func EnsureExists(recipeName string, conf *runtime.Config) error {
if !conf.RecipeExists {
logrus.Debug("skipping ensuring recipe locally exists")
return nil
}
recipeDir := path.Join(config.RECIPES_DIR, recipeName)
if _, err := os.Stat(recipeDir); os.IsNotExist(err) {
@ -339,6 +345,11 @@ func EnsureVersion(recipeName, version string) error {
// EnsureLatest makes sure the latest commit is checked out for a local recipe repository
func EnsureLatest(recipeName string, conf *runtime.Config) error {
if !conf.RecipeLatest {
logrus.Debug("skipping ensuring recipe is synced with remote")
return nil
}
recipeDir := path.Join(config.RECIPES_DIR, recipeName)
isClean, err := gitPkg.IsClean(recipeDir)
@ -368,8 +379,13 @@ func EnsureLatest(recipeName string, conf *runtime.Config) error {
meta, err := GetRecipeMeta(recipeName, conf)
if err != nil {
switch err.(type) {
case RecipeMissingFromCatalogue:
meta = RecipeMeta{}
default:
return err
}
}
var branch plumbing.ReferenceName
if meta.DefaultBranch != "" {
@ -584,6 +600,11 @@ func GetStringInBetween(recipeName, str, start, end string) (result string, err
// EnsureUpToDate ensures that the local repo is synced to the remote
func EnsureUpToDate(recipeName string, conf *runtime.Config) error {
if !conf.RecipeLatest {
logrus.Debug("skipping ensuring recipe is synced with remote")
return nil
}
recipeDir := path.Join(config.RECIPES_DIR, recipeName)
isClean, err := gitPkg.IsClean(recipeDir)
@ -719,6 +740,14 @@ func VersionsOfService(recipe, serviceName string, conf *runtime.Config) ([]stri
return versions, nil
}
// RecipeMissingFromCatalogue signifies a recipe is not present in the catalogue.
type RecipeMissingFromCatalogue struct{ err string }
// Error outputs the error message.
func (r RecipeMissingFromCatalogue) Error() string {
return r.err
}
// GetRecipeMeta retrieves the recipe metadata from the recipe catalogue.
func GetRecipeMeta(recipeName string, conf *runtime.Config) (RecipeMeta, error) {
catl, err := ReadRecipeCatalogue(conf)
@ -728,7 +757,9 @@ func GetRecipeMeta(recipeName string, conf *runtime.Config) (RecipeMeta, error)
recipeMeta, ok := catl[recipeName]
if !ok {
return RecipeMeta{}, fmt.Errorf("recipe %s does not exist?", recipeName)
return RecipeMeta{}, RecipeMissingFromCatalogue{
err: fmt.Sprintf("recipe %s does not exist?", recipeName),
}
}
if err := EnsureExists(recipeName, conf); err != nil {

View File

@ -2,14 +2,23 @@ package runtime
import "github.com/sirupsen/logrus"
// Config is a runtime behaviour modifier.
type Config struct {
Offline bool
Offline bool // Whether or not Abra should prefer local / offline access
RecipeExists bool // Whether or not Abra should ensure the recipe is locally cloned
RecipeLatest bool // Whether or not Abra should ensure the recipe has the latest commit
}
// Option is a runtime configuration option.
type Option func(c *Config)
// New creates a new runtime configuration.
func New(opts ...Option) *Config {
conf := &Config{Offline: false}
conf := &Config{
Offline: false,
RecipeExists: true,
RecipeLatest: true,
}
for _, optFunc := range opts {
optFunc(conf)
@ -18,6 +27,8 @@ func New(opts ...Option) *Config {
return conf
}
// WithOffline ensures Abra attempts to prefer local file system and offline
// access.
func WithOffline(offline bool) Option {
return func(c *Config) {
if offline {
@ -26,3 +37,23 @@ func WithOffline(offline bool) Option {
c.Offline = offline
}
}
// WithEnsureRecipeExists ensures recipe exists locally.
func WithEnsureRecipeExists(exists bool) Option {
return func(c *Config) {
if exists {
logrus.Debugf("runtime config: ensuring recipe exists")
}
c.RecipeExists = exists
}
}
// WithEnsureRecipeUpToDate ensures recipe is synced with the remote.
func WithEnsureRecipeUpToDate(upToDate bool) Option {
return func(c *Config) {
if upToDate {
logrus.Debugf("runtime config: ensuring recipe is synced with remote")
}
c.RecipeLatest = upToDate
}
}

View File

@ -5,7 +5,8 @@ import (
"fmt"
"io"
"io/ioutil"
"strings"
"os"
"os/signal"
"time"
"coopcloud.tech/abra/pkg/upstream/convert"
@ -414,7 +415,7 @@ func deployServices(
return nil
}
logrus.Infof("waiting for services to converge: %s", strings.Join(serviceNames, ", "))
logrus.Infof("Starting to poll for deployment status for: %s", appName)
ch := make(chan error, len(serviceIDs))
for serviceID, serviceName := range serviceIDs {
logrus.Debugf("waiting on %s to converge", serviceName)
@ -431,7 +432,7 @@ func deployServices(
logrus.Debugf("assuming %s converged successfully", serviceID)
}
logrus.Info("services converged 👌")
logrus.Infof("Successfully deployed %s", appName)
return nil
}
@ -454,6 +455,10 @@ func WaitOnService(ctx context.Context, cl *dockerClient.Client, serviceID, appN
errChan := make(chan error, 1)
pipeReader, pipeWriter := io.Pipe()
sigintChannel := make(chan os.Signal, 1)
signal.Notify(sigintChannel, os.Interrupt)
defer signal.Stop(sigintChannel)
go func() {
errChan <- progress.ServiceProgress(ctx, cl, serviceID, pipeWriter)
}()
@ -465,6 +470,14 @@ func WaitOnService(ctx context.Context, cl *dockerClient.Client, serviceID, appN
select {
case err := <-errChan:
return err
case <-sigintChannel:
return fmt.Errorf(fmt.Sprintf(`
Cancelling polling for %s, deployment is still continuing.
If you want to stop the deployment try:
abra app undeploy %s
`, appName, appName))
case <-time.After(timeout):
return fmt.Errorf(fmt.Sprintf(`
%s has not converged (%s second timeout reached).
@ -481,7 +494,7 @@ And inspect the logs with:
abra app logs %s
If a service is failing to even start, try smoke out the error with:
If a service is failing to even start, try to smoke out the error with:
abra app errors --watch %s

View File

@ -8,6 +8,7 @@
"gomodTidy"
],
"ignoreDeps": [
"github.com/urfave/cli"
"github.com/urfave/cli",
"goreleaser/goreleaser"
]
}