2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								#!/usr/bin/env python  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# 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.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								""" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Python  script  to  build  and  test  a  docker  image  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								This  script  is  used  to  generate  a  test  report  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Usage :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    docker_build_test . py  - - help 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        Get  detailed  description  of  each  option 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Example  command : - 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        docker_build_test . py  < image_name >  - - image - tag  < image_tag >  - - image - type  < image_type >  - - kafka - url  < kafka_url > 
							 
						 
					
						
							
								
									
										
										
										
											2025-08-26 10:30:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        docker_build_test . py  < image_name >  - - image - tag  < image_tag >  - - image - type  < image_type >  - - kafka - archive  < kafka_archive > 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        This  command  will  build  an  image  with  < image_name >  as  image  name ,  < image_tag >  as  image_tag  ( it  will  be  latest  by  default ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        < image_type >  as  image  type  ( jvm  by  default ) ,  < kafka_url >  for  the  kafka  inside  the  image  and  run  tests  on  the  image . 
							 
						 
					
						
							
								
									
										
										
										
											2025-08-26 10:30:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        < kafka_archive >  can  be  passed  as  an  alternative  to  < kafka_url >  to  use  a  local  kafka  archive .  The  path  of  kafka_archive  should  be  absolute . 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        - b  can  be  passed  as  additional  argument  if  you  just  want  to  build  the  image . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        - t  can  be  passed  if  you  just  want  to  run  tests  on  the  image . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								""" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  datetime  import  date  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  argparse  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  distutils . dir_util  import  copy_tree  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  shutil  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  test . docker_sanity_test  import  run_tests  
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:22:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  common  import  execute ,  build_docker_image_runner  
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  tempfile  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  os  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:22:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  run_docker_tests ( image ,  tag ,  kafka_url ,  image_type ) :  
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    temp_dir_path  =  tempfile . mkdtemp ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        current_dir  =  os . path . dirname ( os . path . realpath ( __file__ ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copy_tree ( f " { current_dir } /test/fixtures " ,  f " { temp_dir_path } /fixtures " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        execute ( [ " wget " ,  " -nv " ,  " -O " ,  f " { temp_dir_path } /kafka.tgz " ,  kafka_url ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        execute ( [ " mkdir " ,  f " { temp_dir_path } /fixtures/kafka " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        execute ( [ " tar " ,  " xfz " ,  f " { temp_dir_path } /kafka.tgz " ,  " -C " ,  f " { temp_dir_path } /fixtures/kafka " ,  " --strip-components " ,  " 1 " ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:22:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        failure_count  =  run_tests ( f " { image } : { tag } " ,  image_type ,  temp_dir_path ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    except : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  SystemError ( " Failed to run the tests " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    finally : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        shutil . rmtree ( temp_dir_path ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:22:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    test_report_location_text  =  f " To view test report please check  { current_dir } /test/report_ { image_type } .html " 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  failure_count  !=  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  SystemError ( f " { failure_count }  tests have failed.  { test_report_location_text } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " All tests passed successfully.  { test_report_location_text } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  __name__  ==  ' __main__ ' :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    parser  =  argparse . ArgumentParser ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    parser . add_argument ( " image " ,  help = " Image name that you want to keep for the Docker image " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    parser . add_argument ( " --image-tag " ,  " -tag " ,  default = " latest " ,  dest = " tag " ,  help = " Image tag that you want to add to the image " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:22:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parser . add_argument ( " --image-type " ,  " -type " ,  choices = [ " jvm " ,  " native " ] ,  default = " jvm " ,  dest = " image_type " ,  help = " Image type you want to build " ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    parser . add_argument ( " --build " ,  " -b " ,  action = " store_true " ,  dest = " build_only " ,  default = False ,  help = " Only build the image, don ' t run tests " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    parser . add_argument ( " --test " ,  " -t " ,  action = " store_true " ,  dest = " test_only " ,  default = False ,  help = " Only run the tests, don ' t build the image " ) 
							 
						 
					
						
							
								
									
										
										
										
											2025-08-26 10:30:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    archive_group  =  parser . add_mutually_exclusive_group ( required = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    archive_group . add_argument ( " --kafka-url " ,  " -u " ,  dest = " kafka_url " ,  help = " Kafka url to be used to download kafka binary tarball in the docker image " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    archive_group . add_argument ( " --kafka-archive " ,  " -a " ,  dest = " kafka_archive " ,  help = " Kafka archive to be used to extract kafka binary tarball in the docker image " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    args  =  parser . parse_args ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:22:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  args . build_only  or  not  ( args . build_only  or  args . test_only ) : 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  args . kafka_url : 
							 
						 
					
						
							
								
									
										
										
										
											2025-08-26 10:30:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            build_docker_image_runner ( f " docker build -f $DOCKER_FILE -t  { args . image } : { args . tag }  --build-arg kafka_url= { args . kafka_url }  --build-arg build_date= { date . today ( ) }  --no-cache --progress=plain $DOCKER_DIR " ,  args . image_type ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        elif  args . kafka_archive : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            build_docker_image_runner ( f " docker build -f $DOCKER_FILE -t  { args . image } : { args . tag }  --build-arg build_date= { date . today ( ) }  --no-cache --progress=plain $DOCKER_DIR " ,  args . image_type ,  args . kafka_archive ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-06 18:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:22:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  args . test_only  or  not  ( args . build_only  or  args . test_only ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        run_docker_tests ( args . image ,  args . tag ,  args . kafka_url ,  args . image_type )