未验证 提交 116d4003 编写于 作者: O Oleg Nenashev 提交者: GitHub

Merge pull request #4823 from NextTurn/installer

Stop supporting .NET Framework 2.0 + Update Windows Service Wrapper from 2.3.0 to 2.9.0
......@@ -734,8 +734,8 @@ THE SOFTWARE.
<artifactItem>
<groupId>com.sun.winsw</groupId>
<artifactId>winsw</artifactId>
<version>2.3.0</version>
<classifier>bin</classifier>
<version>2.9.0</version>
<classifier>net4</classifier>
<type>exe</type>
<outputDirectory>${project.build.outputDirectory}/windows-service</outputDirectory>
<destFileName>jenkins.exe</destFileName>
......
......@@ -23,45 +23,38 @@
*/
package hudson.lifecycle;
import com.sun.jna.Native;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Functions;
import hudson.Launcher.LocalLauncher;
import hudson.model.ManagementLink;
import hudson.model.TaskListener;
import hudson.util.jna.Kernel32Utils;
import hudson.util.jna.SHELLEXECUTEINFO;
import hudson.util.jna.Shell32;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import jenkins.model.Jenkins;
import hudson.AbortException;
import hudson.Extension;
import jenkins.util.SystemProperties;
import hudson.util.StreamTaskListener;
import hudson.util.jna.DotNet;
import org.apache.commons.io.IOUtils;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.tools.ant.taskdefs.Move;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Move;
import org.apache.tools.ant.types.FileSet;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.interceptor.RequirePOST;
import edu.umd.cs.findbugs.annotations.NonNull;
import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.net.URL;
import static hudson.util.jna.SHELLEXECUTEINFO.*;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.AbortException;
import hudson.Extension;
import hudson.Functions;
import hudson.Launcher.LocalLauncher;
import hudson.model.ManagementLink;
import hudson.model.TaskListener;
import hudson.util.StreamTaskListener;
import hudson.util.jna.DotNet;
import jenkins.model.Jenkins;
import jenkins.util.SystemProperties;
/**
* {@link ManagementLink} that allows the installation as a Windows service.
......@@ -127,22 +120,23 @@ public class WindowsInstallerLink extends ManagementLink {
sendError("Installation is already complete",req,rsp);
return;
}
if(!DotNet.isInstalled(4,0) && !DotNet.isInstalled(2,0)) {
sendError(".NET Framework 2.0 or later is required for this feature",req,rsp);
if(!DotNet.isInstalled(4,0)) {
sendError(".NET Framework 4.0 or later is required for this feature",req,rsp);
return;
}
File dir = new File(_dir).getAbsoluteFile();
dir.mkdirs();
final File dir = new File(_dir).getAbsoluteFile();
if(!dir.exists()) {
sendError("Failed to create installation directory: "+dir,req,rsp);
return;
if (!dir.mkdirs()) {
sendError("Failed to create installation directory: "+dir,req,rsp);
return;
}
}
try {
// copy files over there
copy(req, rsp, dir, getClass().getResource("/windows-service/jenkins.exe"), "jenkins.exe");
copy(req, rsp, dir, getClass().getResource("/windows-service/jenkins.exe.config"), "jenkins.exe.config");
new File(dir, "jenkins.exe.config").delete();
copy(req, rsp, dir, getClass().getResource("/windows-service/jenkins.xml"), "jenkins.xml");
if(!hudsonWar.getCanonicalFile().equals(new File(dir,"jenkins.war").getCanonicalFile()))
copy(req, rsp, dir, hudsonWar.toURI().toURL(), "jenkins.war");
......@@ -153,7 +147,7 @@ public class WindowsInstallerLink extends ManagementLink {
task.getLogger().println("Installing a service");
int r = runElevated(new File(dir, "jenkins.exe"), "install", task, dir);
if(r!=0) {
sendError(baos.toString(),req,rsp);
sendError(baos.toString(Charset.defaultCharset()),req,rsp);
return;
}
......@@ -289,40 +283,9 @@ public class WindowsInstallerLink extends ManagementLink {
/**
* Invokes jenkins.exe with a SCM management command.
*
* <p>
* If it fails in a way that indicates the presence of UAC, retry in an UAC compatible manner.
*/
static int runElevated(File jenkinsExe, String command, TaskListener out, File pwd) throws IOException, InterruptedException {
try {
return new LocalLauncher(out).launch().cmds(jenkinsExe, command).stdout(out).pwd(pwd).join();
} catch (IOException e) {
if (!e.getMessage().contains("CreateProcess") || !e.getMessage().contains("=740")) {
throw e;
}
}
// error code 740 is ERROR_ELEVATION_REQUIRED, indicating that
// we run in UAC-enabled Windows and we need to run this in an elevated privilege
SHELLEXECUTEINFO sei = new SHELLEXECUTEINFO();
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = "runas";
sei.lpFile = jenkinsExe.getAbsolutePath();
sei.lpParameters = "/redirect redirect.log "+command;
sei.lpDirectory = pwd.getAbsolutePath();
sei.nShow = SW_HIDE;
if (!Shell32.INSTANCE.ShellExecuteEx(sei))
throw new IOException("Failed to shellExecute: "+ Native.getLastError());
try {
return Kernel32Utils.waitForExitProcess(sei.hProcess);
} finally {
try (InputStream fin = Files.newInputStream(new File(pwd,"redirect.log").toPath())) {
IOUtils.copy(fin, out.getLogger());
} catch (InvalidPathException e) {
// ignore;
}
}
return new LocalLauncher(out).launch().cmds(jenkinsExe, command).stdout(out).pwd(pwd).join();
}
private static final Logger LOGGER = Logger.getLogger(WindowsInstallerLink.class.getName());
......
......@@ -37,8 +37,6 @@ import java.net.UnknownHostException;
* @author Kohsuke Kawaguchi
*/
public class DotNet {
private static final String PATH10 = "SOFTWARE\\Microsoft\\.NETFramework\\Policy\\v1.0\\3705";
private static final String PATH11 = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322";
private static final String PATH20 = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727";
private static final String PATH30 = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.0\\Setup";
private static final String PATH35 = "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v3.5";
......@@ -63,10 +61,6 @@ public class DotNet {
return isV35Installed() || isV30Installed();
} else if (major == 2 && minor == 0) {
return isV35Installed() || isV30Installed() || isV20Installed();
} else if (major == 1 && minor == 1) {
return isV11Installed();
} else if (major == 1 && minor == 0) {
return isV11Installed() || isV10Installed();
} else {
return false;
}
......@@ -109,18 +103,6 @@ public class DotNet {
}
}
private static boolean isV11Installed() {
try (RegistryKey key = RegistryKey.LOCAL_MACHINE.openReadonly(PATH11)) {
return key.getIntValue(VALUE_INSTALL) == 1;
}
}
private static boolean isV10Installed() {
try (RegistryKey key = RegistryKey.LOCAL_MACHINE.openReadonly(PATH10)) {
return key.getStringValue(VALUE_INSTALL) == "1";
}
}
/**
* Returns true if the .NET framework of a compatible version is installed on a remote machine.
*/
......@@ -139,10 +121,6 @@ public class DotNet {
return isV35Installed(registry, hklm) || isV30Installed(registry, hklm);
} else if (major == 2 && minor == 0) {
return isV35Installed(registry, hklm) || isV30Installed(registry, hklm) || isV20Installed(registry, hklm);
} else if (major == 1 && minor == 1) {
return isV11Installed(registry, hklm);
} else if (major == 1 && minor == 0) {
return isV11Installed(registry, hklm) || isV10Installed(registry, hklm);
} else {
return false;
}
......@@ -220,38 +198,10 @@ public class DotNet {
}
}
private static boolean isV11Installed(IJIWinReg registry, JIPolicyHandle hklm) throws JIException {
JIPolicyHandle key = null;
try {
key = registry.winreg_OpenKey(hklm, PATH11, IJIWinReg.KEY_READ);
return GetIntValue(registry, key, VALUE_INSTALL) == 1;
} finally {
if (key != null) {
registry.winreg_CloseKey(key);
}
}
}
private static boolean isV10Installed(IJIWinReg registry, JIPolicyHandle hklm) throws JIException {
JIPolicyHandle key = null;
try {
key = registry.winreg_OpenKey(hklm, PATH10, IJIWinReg.KEY_READ);
return GetStringValue(registry, key, VALUE_INSTALL) == "1";
} finally {
if (key != null) {
registry.winreg_CloseKey(key);
}
}
}
private static int GetIntValue(IJIWinReg registry, JIPolicyHandle key, String name) throws JIException {
return RegistryKey.convertBufferToInt((byte[])registry.winreg_QueryValue(key, name, Integer.BYTES)[1]);
}
private static String GetStringValue(IJIWinReg registry, JIPolicyHandle key, String name) throws JIException {
return RegistryKey.convertBufferToString((byte[])registry.winreg_QueryValue(key, name, Character.BYTES * 2)[1]);
}
private static int GetV45PlusMinRelease(int minor) {
switch (minor) {
case 5:
......
......@@ -23,6 +23,6 @@
WindowsInstallerLink.DisplayName=Install as Windows Service
WindowsInstallerLink.Description=Installs Jenkins as a Windows service to this system, so that Jenkins starts automatically when the machine boots.
WindowsSlaveInstaller.ConfirmInstallation=This will install an agent as a Windows service, so that a Jenkins agent starts automatically when the machine boots.
WindowsSlaveInstaller.DotNetRequired=.NET Framework 2.0 or later is required for this feature
WindowsSlaveInstaller.DotNetRequired=.NET Framework 4.0 or later is required for this feature
WindowsSlaveInstaller.InstallationSuccessful=Installation was successful. Would you like to start the service now?
WindowsSlaveInstaller.RootFsDoesntExist=Agent root directory \u2018{0}\u2019 doesn\u2019t exist
\ No newline at end of file
......@@ -26,7 +26,7 @@ WindowsInstallerLink.Description=\
\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 Jenkins \u043a\u0430\u0442\u043e \u0443\u0441\u043b\u0443\u0433\u0430 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0438\u044f \u043d\u0430 \u0442\u0430\u0437\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 Windows, \u0437\u0430\
\u0434\u0430 \u043c\u043e\u0436\u0435 \u0442\u043e\u0439 \u0434\u0430 \u0441\u0435 \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430 \u0437\u0430\u0435\u0434\u043d\u043e \u0441 \u043c\u0430\u0448\u0438\u043d\u0430\u0442\u0430.
WindowsSlaveInstaller.DotNetRequired=\
\u0417\u0430 \u0442\u043e\u0432\u0430 \u0441\u0435 \u0438\u0437\u0438\u0441\u043a\u0432\u0430 .NET Framework, \u0432\u0435\u0440\u0441\u0438\u044f 2.0 \u0438\u043b\u0438 \u043f\u043e-\u0432\u0438\u0441\u043e\u043a\u0430
\u0417\u0430 \u0442\u043e\u0432\u0430 \u0441\u0435 \u0438\u0437\u0438\u0441\u043a\u0432\u0430 .NET Framework, \u0432\u0435\u0440\u0441\u0438\u044f 4.0 \u0438\u043b\u0438 \u043f\u043e-\u0432\u0438\u0441\u043e\u043a\u0430
WindowsSlaveInstaller.InstallationSuccessful=\
\u0423\u0441\u043f\u0435\u0448\u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u044f. \u0414\u0430 \u0441\u0435 \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430 \u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0430\u0442\u0430?
WindowsSlaveInstaller.RootFsDoesntExist=\
......
......@@ -21,6 +21,6 @@
# THE SOFTWARE.
WindowsInstallerLink.DisplayName=Installer som Windows service
WindowsSlaveInstaller.DotNetRequired=Denne feature kr\u00e6ver .NET framework 2.0 eller nyere
WindowsSlaveInstaller.DotNetRequired=Denne feature kr\u00e6ver .NET framework 4.0 eller nyere
WindowsSlaveInstaller.InstallationSuccessful=Installationen lykkedes. Vil du gerne starte service''en nu ?
WindowsInstallerLink.Description=Installerer Jenkins som en Windows service p\u00e5 denne computer, s\u00e5 Jenkins starter automatisk n\u00e5r computeren starter op.
......@@ -24,7 +24,7 @@ WindowsInstallerLink.DisplayName=Als Windows-Dienst installieren
WindowsInstallerLink.Description=\
Installiert Jenkins als Windows-Dienst: Dadurch wird Jenkins \
automatisch nach einem Neustart des Rechners gestartet.
WindowsSlaveInstaller.DotNetRequired=.NET Framework 2.0 oder h\u00F6her ist f\u00FCr diesen Vorgang erforderlich.
WindowsSlaveInstaller.DotNetRequired=.NET Framework 4.0 oder h\u00F6her ist f\u00FCr diesen Vorgang erforderlich.
WindowsSlaveInstaller.InstallationSuccessful=Installation erfolgreich. M\u00F6chten Sie den Dienst jetzt starten?
WindowsSlaveInstaller.ConfirmInstallation=Dies wird den Agenten als Windows-Dienst installieren, so dass er automatisch gestartet wird, wenn das System startet.
WindowsSlaveInstaller.RootFsDoesntExist=Wurzelverzeichnis \u2018{0}\u2019 des Agenten existiert nicht.
......@@ -23,6 +23,6 @@
WindowsInstallerLink.DisplayName=Instalar como un servicio de Windows
WindowsInstallerLink.Description=Instalar Jenkins como un servicio de Windows en este sistema, de manera que Jenkins se inicie cuando el sistema arranque.
WindowsSlaveInstaller.ConfirmInstallation=Esto instalará el agente como un servicio de Windows.
WindowsSlaveInstaller.DotNetRequired=Es necesario tener instalado: .NET Framework 2.0 o posterior, para que esta característica funcione.
WindowsSlaveInstaller.DotNetRequired=Es necesario tener instalado: .NET Framework 4.0 o posterior, para que esta característica funcione.
WindowsSlaveInstaller.InstallationSuccessful=La instalación ha sido correcta. ¿Quieres arrancar el servicio ahora?
WindowsSlaveInstaller.RootFsDoesntExist=El directorio raiz {0} en el agente no existe.
# The MIT License
#
# Italian localization plugin for Jenkins
# Copyright © 2020 Alessandro Menti
# Copyright © 2020 Alessandro Menti
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
......@@ -25,11 +25,11 @@ WindowsInstallerLink.Description=Installa Jenkins su questo sistema come \
servizio Windows in modo che possa avviarsi automaticamente all''avvio del \
sistema.
WindowsInstallerLink.DisplayName=Installa come servizio Windows
WindowsSlaveInstaller.ConfirmInstallation=Quest''opzione installerà un agente \
WindowsSlaveInstaller.ConfirmInstallation=Quest''opzione installerà un agente \
come servizio Windows in modo da far avviare automaticamente un agente \
Jenkins all''avvio del sistema.
WindowsSlaveInstaller.DotNetRequired=Per questa funzionalità è richiesto .NET \
Framework 2.0 o una versione successiva
WindowsSlaveInstaller.DotNetRequired=Per questa funzionalità è richiesto .NET \
Framework 4.0 o una versione successiva
WindowsSlaveInstaller.InstallationSuccessful=Installazione terminata con \
successo. Avviare il servizio ora?
WindowsSlaveInstaller.RootFsDoesntExist=La directory radice dell''agente \
......
......@@ -22,6 +22,6 @@
WindowsInstallerLink.DisplayName=Windows\u306E\u30B5\u30FC\u30D3\u30B9\u3068\u3057\u3066\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB
WindowsInstallerLink.Description=\u30DE\u30B7\u30F3\u304C\u30D6\u30FC\u30C8\u3057\u305F\u3068\u304D\u306BJenkins\u304C\u81EA\u52D5\u7684\u306B\u958B\u59CB\u3059\u308B\u3088\u3046\u306B\u3001Windows\u306E\u30B5\u30FC\u30D3\u30B9\u3068\u3057\u3066Jenkins\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3059\u3002
WindowsSlaveInstaller.DotNetRequired=.NET Framework 2.0 \u4EE5\u964D\u304C\u5FC5\u8981\u3067\u3059\u3002
WindowsSlaveInstaller.DotNetRequired=.NET Framework 4.0 \u4EE5\u964D\u304C\u5FC5\u8981\u3067\u3059\u3002
WindowsSlaveInstaller.InstallationSuccessful=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u304C\u6210\u529F\u3057\u307E\u3057\u305F\u3002\u4ECA\u3059\u3050\u30B5\u30FC\u30D3\u30B9\u3092\u958B\u59CB\u3057\u307E\u3059\u304B?
WindowsSlaveInstaller.RootFsDoesntExist=\u30B9\u30EC\u30FC\u30D6\u306E\u30EB\u30FC\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA ''{0}'' \u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002
......@@ -20,6 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
WindowsInstallerLink.DisplayName=Zainstaluj jako us\u0142ug\u0119 systemow\u0105
WindowsSlaveInstaller.DotNetRequired=.NET Framework 2.0 lub nowszy jest wymagany dla tej funkcjonalno\u015Bci
WindowsSlaveInstaller.DotNetRequired=.NET Framework 4.0 lub nowszy jest wymagany dla tej funkcjonalno\u015Bci
WindowsSlaveInstaller.InstallationSuccessful=Instalacja zako\u0144czona pomy\u015Blnie. Chcesz uruchomi\u0107 us\u0142ug\u0119 teraz?
WindowsInstallerLink.Description=Zainstaluj Jenkinsa jako us\u0142ug\u0119 systemow\u0105, aby uruchomi\u0107 Jenkinsa automatycznie po uruchomieniu systemu.
......@@ -22,8 +22,8 @@
# Install as Windows Service
WindowsInstallerLink.DisplayName=Instalar como um servi\u00e7o do Windows
# .NET Framework 2.0 or later is required for this feature
WindowsSlaveInstaller.DotNetRequired=Framework .NET 2.0 ou superior \u00e9 necess\u00e1rio
# .NET Framework 4.0 or later is required for this feature
WindowsSlaveInstaller.DotNetRequired=Framework .NET 4.0 ou superior \u00e9 necess\u00e1rio
# Installation was successful. Would you like to start the service now?
WindowsSlaveInstaller.InstallationSuccessful=Instala\u00e7\u00e3o efetuada com sucesso. Gostaria de iniciar o servi\u00e7o agora?
# Installs Jenkins as a Windows service to this system, so that Jenkins starts automatically when the machine boots.
......
......@@ -4,5 +4,5 @@ WindowsInstallerLink.DisplayName=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u044
WindowsInstallerLink.Description=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430 Jenkins \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 \u043A\u043E\u0458\u0438 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430.
WindowsSlaveInstaller.ConfirmInstallation=\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u045B\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 \u0430\u0433\u0435\u043D\u0442 \u043A\u043E\u0458\u0438 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430.
WindowsSlaveInstaller.InstallationSuccessful=\u0423\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430. \u0414\u0430 \u0441\u0435 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0430\u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441?
WindowsSlaveInstaller.DotNetRequired=\u0417\u0430 \u0442\u043E \u043D\u0438\u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E .NET Framework 2.0 \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435
WindowsSlaveInstaller.DotNetRequired=\u0417\u0430 \u0442\u043E \u043D\u0438\u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E .NET Framework 4.0 \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435
WindowsSlaveInstaller.RootFsDoesntExist=\u041E\u0441\u043D\u043E\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0430\u0433\u0435\u043D\u0442\u0430 "{0}" \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438.
......@@ -22,5 +22,5 @@
WindowsInstallerLink.DisplayName=\u5b89\u88dd\u6210 Windows \u670d\u52d9
WindowsInstallerLink.Description=\u5c07 Jenkins \u5b89\u88dd\u6210 Windows \u670d\u52d9\uff0c\u958b\u6a5f\u5f8c Jenkins \u5c31\u6703\u81ea\u52d5\u555f\u52d5\u3002
WindowsSlaveInstaller.DotNetRequired=\u672c\u529f\u80fd\u9700\u8981 .NET Framework 2.0 \u6216\u662f\u66f4\u65b0\u7684\u7248\u672c
WindowsSlaveInstaller.DotNetRequired=\u672c\u529f\u80fd\u9700\u8981 .NET Framework 4.0 \u6216\u662f\u66f4\u65b0\u7684\u7248\u672c
WindowsSlaveInstaller.InstallationSuccessful=\u5b89\u88dd\u5b8c\u6210\u3002\u60a8\u8981\u99ac\u4e0a\u555f\u52d5\u670d\u52d9\u55ce?
<configuration>
<runtime>
<!-- see http://support.microsoft.com/kb/936707 -->
<generatePublisherEvidence enabled="false"/>
</runtime>
<startup>
<!-- this can be hosted either on .NET 2.0 or 4.0 -->
<supportedRuntime version="v2.0.50727" />
<supportedRuntime version="v4.0" />
</startup>
</configuration>
\ No newline at end of file
......@@ -124,7 +124,7 @@ THE SOFTWARE.
<dependency>
<groupId>org.jenkins-ci.modules</groupId>
<artifactId>windows-slave-installer</artifactId>
<version>1.12</version>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.modules</groupId>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册