private void deploy()

in PluginsAndFeatures/azure-toolkit-for-eclipse/com.microsoft.azuretools.appservice/src/com/microsoft/azuretools/appservice/ui/WebAppDeployDialog.java [828:962]


    private void deploy(String artifactName, String artifactPath) {
        int selectedRow = table.getSelectionIndex();
        String appServiceName = table.getItems()[selectedRow].getText(0);
        WebApp webApp = webAppDetailsMap.get(appServiceName);
        String jobDescription = String.format("Web App '%s' deployment", webApp.name());
        if (isDeployToSlot) {
            jobDescription = String.format("Web App '%s' deploy to slot '%s'", webApp.name(),
                    isCreateNewSlot ? webAppSettingModel.getNewSlotName() : webAppSettingModel.getSlotName());
        }
        String deploymentName = UUID.randomUUID().toString();
        AzureDeploymentProgressNotification.createAzureDeploymentProgressNotification(deploymentName, jobDescription);
        boolean isDeployToRoot = btnDeployToRoot.getSelection();
        boolean isBuildBeforeDeploy = buildBeforeDeploy.getSelection();

        Job job = new Job(jobDescription) {
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                String message = "Packaging Artifact...";
                String cancelMessage = "Interrupted by user";
                String successMessage = "";
                String errorMessage = "Error";
                Map<String, String> postEventProperties = new HashMap<>();
                try {
                    boolean isJar = MavenUtils.isMavenProject(project)
                            && MavenUtils.getPackaging(project).equals("jar");
                    postEventProperties.put(TelemetryConstants.JAVA_APPNAME, project.getName());
                    postEventProperties.put(TelemetryConstants.FILETYPE, isJar ? "jar" : "war");
                    Runtime runtime = webApp.getRuntime();
                    String osValue = (String) Optional.ofNullable(runtime.getOperatingSystem())
                            .map(com.microsoft.azure.toolkit.lib.appservice.model.OperatingSystem::toString).orElse("");
                    String webContainerValue = (String) Optional.ofNullable(runtime.getWebContainer())
                            .map(WebContainer::getValue).orElse("");
                    String javaVersionValue = (String) Optional.ofNullable(runtime.getJavaVersion())
                            .map(com.microsoft.azure.toolkit.lib.appservice.model.JavaVersion::getValue).orElse("");
                    postEventProperties.put(TelemetryConstants.RUNTIME,
                            String.format("%s-%s-%s", osValue, webContainerValue, javaVersionValue));
                    postEventProperties.put(TelemetryConstants.WEBAPP_DEPLOY_TO_SLOT,
                            Boolean.valueOf(isDeployToSlot).toString());
                } catch (Exception e) {
                }

                String errTitle = "Deploy Web App Error";
                monitor.beginTask(message, IProgressMonitor.UNKNOWN);
                IWebAppBase<? extends AppServiceBaseEntity> deployTarget = null;
                Operation operation = TelemetryManager.createOperation(WEBAPP, DEPLOY_WEBAPP);

                try {
                    operation.start();
                    deployTarget = getRealWebApp(webApp, this, monitor, deploymentName);
                    String sitePath = buildSiteLink(deployTarget, isDeployToRoot ? null : artifactName);
                    AzureDeploymentProgressNotification.notifyProgress(this, deploymentName, sitePath, 5, message);
                    if (!MavenUtils.isMavenProject(project)) {
                        export(artifactName, artifactPath);
                    } else if (isBuildBeforeDeploy) {
                        MavenExecuteAction action = new MavenExecuteAction("package");
                        CountDownLatch countDownLatch = new CountDownLatch(1);
                        action.launch(MavenUtils.getPomFile(project).getParent(), () -> {
                            countDownLatch.countDown();
                        });
                        countDownLatch.await();
                    }
                    message = "Deploying Web App...";
                    if (isDeployToSlot) {
                        message = "Deploying Web App to Slot...";
                    }
                    monitor.setTaskName(message);
                    AzureDeploymentProgressNotification.notifyProgress(this, deploymentName, sitePath, 30, message);
                    AzureWebAppMvpModel.getInstance().deployArtifactsToWebApp(deployTarget, new File(artifactPath),
                            isDeployToRoot, new UpdateProgressIndicator(monitor));

                    if (monitor.isCanceled()) {
                        AzureDeploymentProgressNotification.notifyProgress(this, deploymentName, null, -1,
                                cancelMessage);
                        return Status.CANCEL_STATUS;
                    }

                    message = "Checking Web App availability...";
                    monitor.setTaskName(message);
                    AzureDeploymentProgressNotification.notifyProgress(this, deploymentName, sitePath, 20, message);

                    // to make warn up cancelable
                    int stepLimit = 5;
                    int sleepMs = 1000;
                    CountDownLatch countDownLatch = new CountDownLatch(1);
                    new Thread(() -> {
                        try {
                            for (int step = 0; step < stepLimit; ++step) {
                                if (monitor.isCanceled() || isUrlAccessible(sitePath)) { // warm up
                                    break;
                                }
                                Thread.sleep(sleepMs);
                            }
                        } catch (Exception ex) {
                            LOG.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                                    "run@Thread@run@ProgressDialog@deploy@AppServiceCreateDialog@SingInDialog", ex));
                        } finally {
                            countDownLatch.countDown();
                        }
                    }).start();

                    try {
                        countDownLatch.await();
                    } catch (Exception ignore) {
                    }

                    if (monitor.isCanceled()) {
                        // it's published but not warmed up yet - consider as success
                        AzureDeploymentProgressNotification.notifyProgress(this, deploymentName, sitePath, 100,
                                successMessage);
                        return Status.CANCEL_STATUS;
                    }

                    monitor.done();
                    AzureDeploymentProgressNotification.notifyProgress(this, deploymentName, sitePath, 100,
                            successMessage);
                    AppInsightsClient.create("Deploy as WebApp", "", postEventProperties);
                } catch (Exception ex) {
                    postEventProperties.put("PublishError", ex.getMessage());
                    LOG.log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                            "run@ProgressDialog@deploy@AppServiceCreateDialog", ex));
                    AzureDeploymentProgressNotification.notifyProgress(this, deploymentName, null, -1, errorMessage);
                    if (deployTarget != null) {
                        deployTarget.start();
                    }
                    Display.getDefault().asyncExec(() -> ErrorWindow.go(parentShell, ex.getMessage(), errTitle));
                    EventUtil.logError(operation, ErrorType.systemError, ex, postEventProperties, null);
                } finally {
                    EventUtil.logEvent(EventType.info, operation, postEventProperties);
                    operation.complete();
                }
                return Status.OK_STATUS;
            }
        };
        job.schedule();
    }