Merge pull request #8157 from dokku/7102-buildpacks-app-json
Add support for specifying buildpacks via app.json
This commit is contained in:
@@ -5,6 +5,25 @@
|
||||
> [!IMPORTANT]
|
||||
> While the `app.json` format used by Dokku is based on the one [supported by Heroku](https://devcenter.heroku.com/articles/app-json-schema), not all Heroku functionality is supported by Dokku.
|
||||
|
||||
## Buildpacks
|
||||
|
||||
```json
|
||||
{
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "heroku/python"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/heroku/heroku-buildpack-nodejs.git"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
(list, optional) A list of buildpacks to use when deploying the app. Each entry is an object with a `url` property. Buildpacks specified via the `buildpacks:add` or `buildpacks:set` commands take precedence over those specified in `app.json`. Buildpack URLs may use the shorthand format (e.g., `heroku/python`) which will be expanded to the full GitHub URL.
|
||||
|
||||
- `url`: (string, required) The URL or shorthand reference of the buildpack.
|
||||
|
||||
## Cron
|
||||
|
||||
```json
|
||||
|
||||
@@ -130,6 +130,24 @@ This will use the latest commit on the `master` branch of the specified buildpac
|
||||
dokku buildpacks:set node-js-app https://github.com/heroku/heroku-buildpack-nodejs#v87
|
||||
```
|
||||
|
||||
### Specifying buildpacks via app.json
|
||||
|
||||
Buildpacks can also be specified in the `app.json` file at the root of your repository:
|
||||
|
||||
```json
|
||||
{
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "heroku/python"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Buildpacks configured via `buildpacks:add` or `buildpacks:set` commands take precedence over those specified in `app.json`. If no buildpacks are configured via commands and `app.json` contains a `buildpacks` entry, those buildpacks will be used.
|
||||
|
||||
Shorthand buildpack references (e.g., `heroku/python`) are expanded to full GitHub URLs automatically.
|
||||
|
||||
### Displaying buildpack reports for an app
|
||||
|
||||
You can get a report about the app's buildpacks status using the `buildpacks:report` command:
|
||||
|
||||
@@ -26,6 +26,9 @@ var (
|
||||
|
||||
// AppJSON is a struct that represents an app.json file as understood by Dokku
|
||||
type AppJSON struct {
|
||||
// Buildpacks is a list of buildpacks to use for the app
|
||||
Buildpacks []Buildpack `json:"buildpacks"`
|
||||
|
||||
// Cron is a list of cron tasks to execute
|
||||
Cron []CronTask `json:"cron"`
|
||||
|
||||
@@ -51,6 +54,12 @@ type AppJSON struct {
|
||||
} `json:"scripts"`
|
||||
}
|
||||
|
||||
// Buildpack is a struct that represents a single buildpack
|
||||
type Buildpack struct {
|
||||
// URL is the URL of the buildpack
|
||||
URL string `json:"url"`
|
||||
}
|
||||
|
||||
// CronTask is a struct that represents a single cron task from an app.json file
|
||||
type CronTask struct {
|
||||
// Command is the command to execute
|
||||
|
||||
141
plugins/buildpacks/buildpacks_test.go
Normal file
141
plugins/buildpacks/buildpacks_test.go
Normal file
@@ -0,0 +1,141 @@
|
||||
package buildpacks
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
func setupTestEnvironment(t *testing.T) string {
|
||||
t.Helper()
|
||||
tmpDir, err := os.MkdirTemp("", "buildpacks-test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
os.Setenv("DOKKU_LIB_ROOT", tmpDir)
|
||||
os.Setenv("PLUGIN_PATH", "/var/lib/dokku/plugins")
|
||||
os.Setenv("PLUGIN_ENABLED_PATH", "/var/lib/dokku/plugins/enabled")
|
||||
|
||||
return tmpDir
|
||||
}
|
||||
|
||||
func teardownTestEnvironment(tmpDir string) {
|
||||
os.RemoveAll(tmpDir)
|
||||
}
|
||||
|
||||
func TestValidBuildpackURL(t *testing.T) {
|
||||
RegisterTestingT(t)
|
||||
|
||||
url, err := validBuildpackURL("")
|
||||
Expect(err).To(HaveOccurred())
|
||||
Expect(err.Error()).To(ContainSubstring("Must specify a buildpack"))
|
||||
|
||||
url, err = validBuildpackURL("heroku/nodejs")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(url).To(Equal("https://github.com/heroku/heroku-buildpack-nodejs.git"))
|
||||
|
||||
url, err = validBuildpackURL("heroku/python")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(url).To(Equal("https://github.com/heroku/heroku-buildpack-python.git"))
|
||||
|
||||
url, err = validBuildpackURL("heroku-community/apt")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(url).To(Equal("https://github.com/heroku/heroku-buildpack-apt.git"))
|
||||
|
||||
url, err = validBuildpackURL("https://github.com/heroku/heroku-buildpack-nodejs.git")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(url).To(Equal("https://github.com/heroku/heroku-buildpack-nodejs.git"))
|
||||
|
||||
url, err = validBuildpackURL("https://github.com/heroku/heroku-buildpack-nodejs")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(url).To(Equal("https://github.com/heroku/heroku-buildpack-nodejs"))
|
||||
|
||||
url, err = validBuildpackURL("git://github.com/heroku/heroku-buildpack-nodejs.git")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(url).To(Equal("git://github.com/heroku/heroku-buildpack-nodejs.git"))
|
||||
|
||||
_, err = validBuildpackURL("nodejs")
|
||||
Expect(err).To(HaveOccurred())
|
||||
Expect(err.Error()).To(ContainSubstring("Invalid buildpack specified"))
|
||||
|
||||
_, err = validBuildpackURL("/nodejs")
|
||||
Expect(err).To(HaveOccurred())
|
||||
Expect(err.Error()).To(ContainSubstring("Invalid buildpack specified"))
|
||||
}
|
||||
|
||||
func TestGetBuildpacksEmpty(t *testing.T) {
|
||||
RegisterTestingT(t)
|
||||
tmpDir := setupTestEnvironment(t)
|
||||
defer teardownTestEnvironment(tmpDir)
|
||||
|
||||
buildpacks, err := getBuildpacks("test-app")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(buildpacks).To(BeEmpty())
|
||||
}
|
||||
|
||||
func TestGetBuildpacksFromProperties(t *testing.T) {
|
||||
RegisterTestingT(t)
|
||||
tmpDir := setupTestEnvironment(t)
|
||||
defer teardownTestEnvironment(tmpDir)
|
||||
|
||||
propDir := filepath.Join(tmpDir, "config", "buildpacks", "test-app")
|
||||
Expect(os.MkdirAll(propDir, 0755)).To(Succeed())
|
||||
Expect(os.WriteFile(filepath.Join(propDir, "buildpacks"), []byte("https://github.com/heroku/heroku-buildpack-nodejs.git\nhttps://github.com/heroku/heroku-buildpack-python.git\n"), 0644)).To(Succeed())
|
||||
|
||||
buildpacks, err := getBuildpacks("test-app")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(buildpacks).To(HaveLen(2))
|
||||
Expect(buildpacks[0]).To(Equal("https://github.com/heroku/heroku-buildpack-nodejs.git"))
|
||||
Expect(buildpacks[1]).To(Equal("https://github.com/heroku/heroku-buildpack-python.git"))
|
||||
}
|
||||
|
||||
func TestGetBuildpacksFromAppJSON(t *testing.T) {
|
||||
RegisterTestingT(t)
|
||||
tmpDir := setupTestEnvironment(t)
|
||||
defer teardownTestEnvironment(tmpDir)
|
||||
|
||||
appJSONDir := filepath.Join(tmpDir, "data", "app-json", "test-app")
|
||||
Expect(os.MkdirAll(appJSONDir, 0755)).To(Succeed())
|
||||
Expect(os.WriteFile(filepath.Join(appJSONDir, "app.json"), []byte(`{"buildpacks": [{"url": "https://github.com/heroku/heroku-buildpack-nodejs.git"}]}`), 0644)).To(Succeed())
|
||||
|
||||
buildpacks, err := getBuildpacks("test-app")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(buildpacks).To(HaveLen(1))
|
||||
Expect(buildpacks[0]).To(Equal("https://github.com/heroku/heroku-buildpack-nodejs.git"))
|
||||
}
|
||||
|
||||
func TestGetBuildpacksPropertiesOverrideAppJSON(t *testing.T) {
|
||||
RegisterTestingT(t)
|
||||
tmpDir := setupTestEnvironment(t)
|
||||
defer teardownTestEnvironment(tmpDir)
|
||||
|
||||
propDir := filepath.Join(tmpDir, "config", "buildpacks", "test-app")
|
||||
Expect(os.MkdirAll(propDir, 0755)).To(Succeed())
|
||||
Expect(os.WriteFile(filepath.Join(propDir, "buildpacks"), []byte("https://github.com/heroku/heroku-buildpack-ruby.git\n"), 0644)).To(Succeed())
|
||||
|
||||
appJSONDir := filepath.Join(tmpDir, "data", "app-json", "test-app")
|
||||
Expect(os.MkdirAll(appJSONDir, 0755)).To(Succeed())
|
||||
Expect(os.WriteFile(filepath.Join(appJSONDir, "app.json"), []byte(`{"buildpacks": [{"url": "https://github.com/heroku/heroku-buildpack-nodejs.git"}]}`), 0644)).To(Succeed())
|
||||
|
||||
buildpacks, err := getBuildpacks("test-app")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(buildpacks).To(HaveLen(1))
|
||||
Expect(buildpacks[0]).To(Equal("https://github.com/heroku/heroku-buildpack-ruby.git"))
|
||||
}
|
||||
|
||||
func TestGetBuildpacksAppJSONEmptyArray(t *testing.T) {
|
||||
RegisterTestingT(t)
|
||||
tmpDir := setupTestEnvironment(t)
|
||||
defer teardownTestEnvironment(tmpDir)
|
||||
|
||||
appJSONDir := filepath.Join(tmpDir, "data", "app-json", "test-app")
|
||||
Expect(os.MkdirAll(appJSONDir, 0755)).To(Succeed())
|
||||
Expect(os.WriteFile(filepath.Join(appJSONDir, "app.json"), []byte(`{"buildpacks": []}`), 0644)).To(Succeed())
|
||||
|
||||
buildpacks, err := getBuildpacks("test-app")
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
Expect(buildpacks).To(BeEmpty())
|
||||
}
|
||||
@@ -8,9 +8,50 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
appjson "github.com/dokku/dokku/plugins/app-json"
|
||||
"github.com/dokku/dokku/plugins/common"
|
||||
)
|
||||
|
||||
// getBuildpacks returns the buildpacks for a given app
|
||||
// the order of application is:
|
||||
// 1. .buildpacks: if it exists, use it
|
||||
// 2. app.json: if it exists and has buildpacks, use them
|
||||
// 3. buildpack properties: if they exist, use them
|
||||
// 4. buildpack detection
|
||||
func getBuildpacks(appName string) ([]string, error) {
|
||||
buildpacks, err := common.PropertyListGet("buildpacks", appName, "buildpacks")
|
||||
if err != nil {
|
||||
return buildpacks, err
|
||||
}
|
||||
|
||||
if len(buildpacks) > 0 {
|
||||
return buildpacks, nil
|
||||
}
|
||||
|
||||
results, _ := common.CallPlugnTrigger(common.PlugnTriggerInput{
|
||||
Trigger: "git-get-property",
|
||||
Args: []string{appName, "source-image"},
|
||||
})
|
||||
if results.StdoutContents() != "" {
|
||||
return buildpacks, nil
|
||||
}
|
||||
|
||||
appJSON, err := appjson.GetAppJSON(appName)
|
||||
if err != nil {
|
||||
return buildpacks, err
|
||||
}
|
||||
|
||||
if len(appJSON.Buildpacks) == 0 {
|
||||
return buildpacks, nil
|
||||
}
|
||||
|
||||
for _, b := range appJSON.Buildpacks {
|
||||
buildpacks = append(buildpacks, b.URL)
|
||||
}
|
||||
|
||||
return buildpacks, nil
|
||||
}
|
||||
|
||||
func rewriteBuildpacksFile(sourceWorkDir string) error {
|
||||
buildpacksPath := filepath.Join(sourceWorkDir, ".buildpacks")
|
||||
if !common.FileExists(buildpacksPath) {
|
||||
@@ -27,6 +68,10 @@ func rewriteBuildpacksFile(sourceWorkDir string) error {
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.HasPrefix(buildpack, "#") {
|
||||
continue
|
||||
}
|
||||
|
||||
buildpack, err = validBuildpackURL(buildpack)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Unable to parse .buildpacks file, line %d: %s", i, err)
|
||||
|
||||
@@ -3,6 +3,7 @@ module github.com/dokku/dokku/plugins/buildpacks
|
||||
go 1.25.5
|
||||
|
||||
require (
|
||||
github.com/dokku/dokku/plugins/app-json v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/common v0.0.0-00010101000000-000000000000
|
||||
github.com/spf13/pflag v1.0.10
|
||||
)
|
||||
@@ -10,20 +11,30 @@ require (
|
||||
require (
|
||||
github.com/alexellis/go-execute/v2 v2.2.1 // indirect
|
||||
github.com/fatih/color v1.19.0 // indirect
|
||||
github.com/google/go-cmp v0.7.0 // indirect
|
||||
github.com/hashicorp/errwrap v1.0.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||
github.com/kr/fs v0.1.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/melbahja/goph v1.5.0 // indirect
|
||||
github.com/onsi/gomega v1.39.1 // indirect
|
||||
github.com/otiai10/copy v1.14.1 // indirect
|
||||
github.com/otiai10/mint v1.6.3 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pkg/sftp v1.13.10 // indirect
|
||||
github.com/ryanuber/columnize v2.1.2+incompatible // indirect
|
||||
github.com/tailscale/hujson v0.0.0-20250605163823-992244df8c5a // indirect
|
||||
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||
golang.org/x/crypto v0.50.0 // indirect
|
||||
golang.org/x/net v0.52.0 // indirect
|
||||
golang.org/x/sync v0.20.0 // indirect
|
||||
golang.org/x/sys v0.43.0 // indirect
|
||||
golang.org/x/text v0.36.0 // indirect
|
||||
k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect
|
||||
)
|
||||
|
||||
replace github.com/dokku/dokku/plugins/app-json => ../app-json
|
||||
|
||||
replace github.com/dokku/dokku/plugins/common => ../common
|
||||
|
||||
@@ -10,6 +10,8 @@ github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/U
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
|
||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||
@@ -36,6 +38,8 @@ github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
||||
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/tailscale/hujson v0.0.0-20250605163823-992244df8c5a h1:a6TNDN9CgG+cYjaeN8l2mc4kSz2iMiCDQxPEyltUV/I=
|
||||
github.com/tailscale/hujson v0.0.0-20250605163823-992244df8c5a/go.mod h1:EbW0wDK/qEUYI0A5bqq0C2kF8JTQwWONmGDBbzsxxHo=
|
||||
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||
golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
|
||||
@@ -51,5 +55,8 @@ golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY=
|
||||
golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY=
|
||||
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
|
||||
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
k8s.io/utils v0.0.0-20240102154912-e7106e64919e h1:eQ/4ljkx21sObifjzXwlPKpdGLrCfRziVtos3ofG/sQ=
|
||||
k8s.io/utils v0.0.0-20240102154912-e7106e64919e/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
|
||||
@@ -74,7 +74,7 @@ func TriggerPostDelete(appName string) error {
|
||||
|
||||
// TriggerPostExtract writes a .buildpacks file into the app
|
||||
func TriggerPostExtract(appName string, sourceWorkDir string) error {
|
||||
buildpacks, err := common.PropertyListGet("buildpacks", appName, "buildpacks")
|
||||
buildpacks, err := getBuildpacks(appName)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
@@ -91,13 +91,20 @@ func TriggerPostExtract(appName string, sourceWorkDir string) error {
|
||||
|
||||
w := bufio.NewWriter(file)
|
||||
for _, buildpack := range buildpacks {
|
||||
buildpack, err = validBuildpackURL(buildpack)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Fprintln(w, buildpack)
|
||||
}
|
||||
|
||||
if err = w.Flush(); err != nil {
|
||||
return fmt.Errorf("Error writing .buildpacks file: %s", err.Error())
|
||||
}
|
||||
file.Chmod(0600)
|
||||
if err = file.Chmod(0600); err != nil {
|
||||
return fmt.Errorf("Error setting .buildpacks file permissions: %s", err.Error())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -5,14 +5,14 @@ go 1.25.5
|
||||
require (
|
||||
github.com/Masterminds/semver/v3 v3.4.0
|
||||
github.com/cert-manager/cert-manager v1.20.2
|
||||
github.com/dokku/dokku/plugins/app-json v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/common v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/config v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/cron v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/docker-options v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/logs v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/nginx-vhosts v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/registry v0.0.0-20250618161309-8d0c35f1333c
|
||||
github.com/dokku/dokku/plugins/app-json v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/common v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/config v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/cron v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/docker-options v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/logs v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/nginx-vhosts v0.0.0-00010101000000-000000000000
|
||||
github.com/dokku/dokku/plugins/registry v0.0.0-00010101000000-000000000000
|
||||
github.com/fatih/color v1.19.0
|
||||
github.com/fluxcd/pkg/kustomize v1.31.0
|
||||
github.com/go-openapi/jsonpointer v0.23.1
|
||||
|
||||
4
tests.mk
4
tests.mk
@@ -149,6 +149,7 @@ ci-go-coverage:
|
||||
@$(MAKE) ci-go-coverage-plugin PLUGIN_NAME=common
|
||||
@$(MAKE) ci-go-coverage-plugin PLUGIN_NAME=config
|
||||
@$(MAKE) ci-go-coverage-plugin PLUGIN_NAME=network
|
||||
@$(MAKE) ci-go-coverage-plugin PLUGIN_NAME=buildpacks
|
||||
|
||||
ci-go-coverage-plugin:
|
||||
mkdir -p test-results/coverage
|
||||
@@ -177,9 +178,10 @@ go-tests:
|
||||
@$(MAKE) go-test-plugin PLUGIN_NAME=common
|
||||
@$(MAKE) go-test-plugin PLUGIN_NAME=config
|
||||
@$(MAKE) go-test-plugin PLUGIN_NAME=network
|
||||
@$(MAKE) go-test-plugin PLUGIN_NAME=buildpacks
|
||||
|
||||
go-test-plugin:
|
||||
cd plugins/$(PLUGIN_NAME) && go get github.com/onsi/gomega && DOKKU_ROOT=/home/dokku go test -v -p 1 -race -mod=readonly || exit $$?
|
||||
cd plugins/$(PLUGIN_NAME) && go get github.com/onsi/gomega && DOKKU_ROOT=/home/dokku DOKKU_LIB_ROOT=/var/lib/dokku go test -v -p 1 -race -mod=readonly || exit $$?
|
||||
|
||||
go-test-plugin-in-docker:
|
||||
@echo running go unit tests...
|
||||
|
||||
@@ -3,11 +3,6 @@
|
||||
"dokku-postgres",
|
||||
"dokku-redis"
|
||||
],
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "https://github.com/heroku/heroku-buildpack-nodejs"
|
||||
}
|
||||
],
|
||||
"description": "Used in dokku's test suite",
|
||||
"env": {
|
||||
"SECRET_TOKEN": {
|
||||
|
||||
@@ -336,6 +336,33 @@ teardown() {
|
||||
assert_output_contains "heroku-buildpack-python"
|
||||
}
|
||||
|
||||
@test "(buildpacks) deploy with buildpacks from app.json" {
|
||||
run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP template_buildpacks_appjson
|
||||
echo "output: $output"
|
||||
echo "status: $status"
|
||||
assert_success
|
||||
assert_output_contains "heroku-buildpack-python"
|
||||
}
|
||||
|
||||
template_buildpacks_appjson() {
|
||||
local APP="$1"
|
||||
local APP_REPO_DIR="$2"
|
||||
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
||||
echo "injecting app.json with buildpacks -> $APP_REPO_DIR/app.json"
|
||||
cat <<EOF >"$APP_REPO_DIR/app.json"
|
||||
{
|
||||
"buildpacks": [
|
||||
{
|
||||
"url": "heroku/python"
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "injecting requirements.txt -> $APP_REPO_DIR/requirements.txt"
|
||||
touch "$APP_REPO_DIR/requirements.txt"
|
||||
}
|
||||
|
||||
template_buildpacks_cleanup() {
|
||||
local APP="$1"
|
||||
local APP_REPO_DIR="$2"
|
||||
|
||||
Reference in New Issue
Block a user