Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Windows platform #91

Open
ypujante opened this issue Sep 8, 2011 · 28 comments
Open

Add support for Windows platform #91

ypujante opened this issue Sep 8, 2011 · 28 comments
Labels

Comments

@ypujante
Copy link
Member

ypujante commented Sep 8, 2011

There is a feature request to add support for Windows in addition to Unix platforms.

@alin-simionoiuDE
Copy link

it will be awesome if windows support can be worked out at least in the agent. I tried to make the agent work on windows but there's some weird path problem that i can't pin down where it comes from.

i believe the main problem (there may be more small issue on windows) is something along these lines: if let's say "glu.agent.apps" is set to c:/deployment and than i want to deploy something for which i set the mountpoint "/myapp" glu will try to create folders in : c:/deployment/c:/myapp which of course is invalid.

any clue why is going this?. i'm not a groovy expert but i will be happy to pitch in if is something simple..

Thanks,
Alin

@ypujante
Copy link
Member Author

Under the cover the agent uses a class called ShellImpl (which is tested here: https://github.com/linkedin/glu/blob/master/agent/org.linkedin.glu.agent-impl/src/test/groovy/test/agent/impl/TestCapabilities.groovy) which in turn uses a class called FileSystemImpl (from a different project and tested here: https://github.com/linkedin/linkedin-utils/blob/master/org.linkedin.util-groovy/src/test/groovy/test/util/io/fs/TestFileSystem.groovy)

It would probably help if you could try to run those tests on a windows platform and see if/how they break. The fix may be easy...

Thanks
Yan

@alin-simionoiuDE
Copy link

the tests are indeed failing (i don't see any way here to attach a zip file with the test report).

for example testFileSystemStorage fails with:

java.io.IOException: Unable to rename C:\tmp\FileSystemImpl1388151843++tmp._a_b_c.484b14f1-100d-4e16-b91f-9d775cd4885f.tmp++ to C:\tmp\FileSystemImpl1388151843_a_b_c
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:71)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:81)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:198)
at org.linkedin.groovy.util.io.GroovyIOUtils.safeOverwrite(GroovyIOUtils.groovy:300)
at org.linkedin.groovy.util.io.GroovyIOUtils$safeOverwrite$0.callStatic(Unknown Source)
at org.linkedin.groovy.util.io.GroovyIOUtils.safeOverwrite(GroovyIOUtils.groovy:263)
at org.linkedin.groovy.util.io.GroovyIOUtils$safeOverwrite.call(Unknown Source)
at org.linkedin.groovy.util.io.fs.FileSystemImpl.safeOverwrite(FileSystemImpl.groovy:227)
at org.linkedin.groovy.util.io.fs.FileSystem$safeOverwrite$0.callCurrent(Unknown Source)
at org.linkedin.groovy.util.io.fs.FileSystemImpl.withObjectOutputStream(FileSystemImpl.groovy:184)
at org.linkedin.groovy.util.io.fs.FileSystem$withObjectOutputStream.callCurrent(Unknown Source)
at org.linkedin.groovy.util.io.fs.FileSystemImpl.serializeToFile(FileSystemImpl.groovy:146)
at org.linkedin.groovy.util.io.fs.FileSystem$serializeToFile.call(Unknown Source)
at org.linkedin.glu.agent.impl.storage.FileSystemStorage.storeState(FileSystemStorage.groovy:124)
at org.linkedin.glu.agent.impl.storage.WriteOnlyStorage$storeState.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
at test.agent.impl.TestFileSystemStorage.testFileSystemStorage(TestFileSystemStorage.groovy:89)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:51)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:63)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:32)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:23)
at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:75)
at $Proxy4.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:32)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:23)
at org.gradle.messaging.remote.internal.MethodInvocationUnmarshallingDispatch.dispatch(MethodInvocationUnmarshallingDispatch.java:48)
at org.gradle.messaging.dispatch.DiscardOnFailureDispatch.dispatch(DiscardOnFailureDispatch.java:31)
at org.gradle.messaging.dispatch.AsyncDispatch.dispatchMessages(AsyncDispatch.java:131)
at org.gradle.messaging.dispatch.AsyncDispatch.access$000(AsyncDispatch.java:35)
at org.gradle.messaging.dispatch.AsyncDispatch$1.run(AsyncDispatch.java:71)
at org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:63)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

