feat: implement app-json-is-valid plugin trigger

This commit is contained in:
Jose Diaz-Gonzalez
2025-06-19 02:19:08 -04:00
parent ed851fe399
commit 4ae9cca6f1
9 changed files with 87 additions and 49 deletions

View File

@@ -62,21 +62,32 @@ func (t TemplateCommand) CronCommand() string {
return fmt.Sprintf("dokku run --cron-id %s %s %s", t.ID, t.App, t.Command)
}
// FetchCronEntriesInput is the input for the FetchCronEntries function
type FetchCronEntriesInput struct {
AppName string
AppJSON *appjson.AppJSON
}
// FetchCronEntries returns a list of cron commands for a given app
func FetchCronEntries(appName string) ([]TemplateCommand, error) {
func FetchCronEntries(input FetchCronEntriesInput) ([]TemplateCommand, error) {
appName := input.AppName
commands := []TemplateCommand{}
isMaintenance := reportComputedMaintenance(appName) == "true"
appJSON, err := appjson.GetAppJSON(appName)
if err != nil {
return commands, fmt.Errorf("Unable to fetch app.json for app %s: %s", appName, err.Error())
if input.AppJSON == nil {
appJSON, err := appjson.GetAppJSON(appName)
if err != nil {
return commands, fmt.Errorf("Unable to fetch app.json for app %s: %s", appName, err.Error())
}
input.AppJSON = &appJSON
}
if appJSON.Cron == nil {
if input.AppJSON.Cron == nil {
return commands, nil
}
for i, c := range appJSON.Cron {
for i, c := range input.AppJSON.Cron {
if c.Command == "" {
common.LogWarn(fmt.Sprintf("Missing cron command for app %s (index %d)", appName, i))
continue

View File

@@ -41,7 +41,7 @@ func reportMailto(_ string) string {
}
func reportTasks(appName string) string {
c, _ := FetchCronEntries(appName)
c, _ := FetchCronEntries(FetchCronEntriesInput{AppName: appName})
return strconv.Itoa(len(c))
}

View File

@@ -26,7 +26,7 @@ func CommandList(appName string, format string) error {
return fmt.Errorf("Invalid format specified, supported formats: json, stdout")
}
entries, err := FetchCronEntries(appName)
entries, err := FetchCronEntries(FetchCronEntriesInput{AppName: appName})
if err != nil {
return err
}
@@ -79,7 +79,7 @@ func CommandRun(appName string, cronID string, detached bool) error {
return err
}
entries, err := FetchCronEntries(appName)
entries, err := FetchCronEntries(FetchCronEntriesInput{AppName: appName})
if err != nil {
return err
}

View File

@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
appjson "github.com/dokku/dokku/plugins/app-json"
"github.com/dokku/dokku/plugins/common"
)
@@ -23,6 +24,25 @@ func TriggerCronGetProperty(appName string, key string) error {
return nil
}
// TriggerAppJSONIsValid validates the cron entries for a given app
func TriggerAppJSONIsValid(appName string, appJSONPath string) error {
if !common.FileExists(appJSONPath) {
return nil
}
appJSON, err := appjson.ReadAppJSON(appJSONPath)
if err != nil {
return err
}
_, err = FetchCronEntries(FetchCronEntriesInput{AppName: appName, AppJSON: &appJSON})
if err != nil {
return err
}
return nil
}
// TriggerInstall runs the install step for the cron plugin
func TriggerInstall() error {
if err := common.PropertySetup("cron"); err != nil {