@@ -163,7 +163,7 @@ func testAccept(t *testing.T, inprocessMode bool, singleTest string) int {
163163 }
164164
165165 // Download terraform and provider and create config.
166- RunCommand (t , []string {"python3" , filepath .Join (cwd , "install_terraform.py" ), "--targetdir" , terraformDir }, "." )
166+ RunCommand (t , []string {"python3" , filepath .Join (cwd , "install_terraform.py" ), "--targetdir" , terraformDir }, "." , [] string {} )
167167
168168 wheelPath := buildDatabricksBundlesWheel (t , buildDir )
169169 if wheelPath != "" {
@@ -234,6 +234,12 @@ func testAccept(t *testing.T, inprocessMode bool, singleTest string) int {
234234 }
235235 }
236236
237+ if cloudEnv != "" && UseVersion == "" {
238+ // Create linux release artifacts, to be used by the cloud-only ssh tunnel tests
239+ releasesDir := CreateReleaseArtifacts (t , cwd , "linux" )
240+ t .Setenv ("CLI_RELEASES_DIR" , releasesDir )
241+ }
242+
237243 testDefaultWarehouseId := os .Getenv ("TEST_DEFAULT_WAREHOUSE_ID" )
238244 if testDefaultWarehouseId != "" {
239245 repls .Set (testDefaultWarehouseId , "[TEST_DEFAULT_WAREHOUSE_ID]" )
@@ -899,10 +905,62 @@ func BuildCLI(t *testing.T, buildDir, coverDir string) string {
899905 args = append (args , "-buildvcs=false" )
900906 }
901907
902- RunCommand (t , args , ".." )
908+ RunCommand (t , args , ".." , [] string {} )
903909 return execPath
904910}
905911
912+ // CreateReleaseArtifacts builds release artifacts for the given OS using amd64 and arm64 architectures,
913+ // archives them into zip files, and returns the directory containing the release artifacts.
914+ func CreateReleaseArtifacts (t * testing.T , cwd , osName string ) string {
915+ releasesDir := filepath .Join (cwd , "build" , "releases" )
916+ require .NoError (t , os .MkdirAll (releasesDir , os .ModePerm ))
917+ arches := []string {"amd64" , "arm64" }
918+ for _ , arch := range arches {
919+ CreateReleaseArtifact (t , cwd , releasesDir , osName , arch )
920+ }
921+ return releasesDir
922+ }
923+
924+ func CreateReleaseArtifact (t * testing.T , cwd , releasesDir , osName , arch string ) {
925+ tempBuildDir := filepath .Join (releasesDir , "tmp_" + arch )
926+ require .NoError (t , os .MkdirAll (tempBuildDir , os .ModePerm ))
927+ defer os .RemoveAll (tempBuildDir )
928+
929+ execPath := filepath .Join (tempBuildDir , "databricks" )
930+ args := []string {"go" , "build" , "-o" , execPath }
931+ RunCommand (t , args , ".." , []string {"GOOS=" + osName , "GOARCH=" + arch })
932+
933+ zipName := fmt .Sprintf ("databricks_cli_%s_%s.zip" , osName , arch )
934+ zipPath := filepath .Join (releasesDir , zipName )
935+
936+ zipFile , err := os .Create (zipPath )
937+ require .NoError (t , err )
938+ defer zipFile .Close ()
939+
940+ zipWriter := zip .NewWriter (zipFile )
941+ defer zipWriter .Close ()
942+
943+ info , err := os .Stat (execPath )
944+ require .NoError (t , err )
945+
946+ header , err := zip .FileInfoHeader (info )
947+ require .NoError (t , err )
948+ header .Name = "databricks"
949+ header .Method = zip .Deflate
950+
951+ writer , err := zipWriter .CreateHeader (header )
952+ require .NoError (t , err )
953+
954+ binaryFile , err := os .Open (execPath )
955+ require .NoError (t , err )
956+ defer binaryFile .Close ()
957+
958+ _ , err = io .Copy (writer , binaryFile )
959+ require .NoError (t , err )
960+
961+ t .Logf ("Created %s %s release: %s" , osName , arch , zipPath )
962+ }
963+
906964// DownloadCLI downloads a released CLI binary archive for the given version,
907965// extracts the executable, and returns its path.
908966func DownloadCLI (t * testing.T , buildDir , version string ) string {
@@ -1123,10 +1181,11 @@ func getUVDefaultCacheDir(t *testing.T) string {
11231181 }
11241182}
11251183
1126- func RunCommand (t * testing.T , args []string , dir string ) {
1184+ func RunCommand (t * testing.T , args []string , dir string , env [] string ) {
11271185 start := time .Now ()
11281186 cmd := exec .Command (args [0 ], args [1 :]... )
11291187 cmd .Dir = dir
1188+ cmd .Env = append (os .Environ (), env ... )
11301189 out , err := cmd .CombinedOutput ()
11311190 elapsed := time .Since (start )
11321191 t .Logf ("%s took %s" , args , elapsed )
@@ -1248,7 +1307,7 @@ func buildDatabricksBundlesWheel(t *testing.T, buildDir string) string {
12481307 // so we prepare here by keeping only one.
12491308 _ = prepareWheelBuildDirectory (t , buildDir )
12501309
1251- RunCommand (t , []string {"uv" , "build" , "--no-cache" , "-q" , "--wheel" , "--out-dir" , buildDir }, "../experimental/python" )
1310+ RunCommand (t , []string {"uv" , "build" , "--no-cache" , "-q" , "--wheel" , "--out-dir" , buildDir }, "../experimental/python" , [] string {} )
12521311
12531312 latestWheel := prepareWheelBuildDirectory (t , buildDir )
12541313 if latestWheel == "" {
@@ -1376,7 +1435,7 @@ func BuildYamlfmt(t *testing.T) {
13761435 args := []string {
13771436 "make" , "-s" , "tools/yamlfmt" + exeSuffix ,
13781437 }
1379- RunCommand (t , args , ".." )
1438+ RunCommand (t , args , ".." , [] string {} )
13801439}
13811440
13821441func loadUserReplacements (t * testing.T , repls * testdiff.ReplacementsContext , tmpDir string ) {
0 commit comments