func buildSingleArchContainer()

in gke-windows-builder/builder/main.go [255:316]


func buildSingleArchContainer(ctx context.Context, ver string, imageFamily string) builderServerStatus {
	var s *builder.Server
	var err error

	netConfig := builder.NewInstanceNetworkConfig(projectID, network, networkProject, subnetwork, region)
	bsc := &builder.WindowsBuildServerConfig{
		InstanceNamePrefix: instanceNamePrefix,
		ImageVersion:       &ver,
		ImageURL:           &imageFamily,
		Zone:               zone,
		NetworkConfig:      netConfig,
		Labels:             labels,
		MachineType:        machineType,
		BootDiskType:       bootDiskType,
		BootDiskSizeGB:     *bootDiskSizeGB,
		ServiceAccount:     serviceAccount,
		UseInternalIP:      *useInternalIP,
		ExternalNAT:        *ExternalIP,
		ReuseInstance:      *reuseBuilderInstances,
	}

	if *reuseBuilderInstances {
		log.Printf("Looking for an exiting %s instance to reuse", ver)
		s, err = builder.FindExistingInstance(ctx, bsc, *projectID)
	}

	if s == nil {
		s, err = builder.NewServer(ctx, bsc, *projectID)
		if err != nil {
			if isImageNotFoundErr(err, imageFamily) {
				log.Printf("Failed to create Windows %[1]s instance, it may be expired, so skip it to continue without stamping Windows %[1]s manifest", ver)
				return builderServerStatus{nil, nil}
			}
			return builderServerStatus{nil, err}
		}
	}

	r := &s.RemoteWindowsServer

	log.Printf("Waiting for Windows %s instance: %s (%s) to become available", ver, *r.Hostname, s.GetInstanceName())
	err = r.WaitForServerBeReady(*setupTimeout)
	if err != nil {
		log.Printf("Error setup Windows %s instance: %s with error: %+v", ver, *r.Hostname, err)
		return builderServerStatus{s, err}
	}

	r.WorkspaceBucket = workspaceBucket
	// Copy workspace to remote machine
	log.Printf("Copying local workspace to remote machine: %v", *r.Hostname)
	err = r.Copy(*workspacePath, *copyTimeout)
	if err != nil {
		log.Printf("Error copying workspace to %v : %+v", *r.Hostname, err)
		return builderServerStatus{s, err}
	}

	err = buildSingleArchContainerOnRemote(r, *containerImageName, ver, commandTimeout)
	if err != nil {
		log.Printf("Error building single arch container on remote %v : %+v", *r.Hostname, err)
		return builderServerStatus{s, err}
	}
	return builderServerStatus{s, nil}
}