From 0d448436b2c35cde24fe84990f3b1f02e11f4e40 Mon Sep 17 00:00:00 2001 From: Benjamin Yolken Date: Sun, 29 May 2022 20:20:40 -0700 Subject: [PATCH 1/6] Add assumeRole option --- cmd/topicctl/subcmd/shared.go | 48 ++++++++++++++++++++++------------- pkg/admin/connector.go | 9 ++++--- pkg/config/cluster.go | 16 +++++++++--- 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/cmd/topicctl/subcmd/shared.go b/cmd/topicctl/subcmd/shared.go index a73f1e44..074c1a9b 100644 --- a/cmd/topicctl/subcmd/shared.go +++ b/cmd/topicctl/subcmd/shared.go @@ -14,20 +14,21 @@ import ( ) type sharedOptions struct { - brokerAddr string - clusterConfig string - expandEnv bool - saslMechanism string - saslPassword string - saslUsername string - tlsCACert string - tlsCert string - tlsEnabled bool - tlsKey string - tlsSkipVerify bool - tlsServerName string - zkAddr string - zkPrefix string + brokerAddr string + clusterConfig string + expandEnv bool + saslMechanism string + saslPassword string + saslUsername string + saslAssumeRole string + tlsCACert string + tlsCert string + tlsEnabled bool + tlsKey string + tlsSkipVerify bool + tlsServerName string + zkAddr string + zkPrefix string } func (s sharedOptions) validate() error { @@ -95,6 +96,10 @@ func (s sharedOptions) validate() error { (s.saslUsername != "" || s.saslPassword != "") { log.Warn("Username and password are ignored if using SASL AWS-MSK-IAM") } + + if saslMechanism != admin.SASLMechanismAWSMSKIAM && s.saslAssumeRole != "" { + log.Warn("AssumeRole is ignored unless using SASL AWS-MSK-IAM") + } } return err @@ -150,10 +155,11 @@ func (s sharedOptions) getAdminClient( SkipVerify: s.tlsSkipVerify, }, SASL: admin.SASLConfig{ - Enabled: saslEnabled, - Mechanism: saslMechanism, - Password: s.saslPassword, - Username: s.saslUsername, + Enabled: saslEnabled, + Mechanism: saslMechanism, + Password: s.saslPassword, + Username: s.saslUsername, + AssumeRole: s.saslAssumeRole, }, }, ReadOnly: readOnly, @@ -211,6 +217,12 @@ func addSharedFlags(cmd *cobra.Command, options *sharedOptions) { os.Getenv("TOPICCTL_SASL_USERNAME"), "SASL username if using SASL; will override value set in cluster config", ) + cmd.Flags().StringVar( + &options.saslAssumeRole, + "sasl-assume-role", + "", + "Intermediate role to assume if using SASL AWS-MSK-IAM", + ) cmd.Flags().StringVar( &options.tlsCACert, "tls-ca-cert", diff --git a/pkg/admin/connector.go b/pkg/admin/connector.go index 9e626044..35624e08 100644 --- a/pkg/admin/connector.go +++ b/pkg/admin/connector.go @@ -48,10 +48,11 @@ type TLSConfig struct { // SASLConfig stores the SASL-related configuration for a connection. type SASLConfig struct { - Enabled bool - Mechanism SASLMechanism - Username string - Password string + Enabled bool + Mechanism SASLMechanism + Username string + Password string + AssumeRole string } // Connector is a wrapper around the low-level, kafka-go dialer and client. diff --git a/pkg/config/cluster.go b/pkg/config/cluster.go index a5ea4fb8..4fab3720 100644 --- a/pkg/config/cluster.go +++ b/pkg/config/cluster.go @@ -111,6 +111,9 @@ type SASLConfig struct { // Password is the SASL password. Ignored if mechanism is AWS-MSK-IAM. Password string `json:"password"` + + // Intermediate role ARN to assume. Only used if mechanism is AWS-MSK-IAM. + AssumeRole string `json:"assumeRole"` } // Validate evaluates whether the cluster config is valid. @@ -165,6 +168,10 @@ func (c ClusterConfig) Validate() error { (c.Spec.SASL.Username != "" || c.Spec.SASL.Password != "") { log.Warn("Username and password are ignored if using SASL AWS-MSK-IAM") } + + if saslMechanism != admin.SASLMechanismAWSMSKIAM && c.Spec.SASL.AssumeRole != "" { + log.Warn("AssumeRole is ignored unless using SASL AWS-MSK-IAM") + } } return err @@ -231,10 +238,11 @@ func (c ClusterConfig) NewAdminClient( SkipVerify: c.Spec.TLS.SkipVerify, }, SASL: admin.SASLConfig{ - Enabled: c.Spec.SASL.Enabled, - Mechanism: saslMechanism, - Username: saslUsername, - Password: saslPassword, + Enabled: c.Spec.SASL.Enabled, + Mechanism: saslMechanism, + Username: saslUsername, + Password: saslPassword, + AssumeRole: c.Spec.SASL.AssumeRole, }, }, ExpectedClusterID: c.Spec.ClusterID, From 4755174a259fa42a8daa139f5fa13a5983a01913 Mon Sep 17 00:00:00 2001 From: Benjamin Yolken Date: Sun, 29 May 2022 20:36:17 -0700 Subject: [PATCH 2/6] Support assuming intermediate roles --- cmd/topicctl/subcmd/get.go | 2 +- cmd/topicctl/subcmd/repl.go | 2 +- pkg/admin/connector.go | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/cmd/topicctl/subcmd/get.go b/cmd/topicctl/subcmd/get.go index 804c851d..5be48722 100644 --- a/cmd/topicctl/subcmd/get.go +++ b/cmd/topicctl/subcmd/get.go @@ -61,7 +61,7 @@ func getPreRun(cmd *cobra.Command, args []string) error { func getRun(cmd *cobra.Command, args []string) error { ctx := context.Background() - sess := session.Must(session.NewSession()) + sess, _ := session.NewSession() adminClient, err := getConfig.shared.getAdminClient(ctx, sess, true) if err != nil { diff --git a/cmd/topicctl/subcmd/repl.go b/cmd/topicctl/subcmd/repl.go index c3f8aaf5..949a0d8e 100644 --- a/cmd/topicctl/subcmd/repl.go +++ b/cmd/topicctl/subcmd/repl.go @@ -32,7 +32,7 @@ func replPreRun(cmd *cobra.Command, args []string) error { func replRun(cmd *cobra.Command, args []string) error { ctx := context.Background() - sess := session.Must(session.NewSession()) + sess, _ := session.NewSession() adminClient, err := replConfig.shared.getAdminClient(ctx, sess, true) if err != nil { diff --git a/pkg/admin/connector.go b/pkg/admin/connector.go index 35624e08..ea984e70 100644 --- a/pkg/admin/connector.go +++ b/pkg/admin/connector.go @@ -9,6 +9,8 @@ import ( "time" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/credentials/stscreds" "github.com/aws/aws-sdk-go/aws/session" sigv4 "github.com/aws/aws-sdk-go/aws/signer/v4" "github.com/segmentio/kafka-go" @@ -76,7 +78,14 @@ func NewConnector(config ConnectorConfig) (*Connector, error) { switch config.SASL.Mechanism { case SASLMechanismAWSMSKIAM: sess := session.Must(session.NewSession()) - signer := sigv4.NewSigner(sess.Config.Credentials) + var creds *credentials.Credentials + if config.SASL.AssumeRole != "" { + creds = stscreds.NewCredentials(sess, config.SASL.AssumeRole) + } else { + creds = sess.Config.Credentials + } + + signer := sigv4.NewSigner(creds) region := aws.StringValue(sess.Config.Region) mechanismClient = &aws_msk_iam.Mechanism{ From b93d5a252435a4156b1417d6c084c1c563e7f8e3 Mon Sep 17 00:00:00 2001 From: Benjamin Yolken Date: Sun, 26 Jun 2022 16:01:17 -0700 Subject: [PATCH 3/6] Add sasl-assume-role flag to more places --- cmd/topicctl/subcmd/apply.go | 1 + cmd/topicctl/subcmd/bootstrap.go | 1 + cmd/topicctl/subcmd/check.go | 1 + cmd/topicctl/subcmd/shared.go | 7 +++++++ pkg/apply/apply_test.go | 4 ++-- pkg/check/check_test.go | 2 +- pkg/config/cluster.go | 11 ++++++++++- 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/cmd/topicctl/subcmd/apply.go b/cmd/topicctl/subcmd/apply.go index d2bb8b0e..756110ed 100644 --- a/cmd/topicctl/subcmd/apply.go +++ b/cmd/topicctl/subcmd/apply.go @@ -193,6 +193,7 @@ func applyTopic( applyConfig.dryRun, applyConfig.shared.saslUsername, applyConfig.shared.saslPassword, + applyConfig.shared.saslAssumeRole, ) if err != nil { return err diff --git a/cmd/topicctl/subcmd/bootstrap.go b/cmd/topicctl/subcmd/bootstrap.go index 14502aca..5b8f1ad1 100644 --- a/cmd/topicctl/subcmd/bootstrap.go +++ b/cmd/topicctl/subcmd/bootstrap.go @@ -75,6 +75,7 @@ func bootstrapRun(cmd *cobra.Command, args []string) error { true, bootstrapConfig.shared.saslUsername, bootstrapConfig.shared.saslPassword, + bootstrapConfig.shared.saslAssumeRole, ) if err != nil { return err diff --git a/cmd/topicctl/subcmd/check.go b/cmd/topicctl/subcmd/check.go index aef1bc30..9092c1af 100644 --- a/cmd/topicctl/subcmd/check.go +++ b/cmd/topicctl/subcmd/check.go @@ -138,6 +138,7 @@ func checkTopicFile( true, checkConfig.shared.saslUsername, checkConfig.shared.saslPassword, + checkConfig.shared.saslAssumeRole, ) if err != nil { return false, err diff --git a/cmd/topicctl/subcmd/shared.go b/cmd/topicctl/subcmd/shared.go index 074c1a9b..ffe95296 100644 --- a/cmd/topicctl/subcmd/shared.go +++ b/cmd/topicctl/subcmd/shared.go @@ -121,6 +121,7 @@ func (s sharedOptions) getAdminClient( readOnly, s.saslUsername, s.saslPassword, + s.saslAssumeRole, ) } else if s.brokerAddr != "" { tlsEnabled := (s.tlsEnabled || @@ -300,4 +301,10 @@ func addSharedConfigOnlyFlags(cmd *cobra.Command, options *sharedOptions) { os.Getenv("TOPICCTL_SASL_USERNAME"), "SASL username if using SASL; will override value set in cluster config", ) + cmd.Flags().StringVar( + &options.saslAssumeRole, + "sasl-assume-role", + os.Getenv("TOPICCTL_SASL_ASSUME_ROLE"), + "SASL assume role if using SASL AWS-MSK-IAM; will override value set in cluster config", + ) } diff --git a/pkg/apply/apply_test.go b/pkg/apply/apply_test.go index 5f8e0b88..cb50a3f9 100644 --- a/pkg/apply/apply_test.go +++ b/pkg/apply/apply_test.go @@ -879,7 +879,7 @@ func TestApplyOverrides(t *testing.T) { }, } - adminClient, err := clusterConfig.NewAdminClient(ctx, nil, false, "", "") + adminClient, err := clusterConfig.NewAdminClient(ctx, nil, false, "", "", "") require.NoError(t, err) applier, err := NewTopicApplier( @@ -922,7 +922,7 @@ func testApplier( }, } - adminClient, err := clusterConfig.NewAdminClient(ctx, nil, false, "", "") + adminClient, err := clusterConfig.NewAdminClient(ctx, nil, false, "", "", "") require.NoError(t, err) applier, err := NewTopicApplier( diff --git a/pkg/check/check_test.go b/pkg/check/check_test.go index 592d127e..4b4a1014 100644 --- a/pkg/check/check_test.go +++ b/pkg/check/check_test.go @@ -28,7 +28,7 @@ func TestCheck(t *testing.T) { }, } - adminClient, err := clusterConfig.NewAdminClient(ctx, nil, false, "", "") + adminClient, err := clusterConfig.NewAdminClient(ctx, nil, false, "", "", "") require.NoError(t, err) topicName := util.RandomString("check-topic-", 6) diff --git a/pkg/config/cluster.go b/pkg/config/cluster.go index 4fab3720..6a21f842 100644 --- a/pkg/config/cluster.go +++ b/pkg/config/cluster.go @@ -194,12 +194,14 @@ func (c ClusterConfig) NewAdminClient( readOnly bool, usernameOverride string, passwordOverride string, + assumeRoleOverride string, ) (admin.Client, error) { if len(c.Spec.ZKAddrs) == 0 { log.Debug("No ZK addresses provided, using broker admin client") var saslUsername string var saslPassword string + var saslAssumeRole string if usernameOverride != "" { log.Debugf("Setting SASL username from override value") saslUsername = usernameOverride @@ -214,6 +216,13 @@ func (c ClusterConfig) NewAdminClient( saslPassword = c.Spec.SASL.Password } + if assumeRoleOverride != "" { + log.Debugf("Setting SASL assume role from override value") + saslAssumeRole = assumeRoleOverride + } else { + saslAssumeRole = c.Spec.SASL.AssumeRole + } + var saslMechanism admin.SASLMechanism var err error @@ -242,7 +251,7 @@ func (c ClusterConfig) NewAdminClient( Mechanism: saslMechanism, Username: saslUsername, Password: saslPassword, - AssumeRole: c.Spec.SASL.AssumeRole, + AssumeRole: saslAssumeRole, }, }, ExpectedClusterID: c.Spec.ClusterID, From dc3d530ad24cabb34301715bf7c8494609be87ac Mon Sep 17 00:00:00 2001 From: Benjamin Yolken Date: Sun, 26 Jun 2022 16:56:26 -0700 Subject: [PATCH 4/6] Insert sleeps before starting kafka in circleci --- .circleci/config.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index f3d4cc76..715da766 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,6 +25,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka1 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka2 @@ -36,6 +38,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka2 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka3 @@ -47,6 +51,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka3 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka4 @@ -58,6 +64,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka4 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka5 @@ -69,6 +77,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka5 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka6 @@ -80,6 +90,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka6 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh steps: - checkout @@ -127,6 +139,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka1 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.12-2.4.1 name: kafka2 @@ -138,6 +152,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka2 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.12-2.4.1 name: kafka3 @@ -149,6 +165,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka3 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.12-2.4.1 name: kafka4 @@ -160,6 +178,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka4 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.12-2.4.1 name: kafka5 @@ -171,6 +191,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka5 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh - image: wurstmeister/kafka:2.12-2.4.1 name: kafka6 @@ -182,6 +204,8 @@ jobs: KAFKA_ADVERTISED_HOST_NAME: kafka6 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + command: + sleep 10 && ./start-kafka.sh steps: - checkout From fde3881fb7c2cef4066461db2403f572116845d9 Mon Sep 17 00:00:00 2001 From: Benjamin Yolken Date: Sun, 26 Jun 2022 17:00:06 -0700 Subject: [PATCH 5/6] Update circleci docker commands --- .circleci/config.yml | 48 +++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 715da766..12427bc4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,7 +26,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka2 @@ -39,7 +41,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka3 @@ -52,7 +56,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka4 @@ -65,7 +71,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka5 @@ -78,7 +86,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka6 @@ -91,7 +101,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' steps: - checkout @@ -140,7 +152,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka2 @@ -153,7 +167,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka3 @@ -166,7 +182,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka4 @@ -179,7 +197,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka5 @@ -192,7 +212,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka6 @@ -205,7 +227,9 @@ jobs: KAFKA_ADVERTISED_PORT: 9092 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 command: - sleep 10 && ./start-kafka.sh + - '/bin/sh' + - '-c' + - 'sleep 10 && ./start-kafka.sh' steps: - checkout From b0633525df7176ef8a9d526a9b03ebfa3d275365 Mon Sep 17 00:00:00 2001 From: Benjamin Yolken Date: Sun, 26 Jun 2022 17:05:33 -0700 Subject: [PATCH 6/6] Update kafka start commands --- .circleci/config.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 12427bc4..4ff50710 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,7 +28,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka2 @@ -43,7 +43,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka3 @@ -58,7 +58,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka4 @@ -73,7 +73,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka5 @@ -88,7 +88,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.11-0.10.2.2 name: kafka6 @@ -103,7 +103,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' steps: - checkout @@ -154,7 +154,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka2 @@ -169,7 +169,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka3 @@ -184,7 +184,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka4 @@ -199,7 +199,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka5 @@ -214,7 +214,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' - image: wurstmeister/kafka:2.12-2.4.1 name: kafka6 @@ -229,7 +229,7 @@ jobs: command: - '/bin/sh' - '-c' - - 'sleep 10 && ./start-kafka.sh' + - 'sleep 10 && /usr/bin/start-kafka.sh' steps: - checkout