You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2019/01/13 14:47:19 UTC
[camel-k] 05/09: Fix #312: add publisher to release phase
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 49ebee4e78c4a370d883e7d15b87cf1562c004d5
Author: nferraro <ni...@gmail.com>
AuthorDate: Fri Jan 11 08:40:52 2019 +0100
Fix #312: add publisher to release phase
---
cmd/util/publisher/publisher.go | 113 ++++++++++++++++++++++++++++++++++++----
script/Makefile | 12 +++--
script/publish_base_images.sh | 12 +++++
3 files changed, 123 insertions(+), 14 deletions(-)
diff --git a/cmd/util/publisher/publisher.go b/cmd/util/publisher/publisher.go
index c52a76b..857bbc0 100644
--- a/cmd/util/publisher/publisher.go
+++ b/cmd/util/publisher/publisher.go
@@ -19,12 +19,15 @@ package main
import (
"context"
+ "fmt"
"io/ioutil"
"os"
"os/exec"
"path"
"path/filepath"
+ "sort"
"strings"
+ "time"
"github.com/apache/camel-k/deploy"
"github.com/apache/camel-k/pkg/apis"
@@ -32,11 +35,37 @@ import (
"github.com/apache/camel-k/pkg/builder"
"github.com/apache/camel-k/pkg/util/camel"
"github.com/apache/camel-k/pkg/util/kubernetes"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
clientscheme "k8s.io/client-go/kubernetes/scheme"
)
+// PublisherOptions --
+type PublisherOptions struct {
+ StartWith string
+ EndWith string
+ BuildAttempts int
+}
+
// Publishes predefined images for all Camel components
func main() {
+
+ options := PublisherOptions{
+ }
+ var cmd = cobra.Command{
+ Use: "publisher",
+ Short: "Publisher allows to publish base images before a release",
+ Run: options.run,
+ }
+
+ cmd.Flags().StringVar(&options.StartWith, "start-with", "", "The component to start with")
+ cmd.Flags().StringVar(&options.EndWith, "end-with", "", "The component to end with")
+ cmd.Flags().IntVar(&options.BuildAttempts, "attempts", 5, "The maximum number of build attempts")
+
+ panicIfErr(cmd.Execute())
+}
+
+func (options *PublisherOptions) run(cmd *cobra.Command, args []string) {
scheme := clientscheme.Scheme
panicIfErr(apis.AddToScheme(scheme))
@@ -45,18 +74,58 @@ func main() {
p := platRun.(*v1alpha1.IntegrationPlatform)
- for _, a := range camel.Runtime.Artifacts {
+ started := options.StartWith == ""
+
+ keys := make([]string, 0, len(camel.Runtime.Artifacts))
+ for k := range camel.Runtime.Artifacts {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+
+ for _, k := range keys {
+ a := camel.Runtime.Artifacts[k]
if a.GroupID == "org.apache.camel" {
component := strings.TrimPrefix(a.ArtifactID, "camel-")
- build(component, p.Spec.Build.CamelVersion)
+ if options.StartWith == component {
+ started = true
+ }
+
+ if started {
+ fmt.Printf("building component %s\n", component)
+ options.buildWithAttempts(component, p.Spec.Build.CamelVersion)
+ } else {
+ fmt.Printf("skipping component %s\n", component)
+ }
+
+ if options.EndWith == component {
+ fmt.Println("reached final component")
+ break
+ }
+ }
+ }
+}
+
+func (options *PublisherOptions) buildWithAttempts(component string, camelVersion string) {
+ var err error
+ for i := 0; i < options.BuildAttempts; i++ {
+ err = options.build(component, camelVersion)
+ if err != nil {
+ sleepTime := 5 * (i + 1)
+ fmt.Printf("waiting %d seconds to recover from error %v\n", sleepTime, err)
+ time.Sleep(time.Duration(sleepTime) * time.Second)
+ } else {
+ return
}
}
+ panicIfErr(errors.Wrap(err, "build failed after maximum number of attempts"))
}
-func build(component string, camelVersion string) {
+func (options *PublisherOptions) build(component string, camelVersion string) error {
dir, err := ioutil.TempDir(os.TempDir(), "camel-k-build-")
- panicIfErr(err)
- defer panicIfErr(os.RemoveAll(dir))
+ if err != nil {
+ return err
+ }
+ defer os.RemoveAll(dir)
ctx := builder.Context{
C: context.TODO(),
@@ -77,26 +146,48 @@ func build(component string, camelVersion string) {
},
}
- panicIfErr(builder.GenerateProject(&ctx))
- panicIfErr(builder.ComputeDependencies(&ctx))
- panicIfErr(builder.StandardPackager(&ctx))
+ err = builder.GenerateProject(&ctx)
+ if err != nil {
+ return err
+ }
+ err = builder.ComputeDependencies(&ctx)
+ if err != nil {
+ return err
+ }
+ err = builder.StandardPackager(&ctx)
+ if err != nil {
+ return err
+ }
archiveDir, archiveName := filepath.Split(ctx.Archive)
dockerfile := `
FROM fabric8/s2i-java:2.3
ADD ` + archiveName + ` /deployments/
`
- panicIfErr(ioutil.WriteFile(path.Join(archiveDir, "Dockerfile"), []byte(dockerfile), 0777))
+
+ err = ioutil.WriteFile(path.Join(archiveDir, "Dockerfile"), []byte(dockerfile), 0777)
+ if err != nil {
+ return err
+ }
+
image := builder.PredefinedImageNameFor(component)
buildCmd := exec.Command("docker", "build", "-t", image, archiveDir)
buildCmd.Stdout = os.Stdout
buildCmd.Stderr = os.Stderr
- panicIfErr(buildCmd.Run())
+ err = buildCmd.Run()
+ if err != nil {
+ return err
+ }
pushCmd := exec.Command("docker", "push", image)
pushCmd.Stdout = os.Stdout
pushCmd.Stderr = os.Stderr
- panicIfErr(pushCmd.Run())
+ err = pushCmd.Run()
+ if err != nil {
+ return err
+ }
+
+ return nil
}
func panicIfErr(err error) {
diff --git a/script/Makefile b/script/Makefile
index a3815f7..e53e306 100644
--- a/script/Makefile
+++ b/script/Makefile
@@ -1,6 +1,6 @@
build: build-runtime build-operator build-kamel build-compile-integration-tests test
-build-go: build-embed-resources build-operator build-kamel
+build-go: build-embed-resources build-operator build-kamel build-publisher
build-operator: build-embed-resources
go build -o camel-k ./cmd/manager/*.go
@@ -8,6 +8,9 @@ build-operator: build-embed-resources
build-kamel:
go build -o kamel ./cmd/kamel/*.go
+build-publisher:
+ go build -o publisher ./cmd/util/publisher/*.go
+
build-embed-resources:
./script/embed_resources.sh deploy
@@ -17,7 +20,7 @@ build-compile-integration-tests:
build-runtime:
./mvnw clean install -f ./runtime/pom.xml
-release: clean prepare-release build images-build images-push cross-compile package-examples git-tag
+release: clean prepare-release build images-build images-push cross-compile package-examples git-tag publish-base-images
prepare-release:
./script/prepare_release.sh
@@ -36,6 +39,9 @@ package-examples:
git-tag:
./script/git_tag.sh
+publish-base-images:
+ ./script/publish_base_images.sh
+
dep:
dep ensure -v
@@ -76,4 +82,4 @@ check-integration:
lint:
golangci-lint run
-.PHONY: build build-operator build-kamel build-embed-resources build-runtime dep codegen images images-build images-push test check test-integration check-integration clean release prepare-release cross-compile package-examples new-version git-tag increment-snapshot install-minishift
+.PHONY: build build-operator build-kamel build-embed-resources build-runtime dep codegen images images-build images-push test check test-integration check-integration clean release prepare-release cross-compile package-examples new-version git-tag publish-base-images increment-snapshot install-minishift
diff --git a/script/publish_base_images.sh b/script/publish_base_images.sh
new file mode 100755
index 0000000..4915dee
--- /dev/null
+++ b/script/publish_base_images.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+set -e
+
+location=$(dirname $0)
+rootdir=$(realpath $location/../)
+
+echo "Start publishing base images"
+
+$rootdir/publisher
+
+echo "All base images have been published"