Merge pull request #8004 from Tashows/buildpacks-detect

Add buildpacks:detect subcommand
This commit is contained in:
Jose Diaz-Gonzalez
2025-11-15 19:53:37 -05:00
committed by GitHub
6 changed files with 80 additions and 5 deletions

View File

@@ -86,11 +86,11 @@
},
{
"name": "herokuish",
"version": "0.11.3",
"version": "0.11.5",
"urls": {
"amd64": "https://github.com/gliderlabs/herokuish/releases/download/v0.11.3/herokuish_0.11.3_linux_x86_64.tgz",
"arm64": "https://github.com/gliderlabs/herokuish/releases/download/v0.11.3/herokuish_0.11.3_linux_x86_64.tgz"
"amd64": "https://github.com/gliderlabs/herokuish/releases/download/v0.11.5/herokuish_0.11.5_linux_x86_64.tgz",
"arm64": "https://github.com/gliderlabs/herokuish/releases/download/v0.11.5/herokuish_0.11.5_linux_x86_64.tgz"
}
}
]
}
}

View File

@@ -1,4 +1,4 @@
SUBCOMMANDS = subcommands/add subcommands/clear subcommands/list subcommands/remove subcommands/report subcommands/set subcommands/set-property
SUBCOMMANDS = subcommands/add subcommands/clear subcommands/detect subcommands/list subcommands/remove subcommands/report subcommands/set subcommands/set-property
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
PLUGIN_NAME = buildpacks

View File

@@ -63,3 +63,32 @@ func validBuildpackURL(buildpack string) (string, error) {
return buildpack, fmt.Errorf("Invalid buildpack specified: %v", buildpack)
}
func checkoutBareGitRepo(sourceWorkDir string, branch string) (string, error) {
tmpdir, err := os.MkdirTemp("", "bare-git-checkout")
if err != nil {
return "", fmt.Errorf("Unable to create temporary directory: %s", err.Error())
}
args := []string{
"--git-dir=" + sourceWorkDir,
"--work-tree=" + tmpdir,
"checkout", "-f",
}
if branch != "" {
args = append(args, branch)
}
result, err := common.CallExecCommand(common.ExecCommandInput{
Command: "git",
Args: args,
})
if err != nil {
os.RemoveAll(tmpdir)
return "", fmt.Errorf("Unable to checkout bare git repository: %s", result.StderrContents())
}
return tmpdir, nil
}

View File

@@ -20,6 +20,7 @@ Additional commands:`
helpContent = `
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:detect <app> [--branch <branch-name>], Detect the buildpack for an app (if not specified, the branch flag defaults to the deploy branch)
buildpacks:list <app>, List all buildpacks for an 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

View File

@@ -30,6 +30,15 @@ func main() {
args.Parse(os.Args[2:])
appName := args.Arg(0)
err = buildpacks.CommandClear(appName)
case "detect":
args := flag.NewFlagSet("buildpacks:detect", flag.ExitOnError)
branch := args.String("branch", "", "--branch: the branch to detect against (defaults to the deploy branch)")
args.Parse(os.Args[2:])
appName := args.Arg(0)
if *branch == "" {
*branch = common.PropertyGet("git", appName, "deploy-branch")
}
err = buildpacks.CommandDetect(appName, *branch)
case "list":
args := flag.NewFlagSet("buildpacks:list", flag.ExitOnError)
args.Parse(os.Args[2:])

View File

@@ -3,6 +3,7 @@ package buildpacks
import (
"errors"
"fmt"
"os"
"github.com/dokku/dokku/plugins/common"
)
@@ -30,6 +31,41 @@ func CommandClear(appName string) error {
return common.PropertyDelete("buildpacks", appName, "buildpacks")
}
// CommandDetect implements buildpacks:detect
func CommandDetect(appName string, branch string) (err error) {
if err := common.VerifyAppName(appName); err != nil {
return err
}
workDir := common.AppRoot(appName)
checkedOutDir, err := checkoutBareGitRepo(workDir, branch)
if err != nil {
return err
}
defer func() {
if err := os.RemoveAll(checkedOutDir); err != nil {
common.LogWarn(fmt.Sprintf("Failed to remove temporary directory %s: %v", checkedOutDir, err))
}
}()
dockerArgs := []string{
"run", "--rm",
"-v", fmt.Sprintf("%s:/tmp/app", checkedOutDir),
"gliderlabs/herokuish", "/bin/herokuish", "buildpack", "detect", "/tmp/app",
}
result, err := common.CallExecCommand(common.ExecCommandInput{
Command: common.DockerBin(),
Args: dockerArgs,
})
if err != nil {
return fmt.Errorf("Buildpack detection failed: %s", result.StderrContents())
}
common.LogVerbose(result.StdoutContents())
return nil
}
// CommandList implements buildpacks:list
func CommandList(appName string) (err error) {
if err := common.VerifyAppName(appName); err != nil {