Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

Pushing AEM packages from Dev to QA without installing them in QA via Custom Workflow Process Step

Avatar

Community Advisor

I am trying to push the AEM package from Dev to QA via a custom workflow process step, and it should not be installed in QA.

 

When I used Replicator to achieve this, it installed the package in QA.

 

When I used Curl Command It was giving exit code 26—https://everything.curl.dev/usingcurl/returns 

 

Kindly help me out.

 

Thanks in advance !!!

 

//Curl Command for Uploading the Package
ProcessBuilder processBuilder = new ProcessBuilder("curl", "-u", "admin:admin", "-F", "package=@" + packagePath, " http://localhost:4503/crx/packmgr/service/.json/?cmd=upload");
Process process = processBuilder.start();
process.waitFor();
int exitCode = process.exitValue();
process.destroy();

 

Shiv Prakash

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

@Shiv_Prakash_Patel You are using wrong way of command please check 

package=@/etc/packages/my_packages/sample.zip

It should be 

package=@"/etc/packages/my_packages/sample.zip"

 double quote after @ 
Passing you servlet which I have tested along with result.

@Override
	protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
			throws ServletException, IOException {
		try {
			//Curl Command for Uploading the Package
			String[] command = {"curl", "-u", "admin:admin", "-F", "cmd=upload", "-F", "force=true", "-F", "package=@\"/Users/ssai/Projects/mysite/ui.apps/target/mysite.ui.apps-1.0.0-SNAPSHOT.zip\"", "http://localhost:4502/crx/packmgr/service/.json"};

			ProcessBuilder processBuilder = new ProcessBuilder(command);
			Process process = processBuilder.start();
			process.waitFor();
			int exitCode = process.exitValue();
			process.destroy();
			
		} catch (JSONException | InterruptedException e) {
			e.printStackTrace();
		}
	}

Screen Shot 2022-06-27 at 5.48.03 PM.png


Why don’t you use Java PackageManager API instead, it’s recommended- please check ready to use solution:https://www.albinsblog.com/2018/01/how-to-upload-and-install-packages-through-java-api-in-aem.html?m...

View solution in original post

6 Replies

Avatar

Community Advisor

@Shiv_Prakash_Patel Try out the below curl command from java.

String[] command = {"curl", "-H", "Accept:application/json", "-u", username+":"+password , "-F", "package=@" + packagePath, "http://localhost:4503/crx/packmgr/service/.json/?cmd=upload"};       

 Thanks

Avatar

Community Advisor

Hi @ShaileshBassi ,

I have tried with above curl command but result is same (still getting exit code - 26).

Thanks

Shiv Prakash

Avatar

Community Advisor

Hi @Shiv_Prakash_Patel ,

Let's try these two?

curl -u <user>:<password> -F cmd=upload -F force=true 
-F package=@test.zip http://localhost:4503/crx/packmgr/service/.json
curl -u admin:admin -F file=@"name of zip file" -F name="name of package" 
-F force=true -F install=false http://localhost:4503/crx/packmgr/service.jsp
 
I have tried both of them works for me!
 
Regards,
Santosh

Avatar

Community Advisor

Hi @SantoshSai ,

I have tried both in the AEM servlet. It is not working and giving exit code 26. The same curl command works fine with the terminal.

Have you tried this in a servlet or workflow process step? If so, please correct me.

I am using the below code in a servlet.

Regards!

//Curl Command for Uploading the Package
String[] command = {"curl", "-u", "admin:admin", "-F", "cmd=upload", "-F", "force=true", "-F", "package=@/etc/packages/my_packages/sample.zip", "http://localhost:4503/crx/packmgr/service/.json"};
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
process.waitFor();
int exitCode = process.exitValue();
process.destroy();

 

 

Shiv Prakash

Avatar

Correct answer by
Community Advisor

@Shiv_Prakash_Patel You are using wrong way of command please check 

package=@/etc/packages/my_packages/sample.zip

It should be 

package=@"/etc/packages/my_packages/sample.zip"

 double quote after @ 
Passing you servlet which I have tested along with result.

@Override
	protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
			throws ServletException, IOException {
		try {
			//Curl Command for Uploading the Package
			String[] command = {"curl", "-u", "admin:admin", "-F", "cmd=upload", "-F", "force=true", "-F", "package=@\"/Users/ssai/Projects/mysite/ui.apps/target/mysite.ui.apps-1.0.0-SNAPSHOT.zip\"", "http://localhost:4502/crx/packmgr/service/.json"};

			ProcessBuilder processBuilder = new ProcessBuilder(command);
			Process process = processBuilder.start();
			process.waitFor();
			int exitCode = process.exitValue();
			process.destroy();
			
		} catch (JSONException | InterruptedException e) {
			e.printStackTrace();
		}
	}

Screen Shot 2022-06-27 at 5.48.03 PM.png


Why don’t you use Java PackageManager API instead, it’s recommended- please check ready to use solution:https://www.albinsblog.com/2018/01/how-to-upload-and-install-packages-through-java-api-in-aem.html?m...

Avatar

Community Advisor

Hi @SantoshSai ,

Thank you so much for suggesting the code changes. I made the changes and it is working fine with Windows or Mac file paths.

Even though I added a double quote after @, it is not working with AEM relative path or full path.

Please see the below screenshot.

curl_command_issue.jpg curl_command_issue01.jpg curl_command_issue02.jpg

 

I can use JcrPackageManager to upload the package, but for that I need a session of QA AEM instance in Dev.

//Getting JcrPackageManager with the help of session
JcrPackageManager jcrPackageManager = PackagingService.getPackageManager(session);

//Package upload with help of JcrPackageManager
JcrPackage inputPackage = jcrPackageManager.upload(new File(packagePath), false, true, "sample.zip");

 Basically, I am trying to migrate a package from one AEM instance to another AEM instance in the approval workflow. I tried to get the session of AEM Publish into AEM Author but getting null Repository -  https://experienceleague.adobe.com/docs/experience-manager-65/developing/platform/access-jcr.html?la... 

It suggest us to use jackrabbit-standalone-2.4.0.jar, but it didn't work when I downloaded the jar and uploaded it in AEM Author. If I will use same jar and code with standalone java project It will work.

The recommended solution, which you are suggesting, uses the same instance session and also uploads the package to it.

Regards !

 

Shiv Prakash