5
docs/appendices/0.37-migration-guide.md
Normal file
5
docs/appendices/0.37-migration-guide.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# 0.37.0 Migration Guide
|
||||
|
||||
## Changes
|
||||
|
||||
- The path on disk to both the global `ENV` file and the `ENV` file for a given app has been moved. Users should reference environment variables via the provided plugin triggers rather than directly sourcing the ENV files. Existing ENV files are left untouched and will be removed on the subsequent Dokku install.
|
||||
@@ -541,6 +541,10 @@ func PropertySetup(pluginName string) error {
|
||||
}
|
||||
|
||||
func PropertySetupApp(pluginName string, appName string) error {
|
||||
if err := PropertySetup(pluginName); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := makePluginAppPropertyPath(pluginName, appName); err != nil {
|
||||
return fmt.Errorf("Unable to create %s config directory for %s: %s", pluginName, appName, err.Error())
|
||||
}
|
||||
|
||||
1
plugins/config/.gitignore
vendored
1
plugins/config/.gitignore
vendored
@@ -5,3 +5,4 @@
|
||||
/config-*
|
||||
/config_sub
|
||||
/post-*
|
||||
/install
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
GOARCH ?= amd64
|
||||
SUBCOMMANDS = subcommands/bundle subcommands/clear subcommands/export subcommands/get subcommands/import subcommands/keys subcommands/show subcommands/set subcommands/unset
|
||||
TRIGGERS = triggers/config-export triggers/config-get triggers/config-get-global triggers/config-set triggers/config-unset triggers/post-app-clone-setup triggers/post-app-rename-setup
|
||||
TRIGGERS = triggers/config-export triggers/config-get triggers/config-get-global triggers/install triggers/config-set triggers/config-unset triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-create triggers/post-delete
|
||||
BUILD = commands config_sub subcommands triggers
|
||||
PLUGIN_NAME = config
|
||||
|
||||
|
||||
@@ -51,6 +51,8 @@ func main() {
|
||||
restart = flag.Arg(1)
|
||||
}
|
||||
err = config.TriggerConfigUnset(appName, key, common.ToBool(restart))
|
||||
case "install":
|
||||
err = config.TriggerInstall()
|
||||
case "post-app-clone-setup":
|
||||
oldAppName := flag.Arg(0)
|
||||
newAppName := flag.Arg(1)
|
||||
@@ -59,6 +61,12 @@ func main() {
|
||||
oldAppName := flag.Arg(0)
|
||||
newAppName := flag.Arg(1)
|
||||
err = config.TriggerPostAppRenameSetup(oldAppName, newAppName)
|
||||
case "post-create":
|
||||
appName := flag.Arg(0)
|
||||
err = config.TriggerPostCreate(appName)
|
||||
case "post-delete":
|
||||
appName := flag.Arg(0)
|
||||
err = config.TriggerPostDelete(appName)
|
||||
default:
|
||||
err = fmt.Errorf("Invalid plugin trigger call: %s", trigger)
|
||||
}
|
||||
|
||||
@@ -2,7 +2,11 @@ package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
|
||||
"github.com/dokku/dokku/plugins/common"
|
||||
)
|
||||
|
||||
// TriggerConfigExport returns a global config value by key
|
||||
@@ -56,6 +60,65 @@ func TriggerConfigUnset(appName string, key string, restart bool) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// TriggerInstall runs the install step for the config plugin
|
||||
func TriggerInstall() error {
|
||||
if err := common.PropertySetup("config"); err != nil {
|
||||
return fmt.Errorf("Unable to install the config plugin: %s", err.Error())
|
||||
}
|
||||
|
||||
apps, err := common.UnfilteredDokkuApps()
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// migrate all created-at values from app mod-time to property
|
||||
for _, appName := range apps {
|
||||
oldEnvFile := filepath.Join(common.AppRoot(appName) + "ENV")
|
||||
isMigrated := common.PropertyGetDefault("config", appName, "env-migrated", "")
|
||||
// delete the old file on the next install
|
||||
if isMigrated == "true" {
|
||||
if err := os.RemoveAll(oldEnvFile); err != nil {
|
||||
return fmt.Errorf("Unable to remove old ENV file: %s", err.Error())
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// skip if the file doesn't exist
|
||||
if _, err := os.Stat(oldEnvFile); err != nil {
|
||||
if err := common.PropertyWrite("config", appName, "env-migrated", "true"); err != nil {
|
||||
return fmt.Errorf("Unable to set env-migrated property: %s", err.Error())
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if err := common.PropertySetupApp("config", appName); err != nil {
|
||||
return fmt.Errorf("Unable to setup app environment: %s", err.Error())
|
||||
}
|
||||
|
||||
// merge in the old env into the new env
|
||||
oldEnv, err := loadFromFile(appName, oldEnvFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Unable to load old environment: %s", err.Error())
|
||||
}
|
||||
|
||||
env, err := LoadAppEnv(appName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Unable to load app environment: %s", err.Error())
|
||||
}
|
||||
|
||||
env.Merge(oldEnv)
|
||||
if err := env.Write(); err != nil {
|
||||
return fmt.Errorf("Unable to write app environment: %s", err.Error())
|
||||
}
|
||||
|
||||
if err := common.PropertyWrite("config", appName, "env-migrated", "true"); err != nil {
|
||||
return fmt.Errorf("Unable to set env-migrated property: %s", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// TriggerPostAppCloneSetup creates new buildpacks files
|
||||
func TriggerPostAppCloneSetup(oldAppName string, newAppName string) error {
|
||||
oldEnv, err := LoadAppEnv(oldAppName)
|
||||
@@ -95,3 +158,13 @@ func TriggerPostAppRenameSetup(oldAppName string, newAppName string) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// TriggerPostCreate ensures apps have the correct config structure
|
||||
func TriggerPostCreate(appName string) error {
|
||||
return common.PropertySetupApp("config", appName)
|
||||
}
|
||||
|
||||
// TriggerPostDelete destroys the config data for a given app container
|
||||
func TriggerPostDelete(appName string) error {
|
||||
return common.PropertyDestroy("config", appName)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user