diff --git a/plugins/registry/functions.go b/plugins/registry/functions.go new file mode 100644 index 000000000..5adff1eca --- /dev/null +++ b/plugins/registry/functions.go @@ -0,0 +1,57 @@ +package registry + +import ( + "fmt" + "strconv" + + "github.com/dokku/dokku/plugins/common" +) + +func isPushEnabled(appName string) bool { + return reportComputedPushOnRelease(appName) == "true" +} + +func incrementTagVersion(appName string) (string, error) { + tag := common.PropertyGet("registry", appName, "tag-version") + if tag == "" { + tag = "0" + } + + version, err := strconv.Atoi(tag) + if err != nil { + return "", fmt.Errorf("Unable to convert existing tag version (%s) to integer: %v", tag, err) + } + + version += 1 + common.LogVerboseQuiet(fmt.Sprintf("Bumping tag to %d", version)) + if err = common.PropertyWrite("registry", appName, "tag-version", strconv.Itoa(version)); err != nil { + return "", err + } + + return strconv.Itoa(version), nil +} + +func pushToRegistry(appName string, imageTag string) error { + common.LogVerboseQuiet("Retrieving image info for app") + + // DOKKU_REGISTRY_SERVER=$(fn-registry-remote-repository "$APP") + // IMAGE_REPO=$(fn-registry-image-repo "$APP") + // IMAGE_TAG="$(get_running_image_tag "$APP")" + // IMAGE=$(get_app_image_name "$APP" "$IMAGE_TAG") + // IMAGE_ID=$(docker inspect --format '{{ .Id }}' "$IMAGE") + + // dokku_log_verbose_quiet "Tagging $IMAGE_REPO:$TAG in registry format" + // docker tag "$IMAGE_ID" "${DOKKU_REGISTRY_SERVER}${IMAGE_REPO}:${TAG}" + // docker tag "$IMAGE_ID" "${IMAGE_REPO}:${TAG}" + + // fn-registry-create-repository "$APP" "$DOKKU_REGISTRY_SERVER" "$IMAGE_REPO" + + common.LogVerboseQuiet("Pushing $IMAGE_REPO:$TAG") + // docker push "${DOKKU_REGISTRY_SERVER}${IMAGE_REPO}:${TAG}" + + common.LogVerboseQuiet("Cleaning up") + // fn-registry-image-cleanup "$APP" "$DOKKU_REGISTRY_SERVER" "$IMAGE_REPO" "$IMAGE_TAG" "$TAG" + + common.LogVerboseQuiet("Image $IMAGE_REPO:$TAG pushed") + return nil +} diff --git a/plugins/registry/src/triggers/triggers.go b/plugins/registry/src/triggers/triggers.go index 7ab5872b1..028fbb2eb 100644 --- a/plugins/registry/src/triggers/triggers.go +++ b/plugins/registry/src/triggers/triggers.go @@ -18,11 +18,17 @@ func main() { var err error switch trigger { + case "deployed-app-repository": + appName := flag.Arg(0) + err = registry.TriggerDeployedAppRepository(appName) case "install": err = registry.TriggerInstall() case "post-delete": appName := flag.Arg(0) err = registry.TriggerPostDelete(appName) + case "post-release-builder": + appName := flag.Arg(1) + err = registry.TriggerPostReleaseBuilder(appName) case "report": appName := flag.Arg(0) err = registry.ReportSingleApp(appName, "", "") diff --git a/plugins/registry/triggers.go b/plugins/registry/triggers.go index 9039bd773..47f2b313f 100644 --- a/plugins/registry/triggers.go +++ b/plugins/registry/triggers.go @@ -6,6 +6,11 @@ import ( "github.com/dokku/dokku/plugins/common" ) +// TriggerDeployedAppRepository outputs the associated registry repository to stdout +func TriggerDeployedAppRepository(appName string) error { + // TODO +} + // TriggerInstall runs the install step for the registry plugin func TriggerInstall() error { if err := common.PropertySetup("registry"); err != nil { @@ -19,3 +24,18 @@ func TriggerInstall() error { func TriggerPostDelete(appName string) error { return common.PropertyDestroy("registry", appName) } + +// TriggerPostReleaseBuilder pushes the image to the remote registry +func TriggerPostReleaseBuilder(appName string) error { + if !isPushEnabled(appName) { + return nil + } + + common.LogInfo1("Pushing image to registry") + imageTag, err := incrementTagVersion(appName) + if err != nil { + return err + } + + return pushToRegistry(appName, imageTag) +}