@alin-simionoiuDE
Copy link

i made some more progress on this issue, i have now an agent running on windows that starts just fine. I used the tutorial for testing and the windows agent can actually deploy the jetty sample app (the start phase fails because is not finding bash which is totally fine for windows. i can of course go around this by changing the groovy script to start jetty windows way, bottom line: the start phase doesn't work because the glu script is written for linux not because the agent doesn't work on windows properly)

what doesn't work: pretty much the logs are unavailable in the console web page.

in the console when in click on "more" on the agent page i get this exception (my agent in on the C drive):

Error Details

Error 500: Executing action [fileContent] of controller [org.linkedin.glu.console.controllers.AgentsController] caused exception: org.linkedin.glu.agent.api.AgentException: unexpected exception
Servlet: grails
URI: /console/grails/agents/fileContent.dispatch
Exception Message: unknown protocol: c
Caused by: unknown protocol: c
Class: FileResource
At Line: [47]
Code Snippet:
Stack Trace

java.net.MalformedURLException: unknown protocol: c

at java.net.URL.<init>(URL.java:574)

at java.net.URL.<init>(URL.java:464)

at java.net.URL.<init>(URL.java:413)

at java.net.URI.toURL(URI.java:1081)

at java_net_URI$toURL.call(Unknown Source)

at org.linkedin.groovy.util.io.GroovyIOUtils$_toFileWithTempStatus_closure1.doCall(GroovyIOUtils.groovy:97)

at org.linkedin.groovy.util.io.GroovyIOUtils.toFileWithTempStatus(GroovyIOUtils.groovy:96)

at org.linkedin.groovy.util.io.GroovyIOUtils$toFileWithTempStatus.callStatic(Unknown Source)

i'm guessing the file path is something like: /C:/... and the URI is freaking out or something. I haven't dug into this problem yet.

now, what did i had to change to make all these work:

the problems i found so far are in linkedin-util packages. My code here is a little bit hackish, i'm hoping is going to get the idea across of what the problems are. I've also added a new dependency in org.linkedin.util-core to commons-io to make the file renames lot easier to write. file rename on windows behaves differently and this is the main cause of the agent problems.

here's the list of changed files from my local git repository:

  modified:   org.linkedin.util-core/src/main/java/org/linkedin/util/io/IOUtils.java
  modified:   org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/FileResource.java
  modified:   org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/internal/AbstractResourceProvider.java
  modified:   org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/GroovyIOUtils.groovy
  modified:   org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/fs/SerializableFileResource.groovy

diff --git a/org.linkedin.util-core/src/main/java/org/linkedin/util/io/IOUtils.java b/org.linkedin.util-core/src/main/java/org/linkedin/util/io/IOUtils.java
index 6a6ff33..e70ce83 100644
--- a/org.linkedin.util-core/src/main/java/org/linkedin/util/io/IOUtils.java
+++ b/org.linkedin.util-core/src/main/java/org/linkedin/util/io/IOUtils.java
@@ -30,6 +30,8 @@ import java.io.Reader;
import java.io.Serializable;
import java.io.Writer;

