Each slave has it's own USB DigiCert token. - I have multiple Jenkins slaves running on a common virtual machine host. - I have 1 dedicated USB DigiCert token dedicated to the Windows build slave VM - I have a second dedicated USB DigiCert token dedicated to the OS X build slave VM VMware Workstate / Fusion or ESXi make it easy to share a USB token with a specific VM.
As far as I know, you cannot connect the same USB token with multiple VMs. However, additional DigiCert tokens are only $25. -Ed My Windows slave has a pop-up watcher to automatically logon written in C# as a console app: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Threading; // System.Windows.Automation needs add reference to: // C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationClient.dll // C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationTypes.dll using System.Windows.Automation; namespace token_logon { class Program { static int SatisfyEverySafeNetTokenPasswordRequest(string password) { int errorCode = 1; bool exitLoop = false; int count = 0; Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Children, (sender, e) => { var element = sender as AutomationElement; if (element.Current.Name == "Token Logon") { WindowPattern pattern = (WindowPattern)element.GetCurrentPattern(WindowPattern.Pattern); pattern.WaitForInputIdle(10000); var edit = element.FindFirst(TreeScope.Descendants, new AndCondition( new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit), new PropertyCondition(AutomationElement.NameProperty, "Token Password:"))); var ok = element.FindFirst(TreeScope.Descendants, new AndCondition( new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button), new PropertyCondition(AutomationElement.NameProperty, "OK"))); if (edit != null && ok != null) { count++; ValuePattern vp = (ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern); vp.SetValue(password); Console.WriteLine("SafeNet window (count: " + count + " window(s)) detected. Setting password..."); InvokePattern ip = (InvokePattern)ok.GetCurrentPattern(InvokePattern.Pattern); ip.Invoke(); // Signal do loop to exit // If wanted to get fancey, we could look for a password failed window // and wait 1 second to see if "Token Logon" closes exitLoop = true; errorCode = 0; } else { Console.WriteLine("SafeNet window detected but not with edit and button..."); } } }); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); while (false == exitLoop) { Thread.Sleep(100); if (10 < stopwatch.Elapsed.TotalSeconds) { exitLoop = true; } } // Throws exception when console is hidden //while (false == exitLoop) //{ // if (Console.KeyAvailable) // { // ConsoleKeyInfo key = Console.ReadKey(true); // switch (key.Key) // { // case ConsoleKey.Q: // Console.WriteLine("Quit..."); // exitLoop = true; // break; // default: // break; // } // } // // Do something more useful //} Automation.RemoveAllEventHandlers(); return errorCode; } static void DisplayUsage() { Console.WriteLine("Usage: You must start token-logon.exe in it's own process *before* calling signtool\n"); Console.WriteLine("Batch Example:"); Console.WriteLine("--------------"); Console.WriteLine("start token-logon.exe myPaswd"); Console.WriteLine("echo Use ping as delay to make sure token-logon.exe is started"); Console.WriteLine("ping 127.0.0.1 -n 2 > nul"); Console.WriteLine("signtool sign /t http://timestamp.digicert.com /n \"Acme, Inc.\" \"my-win-app-3.0.1234.exe\""); } static int Main(string[] args) { if (null == args) { DisplayUsage(); return 1; } if (0 >= args.Length) { Console.WriteLine("*** Missing arguments"); DisplayUsage(); return 1; } string word = args[0]; return SatisfyEverySafeNetTokenPasswordRequest(word); } } } -Ed On Tuesday, September 1, 2015 at 4:23:22 PM UTC-5, Giuseppe Tamburello wrote: > > >>> Hi Ed... thanks for posting your solution, I was running into a similar > issue when initially setting up the EV cert; but I have a quick question > for you... does your Jenkins environment have multiple slaves, and is the > 'signing' dedicated to a single slave machine or are you able to sign from > multiple slave machine (while only having a single EV cert). Basically, > we're moving from using a .pfx file for signing to 'the future' of using > the EV USB dongle, and I'm not able to get jobs to successfully sign a file > from Slave-A on Slave-B (being that Slave-B has the USB dongle connected to > it).... have you run into this? > > Thanks in advance, > -joe > > -- You received this message because you are subscribed to the Google Groups "Jenkins Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/517ce73f-296d-4ce2-b8fc-cbec7517749a%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.