Merge pull request #4336 from dokku/4306-stacks-set
Add ability to manage stacks on an app or global level …
This commit is contained in:
@@ -78,7 +78,7 @@ The following config variables have special meanings and can be set in a variety
|
|||||||
| Name | Default | How to modify | Description |
|
| Name | Default | How to modify | Description |
|
||||||
| ------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
|
| ------------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
|
||||||
| `DOKKU_ROOT` | `~dokku` | `/etc/environment` | The root directory where dokku will store application repositories, as well as certain configuration files. |
|
| `DOKKU_ROOT` | `~dokku` | `/etc/environment` | The root directory where dokku will store application repositories, as well as certain configuration files. |
|
||||||
| `DOKKU_IMAGE` | `gliderlabs/herokuish` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The default image to use when building herokuish containers. |
|
| `DOKKU_IMAGE` | `gliderlabs/herokuish` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The default image to use when building herokuish containers. Deprecated in favor of using `buildpacks:set-property` |
|
||||||
| `DOKKU_LIB_ROOT` | `/var/lib/dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory where plugins, certain data, and general configuration is stored. |
|
| `DOKKU_LIB_ROOT` | `/var/lib/dokku` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory where plugins, certain data, and general configuration is stored. |
|
||||||
| `PLUGIN_PATH` | `$DOKKU_LIB_ROOT/plugins"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The top-level directory where plugins are stored. |
|
| `PLUGIN_PATH` | `$DOKKU_LIB_ROOT/plugins"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The top-level directory where plugins are stored. |
|
||||||
| `PLUGIN_AVAILABLE_PATH` | `$PLUGIN_PATH/available"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory that holds all available plugins, including core. |
|
| `PLUGIN_AVAILABLE_PATH` | `$PLUGIN_PATH/available"` | `/etc/environment` <br /> `~dokku/.dokkurc` <br /> `~dokku/.dokkurc/*` | The directory that holds all available plugins, including core. |
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
> New as of 0.22.0
|
> New as of 0.22.0
|
||||||
|
|
||||||
|
```
|
||||||
|
buildpacks:set-property [--global|<app>] <key> <value> # Set or clear a buildpacks property for an app
|
||||||
|
```
|
||||||
Cloud Native Buildpacks are an evolution over the Buildpacks technology provided by the Herokuish builder. See the [herokuish buildpacks documentation](/docs/deployment/methods/herokuish.md) for more information on how to clear buildpack build cache for an application.
|
Cloud Native Buildpacks are an evolution over the Buildpacks technology provided by the Herokuish builder. See the [herokuish buildpacks documentation](/docs/deployment/methods/herokuish.md) for more information on how to clear buildpack build cache for an application.
|
||||||
|
|
||||||
> Warning: This functionality uses the `pack` cli from the [Cloud Native Buildpacks](https://buildpacks.io) project to build apps. As the integration is experimental in Dokku, it is likely to change over time.
|
> Warning: This functionality uses the `pack` cli from the [Cloud Native Buildpacks](https://buildpacks.io) project to build apps. As the integration is experimental in Dokku, it is likely to change over time.
|
||||||
@@ -22,10 +25,8 @@ Builds will proceed with the `pack` cli for the app from then on.
|
|||||||
|
|
||||||
As this functionality is highly experimental, there are a number of caveats. Please note that not all issuesare listed below.
|
As this functionality is highly experimental, there are a number of caveats. Please note that not all issuesare listed below.
|
||||||
|
|
||||||
- The `heroku/buildpacks:latest` CNB builder is currently enforced. Specifying specific builders is not currently possible.
|
|
||||||
- A future release will allow modifying the chosen builder.
|
|
||||||
- Specifying specific buildpacks is not currently possible.
|
- Specifying specific buildpacks is not currently possible.
|
||||||
- A future release will add support for the `buildpacks` plugin.
|
- A future release will add support for specifying buildpacks via the `buildpacks` plugin.
|
||||||
- There is currently no way to specify extra arguments for `pack` cli invocations.
|
- There is currently no way to specify extra arguments for `pack` cli invocations.
|
||||||
- A future release will add support for injecting extra arguments during the build process.
|
- A future release will add support for injecting extra arguments during the build process.
|
||||||
- The default process type is `web`.
|
- The default process type is `web`.
|
||||||
@@ -33,3 +34,31 @@ As this functionality is highly experimental, there are a number of caveats. Ple
|
|||||||
- A future version will add integration with the `repo` plugin.
|
- A future version will add integration with the `repo` plugin.
|
||||||
- `pack` is not currently included with Dokku, nor is it added as a package dependency.
|
- `pack` is not currently included with Dokku, nor is it added as a package dependency.
|
||||||
- A future version will include it as a package dependency.
|
- A future version will include it as a package dependency.
|
||||||
|
|
||||||
|
### Customizing the Buildpack stack builder
|
||||||
|
|
||||||
|
> New as of 0.23.0
|
||||||
|
|
||||||
|
The default stack builder in use by CNB buildpacks in Dokku is based on `heroku/buildpacks`. Users may desire to switch the stack builder to a custom version, either to update the operating system or to customize packages included with the stack builder. This can be performed via the `buildpacks:set-property` command.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dokku buildpacks:set-property node-js-app paketobuildpacks/build:base-cnb
|
||||||
|
```
|
||||||
|
|
||||||
|
The specified stack builder can also be unset by omitting the name of the stack builder when calling `buildpacks:set-property`.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dokku buildpacks:set-property node-js-app
|
||||||
|
```
|
||||||
|
|
||||||
|
A change in the stack builder value will execute the `post-stack-set` trigger.
|
||||||
|
|
||||||
|
Finally, stack builders can be set or unset globally as a fallback. This will take precedence over a globally set `DOKKU_CNB_STACK` environment variable (`heroku/buildpacks` by default).
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# set globally
|
||||||
|
dokku buildpacks:set-property --global paketobuildpacks/build:base-cnb
|
||||||
|
|
||||||
|
# unset globally
|
||||||
|
dokku buildpacks:set-property --global
|
||||||
|
```
|
||||||
|
|||||||
@@ -3,12 +3,13 @@
|
|||||||
> Subcommands new as of 0.15.0
|
> Subcommands new as of 0.15.0
|
||||||
|
|
||||||
```
|
```
|
||||||
buildpacks:add [--index 1] <app> <buildpack> # Add new app buildpack while inserting into list of buildpacks if necessary
|
buildpacks:add [--index 1] <app> <buildpack> # Add new app buildpack while inserting into list of buildpacks if necessary
|
||||||
buildpacks:clear <app> # Clear all buildpacks set on the app
|
buildpacks:clear <app> # Clear all buildpacks set on the app
|
||||||
buildpacks:list <app> # List all buildpacks for an app
|
buildpacks:list <app> # List all buildpacks for an app
|
||||||
buildpacks:remove <app> <buildpack> # Remove a buildpack set on the app
|
buildpacks:remove <app> <buildpack> # Remove a buildpack set on the app
|
||||||
buildpacks:report [<app>] [<flag>] # Displays a buildpack report for one or more apps
|
buildpacks:report [<app>] [<flag>] # Displays a buildpack report for one or more apps
|
||||||
buildpacks:set [--index 1] <app> <buildpack> # Set new app buildpack at a given position defaulting to the first buildpack if no index is specified
|
buildpacks:set [--index 1] <app> <buildpack> # Set new app buildpack at a given position defaulting to the first buildpack if no index is specified
|
||||||
|
buildpacks:set-property [--global|<app>] <key> <value> # Set or clear a buildpacks property for an app
|
||||||
```
|
```
|
||||||
|
|
||||||
> Warning: If using the `buildpacks` plugin, be sure to unset any `BUILDPACK_URL` and remove any such entries from a committed `.env` file. A specified `BUILDPACK_URL` will always override a `.buildpacks` file or the buildpacks plugin.
|
> Warning: If using the `buildpacks` plugin, be sure to unset any `BUILDPACK_URL` and remove any such entries from a committed `.env` file. A specified `BUILDPACK_URL` will always override a `.buildpacks` file or the buildpacks plugin.
|
||||||
@@ -123,6 +124,34 @@ The `buildpacks:clear` command can be used to clear all configured buildpacks fo
|
|||||||
dokku buildpacks:clear node-js-app
|
dokku buildpacks:clear node-js-app
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Customizing the Buildpack stack builder
|
||||||
|
|
||||||
|
> New as of 0.23.0
|
||||||
|
|
||||||
|
The default stack builder in use by Herokuish buildpacks in Dokku is based on `gliderlabs/herokuish:latest`. Typically, this is installed via an OS package which pulls the requisite Docker image. Users may desire to switch the stack builder to a custom version, either to update the operating system or to customize packages included with the stack builder. This can be performed via the `buildpacks:set-property` command.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dokku buildpacks:set-property node-js-app gliderlabs/herokuish:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
The specified stack builder can also be unset by omitting the name of the stack builder when calling `buildpacks:set-property`.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
dokku buildpacks:set-property node-js-app
|
||||||
|
```
|
||||||
|
|
||||||
|
A change in the stack builder value will execute the `post-stack-set` trigger.
|
||||||
|
|
||||||
|
Finally, stack builders can be set or unset globally as a fallback. This will take precedence over a globally set `DOKKU_IMAGE` environment variable (`gliderlabs/herokuish:latest` by default).
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# set globally
|
||||||
|
dokku buildpacks:set-property --global gliderlabs/herokuish:latest
|
||||||
|
|
||||||
|
# unset globally
|
||||||
|
dokku buildpacks:set-property --global
|
||||||
|
```
|
||||||
|
|
||||||
### Displaying buildpack reports for an app
|
### Displaying buildpack reports for an app
|
||||||
|
|
||||||
You can get a report about the app's buildpacks status using the `buildpacks:report` command:
|
You can get a report about the app's buildpacks status using the `buildpacks:report` command:
|
||||||
@@ -133,11 +162,20 @@ dokku buildpacks:report
|
|||||||
|
|
||||||
```
|
```
|
||||||
=====> node-js-app buildpacks information
|
=====> node-js-app buildpacks information
|
||||||
Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git
|
Buildpacks computed stack: gliderlabs/herokuish:v0.5.23-20
|
||||||
|
Buildpacks global stack: gliderlabs/herokuish:latest
|
||||||
|
Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git
|
||||||
|
Buildpacks stack: gliderlabs/herokuish:v0.5.23-20
|
||||||
=====> python-sample buildpacks information
|
=====> python-sample buildpacks information
|
||||||
Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git,https://github.com/heroku/heroku-buildpack-python.git
|
Buildpacks computed stack: gliderlabs/herokuish:v0.5.23-20
|
||||||
|
Buildpacks global stack: gliderlabs/herokuish:latest
|
||||||
|
Buildpacks list: https://github.com/heroku/heroku-buildpack-nodejs.git,https://github.com/heroku/heroku-buildpack-python.git
|
||||||
|
Buildpacks stack:
|
||||||
=====> ruby-sample buildpacks information
|
=====> ruby-sample buildpacks information
|
||||||
|
Buildpacks computed stack: gliderlabs/herokuish:v0.5.23-20
|
||||||
|
Buildpacks global stack: gliderlabs/herokuish:latest
|
||||||
Buildpacks list:
|
Buildpacks list:
|
||||||
|
Buildpacks stack:
|
||||||
```
|
```
|
||||||
|
|
||||||
You can run the command for a specific app also.
|
You can run the command for a specific app also.
|
||||||
|
|||||||
1
dokku
1
dokku
@@ -42,6 +42,7 @@ DOKKU_DISTRO=$(
|
|||||||
export DOCKER_BIN=${DOCKER_BIN:="docker"}
|
export DOCKER_BIN=${DOCKER_BIN:="docker"}
|
||||||
|
|
||||||
export DOKKU_IMAGE=${DOKKU_IMAGE:="gliderlabs/herokuish:latest"}
|
export DOKKU_IMAGE=${DOKKU_IMAGE:="gliderlabs/herokuish:latest"}
|
||||||
|
export DOKKU_CNB_BUILDER=${DOKKU_CNB_BUILDER:="heroku/buildpacks"}
|
||||||
export DOKKU_LIB_ROOT=${DOKKU_LIB_PATH:="/var/lib/dokku"}
|
export DOKKU_LIB_ROOT=${DOKKU_LIB_PATH:="/var/lib/dokku"}
|
||||||
|
|
||||||
export PLUGIN_PATH=${PLUGIN_PATH:="$DOKKU_LIB_ROOT/plugins"}
|
export PLUGIN_PATH=${PLUGIN_PATH:="$DOKKU_LIB_ROOT/plugins"}
|
||||||
|
|||||||
@@ -13,6 +13,14 @@ trigger-builder-cnb-builder-build() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
local stack="$(plugn trigger buildpack-stack-name "$APP")"
|
||||||
|
if [[ -z "$stack" ]]; then
|
||||||
|
DOKKU_CNB_STACK="$stack"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dokku_log_info1 "Building $APP from cnb stack $DOKKU_CNB_STACK (experimental)..."
|
||||||
|
|
||||||
if ! command -v "pack" &>/dev/null; then
|
if ! command -v "pack" &>/dev/null; then
|
||||||
dokku_log_fail "Missing pack, install it"
|
dokku_log_fail "Missing pack, install it"
|
||||||
fi
|
fi
|
||||||
@@ -28,7 +36,7 @@ trigger-builder-cnb-builder-build() {
|
|||||||
|
|
||||||
plugn trigger pre-build-cnb "$APP" "$SOURCECODE_WORK_DIR"
|
plugn trigger pre-build-cnb "$APP" "$SOURCECODE_WORK_DIR"
|
||||||
|
|
||||||
pack build "$IMAGE" --builder heroku/buildpacks --path "$SOURCECODE_WORK_DIR" --default-process web
|
pack build "$IMAGE" --builder "$DOKKU_CNB_BUILDER" --path "$SOURCECODE_WORK_DIR" --default-process web
|
||||||
|
|
||||||
echo "FROM $IMAGE" | suppress_output "$DOCKER_BIN" image build --label=com.dokku.image-stage=build --label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.app-name=$APP --label=dokku -t "$IMAGE" -
|
echo "FROM $IMAGE" | suppress_output "$DOCKER_BIN" image build --label=com.dokku.image-stage=build --label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.app-name=$APP --label=dokku -t "$IMAGE" -
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ trigger-builder-dockerfile-builder-build() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dokku_log_info1 "Building $APP from Dockerfile"
|
||||||
|
|
||||||
local IMAGE=$(get_app_image_name "$APP")
|
local IMAGE=$(get_app_image_name "$APP")
|
||||||
local DOCKER_BUILD_LABEL_ARGS="--label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.app-name=$APP"
|
local DOCKER_BUILD_LABEL_ARGS="--label=org.label-schema.schema-version=1.0 --label=org.label-schema.vendor=dokku --label=com.dokku.app-name=$APP"
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,14 @@ trigger-builder-herokuish-builder-build() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local stack="$(plugn trigger buildpack-stack-name "$APP")"
|
||||||
|
if [[ -n "$stack" ]]; then
|
||||||
|
dokku_log_info1 "Building $APP from $stack"
|
||||||
|
DOKKU_IMAGE="$stack"
|
||||||
|
else
|
||||||
|
dokku_log_info1 "Building $APP from herokuish"
|
||||||
|
fi
|
||||||
|
|
||||||
local IMAGE=$(get_app_image_name "$APP")
|
local IMAGE=$(get_app_image_name "$APP")
|
||||||
local DOKKU_APP_CACHE_DIR="$DOKKU_ROOT/$APP/cache"
|
local DOKKU_APP_CACHE_DIR="$DOKKU_ROOT/$APP/cache"
|
||||||
local DOKKU_APP_HOST_CACHE_DIR="$DOKKU_HOST_ROOT/$APP/cache"
|
local DOKKU_APP_HOST_CACHE_DIR="$DOKKU_HOST_ROOT/$APP/cache"
|
||||||
@@ -22,8 +30,6 @@ trigger-builder-herokuish-builder-build() {
|
|||||||
pushd "$SOURCECODE_WORK_DIR" &>/dev/null
|
pushd "$SOURCECODE_WORK_DIR" &>/dev/null
|
||||||
|
|
||||||
eval "$(config_export app "$APP")"
|
eval "$(config_export app "$APP")"
|
||||||
|
|
||||||
DOKKU_IMAGE="$(config_get "$APP" DOKKU_IMAGE || echo "$DOKKU_IMAGE")"
|
|
||||||
plugn trigger builder-create-dokku-image "$BUILDER_TYPE" "$APP" "$SOURCECODE_WORK_DIR" "$DOKKU_IMAGE"
|
plugn trigger builder-create-dokku-image "$BUILDER_TYPE" "$APP" "$SOURCECODE_WORK_DIR" "$DOKKU_IMAGE"
|
||||||
NEW_DOKKU_IMAGE=$(plugn trigger builder-dokku-image "$BUILDER_TYPE" "$APP" "$SOURCECODE_WORK_DIR" "$DOKKU_IMAGE")
|
NEW_DOKKU_IMAGE=$(plugn trigger builder-dokku-image "$BUILDER_TYPE" "$APP" "$SOURCECODE_WORK_DIR" "$DOKKU_IMAGE")
|
||||||
[[ -n "$NEW_DOKKU_IMAGE" ]] && DOKKU_IMAGE="$NEW_DOKKU_IMAGE"
|
[[ -n "$NEW_DOKKU_IMAGE" ]] && DOKKU_IMAGE="$NEW_DOKKU_IMAGE"
|
||||||
|
|||||||
1
plugins/buildpacks/.gitignore
vendored
1
plugins/buildpacks/.gitignore
vendored
@@ -2,6 +2,7 @@
|
|||||||
/subcommands/*
|
/subcommands/*
|
||||||
/triggers/*
|
/triggers/*
|
||||||
/triggers
|
/triggers
|
||||||
|
/buildpack-stack-name
|
||||||
/install
|
/install
|
||||||
/post-*
|
/post-*
|
||||||
/report
|
/report
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
SUBCOMMANDS = subcommands/add subcommands/clear subcommands/list subcommands/remove subcommands/report subcommands/set
|
SUBCOMMANDS = subcommands/add subcommands/clear subcommands/list subcommands/remove subcommands/report subcommands/set subcommands/set-property
|
||||||
TRIGGERS = triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/post-extract triggers/report
|
TRIGGERS = triggers/buildpack-stack-name triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/post-extract triggers/report
|
||||||
BUILD = commands subcommands triggers
|
BUILD = commands subcommands triggers
|
||||||
PLUGIN_NAME = buildpacks
|
PLUGIN_NAME = buildpacks
|
||||||
|
|
||||||
|
|||||||
13
plugins/buildpacks/buildpacks.go
Normal file
13
plugins/buildpacks/buildpacks.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package buildpacks
|
||||||
|
|
||||||
|
var (
|
||||||
|
// DefaultProperties is a map of all valid buildpacks properties with corresponding default property values
|
||||||
|
DefaultProperties = map[string]string{
|
||||||
|
"stack": "",
|
||||||
|
}
|
||||||
|
|
||||||
|
// GlobalProperties is a map of all valid global buildpacks properties
|
||||||
|
GlobalProperties = map[string]bool{
|
||||||
|
"stack": true,
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package buildpacks
|
package buildpacks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/dokku/dokku/plugins/common"
|
"github.com/dokku/dokku/plugins/common"
|
||||||
@@ -13,7 +14,10 @@ func ReportSingleApp(appName, infoFlag string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
flags := map[string]common.ReportFunc{
|
flags := map[string]common.ReportFunc{
|
||||||
"--buildpacks-list": reportList,
|
"--buildpacks-computed-stack": reportComputedStack,
|
||||||
|
"--buildpacks-global-stack": reportGlobalStack,
|
||||||
|
"--buildpacks-list": reportList,
|
||||||
|
"--buildpacks-stack": reportStack,
|
||||||
}
|
}
|
||||||
|
|
||||||
flagKeys := []string{}
|
flagKeys := []string{}
|
||||||
@@ -27,6 +31,28 @@ func ReportSingleApp(appName, infoFlag string) error {
|
|||||||
return common.ReportSingleApp("buildpacks", appName, infoFlag, infoFlags, flagKeys, trimPrefix, uppercaseFirstCharacter)
|
return common.ReportSingleApp("buildpacks", appName, infoFlag, infoFlags, flagKeys, trimPrefix, uppercaseFirstCharacter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func reportComputedStack(appName string) string {
|
||||||
|
if stack := common.PropertyGetDefault("buildpacks", appName, "stack", ""); stack != "" {
|
||||||
|
return stack
|
||||||
|
}
|
||||||
|
|
||||||
|
if stack := common.PropertyGetDefault("buildpacks", "--global", "stack", ""); stack != "" {
|
||||||
|
return stack
|
||||||
|
}
|
||||||
|
|
||||||
|
b, _ := common.PlugnTriggerOutput("config-get", []string{appName, "DOKKU_IMAGE"}...)
|
||||||
|
if dokkuImage := strings.TrimSpace(string(b[:])); dokkuImage != "" {
|
||||||
|
common.LogWarn("Deprecated: use buildpacks:set-property instead of specifying DOKKU_IMAGE environment variable")
|
||||||
|
return dokkuImage
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.Getenv("DOKKU_IMAGE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func reportGlobalStack(appName string) string {
|
||||||
|
return common.PropertyGetDefault("buildpacks", "--global", "stack", "")
|
||||||
|
}
|
||||||
|
|
||||||
func reportList(appName string) string {
|
func reportList(appName string) string {
|
||||||
buildpacks, err := common.PropertyListGet("buildpacks", appName, "buildpacks")
|
buildpacks, err := common.PropertyListGet("buildpacks", appName, "buildpacks")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -35,3 +61,7 @@ func reportList(appName string) string {
|
|||||||
|
|
||||||
return strings.Join(buildpacks, ",")
|
return strings.Join(buildpacks, ",")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func reportStack(appName string) string {
|
||||||
|
return common.PropertyGetDefault("buildpacks", appName, "stack", "")
|
||||||
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ Additional commands:`
|
|||||||
buildpacks:remove <app> <buildpack>, Remove a buildpack set on the app
|
buildpacks:remove <app> <buildpack>, Remove a buildpack set on the app
|
||||||
buildpacks:report [<app>] [<flag>], Displays a buildpack report for one or more apps
|
buildpacks:report [<app>] [<flag>], Displays a buildpack report for one or more apps
|
||||||
buildpacks:set [--index 1] <app> <buildpack>, Set new app buildpack at a given position defaulting to the first buildpack if no index is specified
|
buildpacks:set [--index 1] <app> <buildpack>, Set new app buildpack at a given position defaulting to the first buildpack if no index is specified
|
||||||
|
buildpacks:set-property [--global|<app>] <key> <value>, Set or clear a buildpacks property for an app
|
||||||
`
|
`
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,19 @@ func main() {
|
|||||||
appName := args.Arg(0)
|
appName := args.Arg(0)
|
||||||
buildpack := args.Arg(1)
|
buildpack := args.Arg(1)
|
||||||
err = buildpacks.CommandSet(appName, buildpack, *index)
|
err = buildpacks.CommandSet(appName, buildpack, *index)
|
||||||
|
case "set-property":
|
||||||
|
args := flag.NewFlagSet("buildpacks:set-property", flag.ExitOnError)
|
||||||
|
global := args.Bool("global", false, "--global: set a global property")
|
||||||
|
args.Parse(os.Args[2:])
|
||||||
|
appName := args.Arg(0)
|
||||||
|
property := args.Arg(1)
|
||||||
|
value := args.Arg(2)
|
||||||
|
if *global {
|
||||||
|
appName = "--global"
|
||||||
|
property = args.Arg(0)
|
||||||
|
value = args.Arg(1)
|
||||||
|
}
|
||||||
|
err = buildpacks.CommandSetProperty(appName, property, value)
|
||||||
default:
|
default:
|
||||||
common.LogFail(fmt.Sprintf("Invalid plugin subcommand call: %s", subcommand))
|
common.LogFail(fmt.Sprintf("Invalid plugin subcommand call: %s", subcommand))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,11 @@ func main() {
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
switch trigger {
|
switch trigger {
|
||||||
|
case "buildpack-stack-name":
|
||||||
|
appName := flag.Arg(0)
|
||||||
|
err = buildpacks.TriggerBuildpackStackName(appName)
|
||||||
case "install":
|
case "install":
|
||||||
buildpacks.TriggerInstall()
|
err = buildpacks.TriggerInstall()
|
||||||
case "post-app-clone-setup":
|
case "post-app-clone-setup":
|
||||||
oldAppName := flag.Arg(0)
|
oldAppName := flag.Arg(0)
|
||||||
newAppName := flag.Arg(1)
|
newAppName := flag.Arg(1)
|
||||||
@@ -30,11 +33,11 @@ func main() {
|
|||||||
err = buildpacks.TriggerPostAppRenameSetup(oldAppName, newAppName)
|
err = buildpacks.TriggerPostAppRenameSetup(oldAppName, newAppName)
|
||||||
case "post-delete":
|
case "post-delete":
|
||||||
appName := flag.Arg(0)
|
appName := flag.Arg(0)
|
||||||
buildpacks.TriggerPostDelete(appName)
|
err = buildpacks.TriggerPostDelete(appName)
|
||||||
case "post-extract":
|
case "post-extract":
|
||||||
appName := flag.Arg(0)
|
appName := flag.Arg(0)
|
||||||
sourceWorkDir := flag.Arg(1)
|
sourceWorkDir := flag.Arg(1)
|
||||||
buildpacks.TriggerPostExtract(appName, sourceWorkDir)
|
err = buildpacks.TriggerPostExtract(appName, sourceWorkDir)
|
||||||
case "report":
|
case "report":
|
||||||
appName := flag.Arg(0)
|
appName := flag.Arg(0)
|
||||||
err = buildpacks.ReportSingleApp(appName, "")
|
err = buildpacks.ReportSingleApp(appName, "")
|
||||||
|
|||||||
@@ -138,3 +138,18 @@ func CommandSet(appName string, buildpack string, index int) error {
|
|||||||
|
|
||||||
return common.PropertyListSet("buildpacks", appName, "buildpacks", buildpack, index)
|
return common.PropertyListSet("buildpacks", appName, "buildpacks", buildpack, index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CommandSetProperty implements buildpacks:set-property
|
||||||
|
func CommandSetProperty(appName string, property string, value string) error {
|
||||||
|
oldStack := ""
|
||||||
|
if property == "stack" {
|
||||||
|
oldStack = common.PropertyGet("buildpacks", appName, "stack")
|
||||||
|
}
|
||||||
|
|
||||||
|
common.CommandPropertySet("buildpacks", appName, property, value, DefaultProperties, GlobalProperties)
|
||||||
|
if property == "stack" && oldStack != value {
|
||||||
|
return common.PlugnTrigger("post-stack-set", []string{appName, value}...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,15 +5,41 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/dokku/dokku/plugins/common"
|
"github.com/dokku/dokku/plugins/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TriggerInstall runs the install step for the buildpacks plugin
|
// TriggerBuildpackStackName echos the stack name for the app
|
||||||
func TriggerInstall() {
|
func TriggerBuildpackStackName(appName string) error {
|
||||||
if err := common.PropertySetup("buildpacks"); err != nil {
|
if stack := common.PropertyGetDefault("buildpacks", appName, "stack", ""); stack != "" {
|
||||||
common.LogFail(fmt.Sprintf("Unable to install the buildpacks plugin: %s", err.Error()))
|
fmt.Println(stack)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if stack := common.PropertyGetDefault("buildpacks", "--global", "stack", ""); stack != "" {
|
||||||
|
fmt.Println(stack)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
b, _ := common.PlugnTriggerOutput("config-get", []string{appName, "DOKKU_IMAGE"}...)
|
||||||
|
dokkuImage := strings.TrimSpace(string(b[:]))
|
||||||
|
if dokkuImage != "" {
|
||||||
|
common.LogWarn("Deprecated: use buildpacks:set-property instead of specifying DOKKU_IMAGE environment variable")
|
||||||
|
fmt.Println(dokkuImage)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TriggerInstall runs the install step for the buildpacks plugin
|
||||||
|
func TriggerInstall() error {
|
||||||
|
if err := common.PropertySetup("buildpacks"); err != nil {
|
||||||
|
return fmt.Errorf("Unable to install the buildpacks plugin: %s", err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TriggerPostAppCloneSetup creates new buildpacks files
|
// TriggerPostAppCloneSetup creates new buildpacks files
|
||||||
@@ -40,29 +66,25 @@ func TriggerPostAppRenameSetup(oldAppName string, newAppName string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TriggerPostDelete destroys the buildpacks property for a given app container
|
// TriggerPostDelete destroys the buildpacks property for a given app container
|
||||||
func TriggerPostDelete(appName string) {
|
func TriggerPostDelete(appName string) error {
|
||||||
err := common.PropertyDestroy("buildpacks", appName)
|
return common.PropertyDestroy("buildpacks", appName)
|
||||||
if err != nil {
|
|
||||||
common.LogFail(err.Error())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TriggerPostExtract writes a .buildpacks file into the app
|
// TriggerPostExtract writes a .buildpacks file into the app
|
||||||
func TriggerPostExtract(appName string, sourceWorkDir string) {
|
func TriggerPostExtract(appName string, sourceWorkDir string) error {
|
||||||
buildpacks, err := common.PropertyListGet("buildpacks", appName, "buildpacks")
|
buildpacks, err := common.PropertyListGet("buildpacks", appName, "buildpacks")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(buildpacks) == 0 {
|
if len(buildpacks) == 0 {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
buildpacksPath := filepath.Join(sourceWorkDir, ".buildpacks")
|
buildpacksPath := filepath.Join(sourceWorkDir, ".buildpacks")
|
||||||
file, err := os.OpenFile(buildpacksPath, os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0600)
|
file, err := os.OpenFile(buildpacksPath, os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
common.LogFail(fmt.Sprintf("Error writing .buildpacks file: %s", err.Error()))
|
return fmt.Errorf("Error writing .buildpacks file: %s", err.Error())
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
w := bufio.NewWriter(file)
|
w := bufio.NewWriter(file)
|
||||||
@@ -71,8 +93,9 @@ func TriggerPostExtract(appName string, sourceWorkDir string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err = w.Flush(); err != nil {
|
if err = w.Flush(); err != nil {
|
||||||
common.LogFail(fmt.Sprintf("Error writing .buildpacks file: %s", err.Error()))
|
return fmt.Errorf("Error writing .buildpacks file: %s", err.Error())
|
||||||
return
|
|
||||||
}
|
}
|
||||||
file.Chmod(0600)
|
file.Chmod(0600)
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -713,9 +713,6 @@ dokku_receive() {
|
|||||||
local DOKKU_CNB_EXPERIMENTAL="$(config_get "$APP" DOKKU_CNB_EXPERIMENTAL || true)"
|
local DOKKU_CNB_EXPERIMENTAL="$(config_get "$APP" DOKKU_CNB_EXPERIMENTAL || true)"
|
||||||
if [[ "$DOKKU_CNB_EXPERIMENTAL" == "1" ]]; then
|
if [[ "$DOKKU_CNB_EXPERIMENTAL" == "1" ]]; then
|
||||||
IMAGE_SOURCE_TYPE="cnb"
|
IMAGE_SOURCE_TYPE="cnb"
|
||||||
dokku_log_info1 "Building $APP from $IMAGE_SOURCE_TYPE (experimental)..."
|
|
||||||
else
|
|
||||||
dokku_log_info1 "Building $APP from $IMAGE_SOURCE_TYPE..."
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
DOKKU_QUIET_OUTPUT=1 config_set --no-restart "$APP" DOKKU_APP_TYPE="$IMAGE_SOURCE_TYPE"
|
DOKKU_QUIET_OUTPUT=1 config_set --no-restart "$APP" DOKKU_APP_TYPE="$IMAGE_SOURCE_TYPE"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
const MaxSize = "10m"
|
const MaxSize = "10m"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// DefaultProperties is a map of all valid ps properties with corresponding default property values
|
// DefaultProperties is a map of all valid logs properties with corresponding default property values
|
||||||
DefaultProperties = map[string]string{
|
DefaultProperties = map[string]string{
|
||||||
"max-size": "",
|
"max-size": "",
|
||||||
"vector-sink": "",
|
"vector-sink": "",
|
||||||
|
|||||||
1
plugins/repo/.gitignore
vendored
1
plugins/repo/.gitignore
vendored
@@ -3,3 +3,4 @@
|
|||||||
/triggers/*
|
/triggers/*
|
||||||
/triggers
|
/triggers
|
||||||
/pre-delete
|
/pre-delete
|
||||||
|
/post-stack-set
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
SUBCOMMANDS = subcommands/gc subcommands/purge-cache
|
SUBCOMMANDS = subcommands/gc subcommands/purge-cache
|
||||||
TRIGGERS = triggers/pre-delete
|
TRIGGERS = triggers/post-stack-set triggers/pre-delete
|
||||||
BUILD = commands subcommands triggers
|
BUILD = commands subcommands triggers
|
||||||
PLUGIN_NAME = repo
|
PLUGIN_NAME = repo
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ func main() {
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
switch trigger {
|
switch trigger {
|
||||||
|
case "post-stack-set":
|
||||||
|
appName := flag.Arg(0)
|
||||||
|
err = repo.PurgeCache(appName)
|
||||||
case "pre-delete":
|
case "pre-delete":
|
||||||
appName := flag.Arg(0)
|
appName := flag.Arg(0)
|
||||||
err = repo.PurgeCache(appName)
|
err = repo.PurgeCache(appName)
|
||||||
|
|||||||
Reference in New Issue
Block a user