+import org.apache.commons.io.FileUtils;
+
/**

  • @author ypujante@linkedin.com
    *
    @@ -314,4 +316,15 @@ public class IOUtils
    protected IOUtils()
    {
    }
    +
    +
    • public static boolean move(File sourceFile, File destinationFile) {
    •  try {
      
    •      FileUtils.copyFile(sourceFile, destinationFile);
      
    •      FileUtils.deleteQuietly(sourceFile);
      
    •      return true;
      
    •  } catch(IOException ex) {
      
    •      return false;
      
    •  }
      
    • }
      }

diff --git a/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/FileResource.java b/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/FileResource.java
index 6daf625..58e3ae3 100644
--- a/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/FileResource.java
+++ b/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/FileResource.java
@@ -209,4 +209,23 @@ public class FileResource extends AbstractResource
}
return frp.createResource(path);
}
+

  • @OverRide
  • public boolean equals(Object obj) {
  •  if (this == obj) {
    
  •      return true;
    
  •  }
    
  •  if (getClass() != obj.getClass()) {
    
  •      return false;
    
  •  }
    
  •  FileResource other = (FileResource) obj;
    
  •  if (_file == null) {
    
  •      if (other._file != null)
    
  •          return false;
    
  •  } else if (!_file.getAbsolutePath().equals(other._file.getAbsolutePath()))
    
  •      return false;
    
  •  return true;
    
  • }
    }

diff --git a/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/internal/AbstractResourceProvider.java b/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/internal/AbstractResourceProvider.jindex 03d8676..b2d8999 100644
--- a/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/internal/AbstractResourceProvider.java
+++ b/org.linkedin.util-core/src/main/java/org/linkedin/util/io/resource/internal/AbstractResourceProvider.java
@@ -16,16 +16,19 @@

package org.linkedin.util.io.resource.internal;

-import org.linkedin.util.io.PathUtils;
-import org.linkedin.util.io.resource.Resource;

-import org.linkedin.util.io.resource.ResourceFilter;

import java.io.File;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.net.URI;
+import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

+import org.apache.tools.ant.util.FileUtils;
+import org.linkedin.util.io.PathUtils;
+import org.linkedin.util.io.resource.Resource;
+import org.linkedin.util.io.resource.ResourceFilter;
+
/**

  • @author ypujante@linkedin.com
    *
    @@ -98,9 +101,20 @@ public abstract class AbstractResourceProvider implements InternalResourceProvid
    @OverRide
    public final InternalResource createRelative(InternalResource resource, String relativePath)
    {
    • if(relativePath == null)
    • if(relativePath == null) {
      return null;
    • }
    • if (isWindowsOS()) {
    •  try {
      
    •    relativePath = URLDecoder.decode(relativePath, "UTF-8");
      
    •    if (relativePath.contains("\")) {
      
    •      relativePath = relativePath.replaceAll("\\", "/");
      
    •    }
      
    •  } catch (UnsupportedEncodingException ex) {
      
  •  }
    
  • }

URI relativeURI = URI.create(relativePath).normalize(); // normalize removes leading .

if(relativeURI.isAbsolute())
@@ -181,4 +195,13 @@ public abstract class AbstractResourceProvider implements InternalResourceProvid
else
return null;
}
+

  • private boolean isWindowsOS() {
  •  String os = System.getProperty("os.name");
    
  •  if (os.contains("Windows") || os.contains("windows")) {
    
  •      return true;
    
  •  } else {
    
  •      return false;
    
  •  }
    
  • }
    }

diff --git a/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/GroovyIOUtils.groovy b/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/GroovyIOUtils.groovy
index d3cb148..d91615e 100644
--- a/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/GroovyIOUtils.groovy
+++ b/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/GroovyIOUtils.groovy
@@ -297,7 +297,9 @@ class GroovyIOUtils extends IOUtils
// somehow the rename operation did not work => delete new file (will happen in the finally)
// and throw an exception thus effectively leaving the file system in the same state as
// when the method was called

  •    throw new IOException("Unable to rename ${newFile} to ${toFile}")
    
  •    if (!IOUtils.move(newFile, toFile)) {
    
  •        throw new IOException("Unable to rename ${newFile} to ${toFile}")
    
  •    }
    

    }

    return res

diff --git a/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/fs/SerializableFileResource.groovy b/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/fs/SerializableFileResource.groovy
index 5f0453a..624f94e 100644
--- a/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/fs/SerializableFileResource.groovy
+++ b/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/io/fs/SerializableFileResource.groovy
@@ -218,7 +218,7 @@ class SerializableFileResource implements Resource, Serializable

 if(!o || getClass() != o.class) return false
  • if(_fileResource != o._fileResource) return false
  • if (!(_fileResource.equals(o._fileResource))) return false

return true
}

@ypujante
Copy link
Member Author

ypujante commented Dec 9, 2011

A couple of comments:

  • util-core should not have any dependency (besides slf4j) so we cannot add the apache commons-io library
  • I think the issue with the 'viewing log' from the console is mostly due to the fact that the 'location' being passed to the agent is a path. I think if we were to provide a URI instead it would work. I am not sure what Windows return when you write something like: new File("c:\myfile.txt").toURI() but if this is what we were to provide for the 'location' entry, I am pretty sure that the GroovyIOUtils.toFile method would behave properly.

In other words, I strongly believe that GroovyIOUtils.toFile(new File("c:\myfile.txt").toURI().toString()) should be equivalent to new File("c:\myfile.txt").

So if we change the console to provide URIs instead of path I think it will work... (you can experiment by modifying the following file https://github.com/linkedin/glu/blob/master/console/org.linkedin.glu.console-webapp/grails-app/views/agents/view.gsp#L38) and replacing

params="[location: xxx..."

by

params="[location: new File(model.agent.agentProperties['glu.agent.logDir']).toURI()]"

@alin-simionoiuDE
Copy link

Thank you very much for your comments.

  1. for some reasons the file rename on windows returns false even if the actual rename succeeds. if commons-io library is not an option i will work on figuring out how to make the rename work without it.
  2. i will get the GroovyIOUtils.toFile problem right away and report back how it behaves on windows

@alin-simionoiuDE
Copy link

is not working (the URI trick), i get the same error when i use this:

id="${model.agent.agentName}" params="[location: new File(model.agent.agentProperties['glu.agent.logDir']).toURI()]">more...

@krisdevopsbot
Copy link

Can you post the script you're using to start it on windows? i've had no luck

@alin-simionoiuDE
Copy link

i'm using this to start my java apps on windows http://wrapper.tanukisoftware.com/doc/english/download.jsp

@juuxstar
Copy link

I'm interested in using glu for our company's deployment system but also require a Window's agent as some of the systems are (unfortunately) Windows servers. Did you ever manage to get the Agent running under Windows?

@alin-simionoiuDE
Copy link

yes, i have. the agent (with the code changes that i outlined here) starts up and mostly works. I can deploy stuff just fine, the parts that are a bit iffy is viewing the logs. glu is using linux tail for that

some of the glu shell commands are a big different on windows, mostly around renaming folders/files. At least that's what i found so far in my limited testing

@juuxstar
Copy link

Great. Would it be possible for you to commit / send me your changes for the agent?

@Spedge
Copy link
Contributor

Spedge commented Sep 6, 2012

Alins, did you get any further with this? Going to start looking into it myself.

@lukestephenson
Copy link

+1 for support for windows. I'm evaluating GLU at the moment and windows support would be useful. I use unix where possible, but some third party tools must be deployed to windows. So only need the agent to run on windows.

@whatisdot
Copy link

I, as well as many of my industry colleagues, would also greatly enjoy deploying to Windows. I'll try to make the changes that were mangled by github's post formatter and commit them to a branch. I'll see if I can build, and if so, share results...

@prelegalwonder
Copy link

Did anyone happen to submit a pull request for these changes, or if not, can point to a clone where those interested in windows agents functionality and further development can contribute? A link to a repo or reference to a branch on this one is greatly appreciated :)

@ypujante
Copy link
Member Author

AFAIK there isn't one, but I would gladly take pull requests :)

@prelegalwonder
Copy link

ok I'll fork and try to apply the diffs listed by alins above and then get things like the tanuki wrapper conf figured out and apply pull requests as I confirm they're working. :)

@w4tson
Copy link

w4tson commented Jul 15, 2013

@prelegalwonder Did you manage to get anywhere with this fork?

@prelegalwonder
Copy link

no, I apologize I got behind in some other deliverables and haven't spent
any time on this yet.

I'm currently on holiday but will digg in when I get back.
On Jul 15, 2013 8:17 AM, "Paul" notifications@github.com wrote:

@prelegalwonder https://github.com/prelegalwonder Did you manage to get
anywhere with this fork?


Reply to this email directly or view it on GitHubhttps://github.com//issues/91#issuecomment-20965841
.

@tomsd
Copy link

tomsd commented Sep 30, 2013

+1 for me as well, at least for the GLU agent. We're investigating commercial tools, but would much prefer something open source like GLU. We, like most big companies, have a mix of technologies/platforms to support. I would guess a decision to stick to *nix only is significantly limiting use of GLU in larger operations.

@lukestephenson
Copy link

It's not by main priority, but I'm trying to spend a little time getting the agent running on windows.

Problems so far. Similar to @AlinS, I got the java.net.MalformedURLException: unknown protocol: c issue. This is because new URL("c:\mydir\apps").getScheme() returns c.

Changing the config parameter to /mydir/apps resolves that.

The agent is currently failing to start when it attempts to install the root mountpoint.
Caused by: org.linkedin.glu.agent.api.ScriptExecutionCauseException: [org.apache.tools.ant.BuildException]: Directory C:
\mydir\apps\C: creation was not successful for an unknown reason

Not sure where the logic is that's build that directory name. I'll try grabbing these changes https://github.com/whatisdot/linkedin-utils/commit/45ba789ef027feaf437008f2e1385073cd87b5e1 to see if that fixes. For now though I need to get back to other work.

@lukestephenson
Copy link

I've tracked down the issue during the install phase of the RootScript to
https://github.com/linkedin/linkedin-utils/blob/v1.9.0/org.linkedin.util-groovy/src/main/groovy/org/linkedin/groovy/util/net/GroovyNetUtils.groovy#L64
uri = new File(s.toString()).toURI()

When installing the root mountPoint, s.toString returns /. On unix based systems the above code results in URI of file:/. On windows this results in a file of file:/C:/. I think using the java File api to represent a relative path to some unknown point is incorrect.

In other places in the code base there is special handling of the root path which then breaks on windows.
https://github.com/linkedin/linkedin-utils/blob/master/org.linkedin.util-core/src/main/java/org/linkedin/util/io/PathUtils.java#L117

I've not had a chance yet to make / test any changes to this.

@bhagatrawat
Copy link

@prelegalwonder where can we find the changes you made for windows?

@blackduck-joe
Copy link

@lukestephenson In two weeks (one more sprint to finish up!), I will have time to help out with this. Is there a good way for me to help? Is there any implementation direction defined anywhere (i.e. native windows or cygwin)?

@lukestephenson
Copy link

I don't think cygwin will be an option for me long term. I'd like the agent to run as a windows service so that it starts when the host starts and doesn't require a user to login. That's probably possible with cygwin as well, but I don't want cygwin to be a barrier to entry. I've got the agent starting on windows now, haven't done much testing as yet. The changes I needed to make are on my fork of https://github.com/lukestephenson/glu and https://github.com/lukestephenson/utils-misc (on a branch).

For now I've gone down the cygwin path as it was much quicker to get running. I'm still waiting for some teams that deploy to windows to create some glu scripts and actually attempt a deployment, so I expect there will be issues to resolve still.

@rhoegg
Copy link

rhoegg commented Nov 25, 2014

Is this feature request abandoned? How are you guys doing continuous deployment to Windows machines?

@tomsd
Copy link

tomsd commented Nov 25, 2014

Hi Ryan,

We ended up going with XL Deploy from Xebia Labs. So this can be abandoned from my perspective.

Thanks!
Tom

From: Ryan Hoegg [mailto:notifications@github.com]
Sent: Tuesday, November 25, 2014 3:35 PM
To: pongasoft/glu
Cc: D'Aurizio, Thomas Otto
Subject: Re: [glu] Add support for Windows platform (#91)

Is this feature request abandoned? How are you guys doing continuous deployment to Windows machines?


Reply to this email directly or view it on GitHubhttps://github.com//issues/91#issuecomment-64466347.

The information contained in this message may be privileged, confidential and protected from disclosure. If the reader of this message is not the intended recipient, or an employee or agent responsible for delivering this message to the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please notify your representative immediately and delete this message from your computer. Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests