You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2022/02/15 14:20:02 UTC

[camel-k] 01/02: fix(build): incremental build

This is an automated email from the ASF dual-hosted git repository.

astefanutti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit bba4b5b439edc9a2d62e157fccc306cc70f6a9b1
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Fri Feb 11 13:26:38 2022 +0100

    fix(build): incremental build
    
    * Fixed the SHA1 which were not calculated properly
    * Unit and E2E test to make sure we'll be warned if the behavior is broken again
    
    Closes #3007
---
 e2e/common/build/incremental_build_test.go | 68 ++++++++++++++++++++++++++++++
 pkg/builder/image.go                       |  6 ---
 pkg/util/digest/digest.go                  |  6 +--
 pkg/util/digest/digest_test.go             | 17 ++++++++
 4 files changed, 87 insertions(+), 10 deletions(-)

diff --git a/e2e/common/build/incremental_build_test.go b/e2e/common/build/incremental_build_test.go
new file mode 100644
index 0000000..fe0d9a0
--- /dev/null
+++ b/e2e/common/build/incremental_build_test.go
@@ -0,0 +1,68 @@
+//go:build integration
+// +build integration
+
+// To enable compilation of this file in Goland, go to "Settings -> Go -> Vendoring & Build Tags -> Custom Tags" and add "integration"
+
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package build
+
+import (
+	"testing"
+
+	. "github.com/onsi/gomega"
+
+	corev1 "k8s.io/api/core/v1"
+
+	. "github.com/apache/camel-k/e2e/support"
+	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
+	"github.com/apache/camel-k/pkg/util/defaults"
+)
+
+func TestRunIncrementalBuild(t *testing.T) {
+	WithNewTestNamespace(t, func(ns string) {
+		Expect(Kamel("install", "-n", ns).Execute()).To(Succeed())
+
+		name := "java"
+		Expect(Kamel("run", "-n", ns, "files/Java.java",
+			"--name", name,
+		).Execute()).To(Succeed())
+		Eventually(IntegrationPodPhase(ns, name), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+		Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+		integrationKitName := IntegrationKit(ns, name)()
+		Eventually(Kit(ns, integrationKitName)().Status.BaseImage).Should(Equal(defaults.BaseImage()))
+		// Another integration that should be built on top of the previous IntegrationKit
+		// just add a new random dependency
+		name2 := "java2"
+		Expect(Kamel("run", "-n", ns, "files/Java.java",
+			"--name", name2,
+			"-d", "camel-zipfile",
+		).Execute()).To(Succeed())
+		Eventually(IntegrationPodPhase(ns, name2), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
+		Eventually(IntegrationConditionStatus(ns, name2, v1.IntegrationConditionReady), TestTimeoutShort).Should(Equal(corev1.ConditionTrue))
+		Eventually(IntegrationLogs(ns, name2), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+		integrationKitName2 := IntegrationKit(ns, name2)()
+		// the container can come in a format like
+		// 10.108.177.66/test-d7cad110-bb1d-4e79-8a0e-ebd44f6fe5d4/camel-k-kit-c8357r4k5tp6fn1idm60@sha256:d49716f0429ad8b23a1b8d20a357d64b1aa42a67c1a2a534ebd4c54cd598a18d
+		// we should be save just to check the substring is contained
+		Eventually(Kit(ns, integrationKitName2)().Status.BaseImage).Should(ContainSubstring(integrationKitName))
+
+		Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
+	})
+}
diff --git a/pkg/builder/image.go b/pkg/builder/image.go
index 3a200be..a005f42 100644
--- a/pkg/builder/image.go
+++ b/pkg/builder/image.go
@@ -120,12 +120,6 @@ func jvmDockerfile(ctx *builderContext) error {
 }
 
 func incrementalImageContext(ctx *builderContext) error {
-	if ctx.Build.BaseImage != "" {
-		// If the build requires a specific image, don't try to determine the
-		// base image using artifact so just use the standard packages
-		return standardImageContext(ctx)
-	}
-
 	images, err := listPublishedImages(ctx)
 	if err != nil {
 		return err
diff --git a/pkg/util/digest/digest.go b/pkg/util/digest/digest.go
index 566a873..0ab8c9e 100644
--- a/pkg/util/digest/digest.go
+++ b/pkg/util/digest/digest.go
@@ -268,10 +268,8 @@ func ComputeSHA1(elem ...string) (string, error) {
 		return nil
 	})
 
-	var sum string
-
 	if err != nil {
-		sum = base64.StdEncoding.EncodeToString(h.Sum(nil))
+		return "", err
 	}
-	return sum, err
+	return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
 }
diff --git a/pkg/util/digest/digest_test.go b/pkg/util/digest/digest_test.go
index 096146f..68c1b22 100644
--- a/pkg/util/digest/digest_test.go
+++ b/pkg/util/digest/digest_test.go
@@ -18,6 +18,8 @@ limitations under the License.
 package digest
 
 import (
+	"io/ioutil"
+	"os"
 	"testing"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
@@ -44,3 +46,18 @@ func TestDigestUsesAnnotations(t *testing.T) {
 	assert.NoError(t, err)
 	assert.NotEqual(t, digest1, digest3)
 }
+
+func TestDigestSHA1FromTempFile(t *testing.T) {
+	var tmpFile *os.File
+	var err error
+	if tmpFile, err = ioutil.TempFile("", "camel-k-"); err != nil {
+		t.Error(err)
+	}
+
+	assert.Nil(t, tmpFile.Close())
+	assert.Nil(t, ioutil.WriteFile(tmpFile.Name(), []byte("hello test!"), 0o400))
+
+	sha1, err := ComputeSHA1(tmpFile.Name())
+	assert.NoError(t, err)
+	assert.Equal(t, "OXPdxTeLf5rqnsqvTi0CgmWoN/0=", sha1)
+}