Just a heads up: On March 24, 2025, starting at 4:30pm CDT / 19:30 UTC, the site will be undergoing scheduled maintenance for a few hours. During this time, the site might be unavailable for a short while. Thanks for your patience.
×Hello to all,
I'm creating an application under powershell to update the jira plugins.
I was able to retrieve the list of plugins installed on our site and compare with the versions available on the atlassian marketplace without too much trouble.
I'm stuck mainly on sending the plugin file to jira through the UPM rest API, the request is sent to jira but I must be missing information because the UPM log returns "Failed to install app plugin_8212726077636355451_groovyrunner-6.50.0.jar"
test code for upload :
$AuthString = "{0}:{1}" -f 'name', 'password'
$AuthBytes = [System.Text.Encoding]::Ascii.GetBytes($AuthString)
$BasicCreds = [Convert]::ToBase64String($AuthBytes)
$UMPTokens = Invoke-WebRequest -Uri "https://XXXXXXX/rest/plugins/1.0/?os_authType=basic" -Method Head -Headers @{"Authorization" = "Basic $BasicCreds" }
$filePath="c:\temp\groovyrunner-6.50.0.jar"
$fileBin = [System.IO.File]::ReadAllBytes($filePath)
$boundary = [System.Guid]::NewGuid().ToString()
$LF = "`r`n"
$bodyLines = (
"--$boundary",
"Content-Disposition: form-data; name=`"plugin`"; filename=`"groovyrunner-6.50.0.jar`"",
"Content-Type: application/octet-stream$LF",
$filepath,
"--$boundary--$LF"
) -join $LF
Invoke-RestMethod -Uri "https://XXXXXXX/rest/plugins/1.0/?token=$($UMPTokens.Headers.'upm-token')" -Method Post -ContentType "multipart/form-data; boundary=`"$boundary`"" -Body $bodyLines -Headers @{"Authorization" = "Basic $BasicCreds" }
Thanking you in advance for any help you can provide
Hello,
I solved my problem by rewriting my code, especially the Body part
Here is the code if it can be useful to other people who want to use Powershell to run Jira :
$file = "C:\temp\$name"
$enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$boundary = [System.Guid]::NewGuid().ToString()
$fileName = Split-Path -Path $file -Leaf
$readFile = [System.IO.File]::ReadAllBytes($file)
$fileEnc = $enc.GetString($readFile)
$bodyLines = @'
--{0}
Content-Disposition: form-data; name="plugin"; filename="{1}"
Content-Type: application/octet-stream
{2}
--{0}--
'@ -f $boundary, $fileName, $fileEnc
$headers = @{
'Authorization' = "Basic $BasicCreds"
}
$parameter = @{
URI = "$server_url/rest/plugins/1.0/?token=$($UMPTokens.Headers.'upm-token')"
Method = "Post"
Body = $bodyLines
Headers = $headers
ContentType = "multipart/form-data; boundary=`"$boundary`""
}
$reponse = Invoke-RestMethod @parameter -ErrorAction Stop
I went back with another plugin and the result is the same even though the powershell console does not return any error message.
COMMENTAIRES : POST https://XXXXXXXXXX/rest/plugins/1.0/?token=XXXXXXXXXX with -1-byte payload
COMMENTAIRES : received -1-byte response of content type application/vnd.atl.plugins.install.installing+json;charset=UTF-8
type : INSTALL
pingAfter : 100
status : @{done=False; statusCode=200; contentType=application/vnd.atl.plugins.install.installing+json; source=agile-cards-4.6.29.jar; name=agile-cards-4.6.29.jar}
links : @{self=/rest/plugins/1.0/pending/3fcd5eba-a8c5-4cd4-b763-e0e3d6a6ba0b; alternate=/rest/plugins/1.0/tasks/3fcd5eba-a8c5-4cd4-b763-e0e3d6a6ba0b}
timestamp : 1652883170615
userKey : JIRAUSER15803
id : 3fcd5eba-a8c5-4cd4-b763-e0e3d6a6ba0b
And when I go to the Pending link of the REST API, I get this message :
type "INSTALL"
pingAfter 100
status
done true
statusCode 200
contentType "application/vnd.atl.plugins.task.install.err+json"
errorMessage "Could not install the file groovyrunner-6.50.0.jar. Check that the file is valid."
source "groovyrunner-6.50.0.jar"
name "groovyrunner-6.50.0.jar"
links
self "/rest/plugins/1.0/pending/09381d7f-dd47-4e7a-afb6-323e3a1eb139"
alternate "/rest/plugins/1.0/tasks/09381d7f-dd47-4e7a-afb6-323e3a1eb139"
timestamp 1652883055829
userKey "JIRAUSER15803"
id "09381d7f-dd47-4e7a-afb6-323e3a1eb139"
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Welcome to the Atlassian Community!
Does this happen for other apps, or is it just the groovyrunner?
If it is only groovyrunner, then is there more errors following the failure in the log?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Thanks already for the quick feedback ;)
It's true that I only tried with groovyrunner, I didn't look at the other plugins that I want to update this way '-_- (I'm doing some tests and I'll come back if it's the file that's causing the problem or my method)
For the logs, if you can direct me to which one to look at I'll be happy to have more information about the error I have. For the error I put I look on audit log of manage apps.
Thank you in advance.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I think you'll want to have a look at the application log, in <jira home>/logs/atlassian-jira.log - this should be catching your attempt to install and telling you what is wrong with the upload. If it doesn't log anything, then the problem is going to be the upload.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello Nic,
For the file, it's the right one I was looking at and I don't see anything transcendent in it concerning a possible error when uploading a plugin.
I also think that there is something more to do for the upload to work properly (a forgotten parameter on my part??)
Still, the REST API does return things :
powershell console does not return any error message.
COMMENTAIRES : POST https://XXXXXXXXXX/rest/plugins/1.0/?token=XXXXXXXXXX with -1-byte payload
COMMENTAIRES : received -1-byte response of content type application/vnd.atl.plugins.install.installing+json;charset=UTF-8
type : INSTALL
pingAfter : 100
status : @{done=False; statusCode=200; contentType=application/vnd.atl.plugins.install.installing+json; source=agile-cards-4.6.29.jar; name=agile-cards-4.6.29.jar}
links : @{self=/rest/plugins/1.0/pending/3fcd5eba-a8c5-4cd4-b763-e0e3d6a6ba0b; alternate=/rest/plugins/1.0/tasks/3fcd5eba-a8c5-4cd4-b763-e0e3d6a6ba0b}
timestamp : 1652883170615
userKey : JIRAUSER15803
id : 3fcd5eba-a8c5-4cd4-b763-e0e3d6a6ba0b
and when I go to the Pending link of the REST API, I get this message :
type "INSTALL"
pingAfter 100
status
done true
statusCode 200
contentType "application/vnd.atl.plugins.task.install.err+json"
errorMessage "Could not install the file groovyrunner-6.50.0.jar. Check that the file is valid."
source "groovyrunner-6.50.0.jar"
name "groovyrunner-6.50.0.jar"
links
self "/rest/plugins/1.0/pending/09381d7f-dd47-4e7a-afb6-323e3a1eb139"
alternate "/rest/plugins/1.0/tasks/09381d7f-dd47-4e7a-afb6-323e3a1eb139"
timestamp 1652883055829
userKey "JIRAUSER15803"
id "09381d7f-dd47-4e7a-afb6-323e3a1eb139"
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Ok, so powershell isn't giving us anything useful, dropping the response from Jira.
Could you try your call with a simple curl or wget, so we get the full response?
And what does the Jira application log say?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello Nic,
This is what I get with a curl :
curl --insecure -X POST "${URL}?token=${TOKEN}" -F plugin=@agile-cards-4.6.29.jar
Console shell :
<textarea>{"type":"INSTALL","pingAfter":100,"status":{"done":false,"statusCode":200,"contentType":"application/vnd.atl.plugins.install.installing+json","source":"agile-cards-4.6.29.jar","name":"agile-cards-4.6.29.jar"},"links":{"self":"/rest/plugins/1.0/pending/537e2218-ff7f-4409-afba-8556cc19f349","alternate":"/rest/plugins/1.0/tasks/537e2218-ff7f-4409-afba-8556cc19f349"},"timestamp":1653398151733,"userKey":"JIRAUSER15803","id":"537e2218-ff7f-4409-afba-8556cc19f349"}</textarea>
Log Atlassian jira:
2022-05-24 15:15:55,306+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.loaders.ScanningPluginLoader] No plugins found to be installed
2022-05-24 15:16:03,229+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.manager.DefaultPluginManager] Updating plugin 'com.spartez.scrumprint.scrumplugin' from version '4.6.27' to version '4.6.29'
2022-05-24 15:16:03,233+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.manager.DefaultPluginManager] Disabling com.spartez.scrumprint.scrumplugin
2022-05-24 15:16:08,741+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.ActiveObjectsServiceFactory] ungetService bundle [com.spartez.scrumprint.scrumplugin]
2022-05-24 15:16:09,669+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.ActiveObjectsServiceFactory] onPluginDisabledEvent removing delegate for [com.spartez.scrumprint.scrumplugin]
2022-05-24 15:16:11,226+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.loaders.ScanningPluginLoader] Removed plugin 'com.spartez.scrumprint.scrumplugin'
2022-05-24 15:16:12,810+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.util.WaitUntil] Plugins that have yet to be enabled: (1): [com.spartez.scrumprint.scrumplugin], 300 seconds remaining
2022-05-24 15:16:13,810+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.util.WaitUntil] Plugins that have yet to be enabled: (1): [com.spartez.scrumprint.scrumplugin], 298 seconds remaining
2022-05-24 15:16:14,810+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.util.WaitUntil] Plugins that have yet to be enabled: (1): [com.spartez.scrumprint.scrumplugin], 297 seconds remaining
2022-05-24 15:16:15,835+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.util.WaitUntil] Plugins that have yet to be enabled: (1): [com.spartez.scrumprint.scrumplugin], 296 seconds remaining
2022-05-24 15:16:16,841+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.util.WaitUntil] Plugins that have yet to be enabled: (1): [com.spartez.scrumprint.scrumplugin], 295 seconds remaining
2022-05-24 15:16:17,841+0200 UpmAsynchronousTaskManager:thread-1 INFO XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.plugin.util.WaitUntil] Plugins that have yet to be enabled: (1): [com.spartez.scrumprint.scrumplugin], 294 seconds remaining
2022-05-24 15:16:19,090+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.OsgiServiceUtilsImpl] Registering service net.java.ao.atlassian.AtlassianTableNameConverter@7b964a41 with interface net.java.ao.schema.TableNameConverter and properties {com.atlassian.plugin.key=com.spartez.scrumprint.scrumplugin}
2022-05-24 15:16:19,093+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.OsgiServiceUtilsImpl] Registering service com.atlassian.activeobjects.config.internal.DefaultActiveObjectsConfiguration@e92c2cd4 with interface com.atlassian.activeobjects.config.ActiveObjectsConfiguration and properties {com.atlassian.plugin.key=com.spartez.scrumprint.scrumplugin}
2022-05-24 15:16:19,096+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.ActiveObjectsServiceFactory] onPluginModuleEnabledEvent storing unattached <ao> configuration module for [com.spartez.scrumprint.scrumplugin]
2022-05-24 15:16:19,861+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.ActiveObjectsServiceFactory] onPluginEnabledEvent attaching unbound <ao> to [com.spartez.scrumprint.scrumplugin]
2022-05-24 15:16:19,861+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.TenantAwareActiveObjects] init bundle [com.spartez.scrumprint.scrumplugin]
2022-05-24 15:16:19,861+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.TenantAwareActiveObjects] bundle [com.spartez.scrumprint.scrumplugin] loading new AO promise for JiraTenantImpl{id='system'}
2022-05-24 15:16:19,861+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.TenantAwareActiveObjects] setAoConfiguration [com.spartez.scrumprint.scrumplugin]
2022-05-24 15:16:19,862+0200 UpmAsynchronousTaskManager:thread-1 DEBUG XXXXXXXX 915x2553x1 z0zha7 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.activeobjects.osgi.TenantAwareActiveObjects] bundle [com.spartez.scrumprint.scrumplugin] got ActiveObjectsConfiguration
2022-05-24 15:16:19,862+0200 active-objects-init-JiraTenantImpl{id='system'}-0 DEBUG XXXXXXXX [c.a.activeobjects.osgi.TenantAwareActiveObjects] bundle [com.spartez.scrumprint.scrumplugin] creating ActiveObjects
2022-05-24 15:16:20,209+0200 active-objects-init-JiraTenantImpl{id='system'}-0 DEBUG XXXXXXXX [c.a.activeobjects.osgi.TenantAwareActiveObjects] bundle [com.spartez.scrumprint.scrumplugin] created ActiveObjects
I changed my code a bit and I finally get an error in the jira log
code :
$AuthString = "{0}:{1}" -f 'XXXXXX', 'XXXXXX'
$AuthBytes = [System.Text.Encoding]::Ascii.GetBytes($AuthString)
$BasicCreds = [Convert]::ToBase64String($AuthBytes)
$UMPTokens = Invoke-WebRequest -Uri "https://xxxxxxxxxxxxxxx/rest/plugins/1.0/?os_authType=basic" -Method Head -Headers @{"Authorization" = "Basic $BasicCreds" }
$filePath= Get-Item "c:\temp\agile-cards-4.6.29.jar"
$boundary = [System.Guid]::NewGuid().ToString()
$LF = "`r`n"
$bodyLines = (
"--$boundary",
"Content-Disposition: form-data; name=`"plugin`"; filename=`"$filePath`"",
"Content-Type: application/vnd.atl.plugins.install.uri+json$LF",
"--$boundary--$LF"
) -join $LF
Invoke-RestMethod -Uri "https://xxxxxxxxxxxxxxx/rest/plugins/1.0/?token=$($UMPTokens.Headers.'upm-token')" -Method Post -ContentType "multipart/form-data; boundary=`"$boundary`"" -Body $bodyLines -Headers @{"Authorization" = "Basic $BasicCreds" } -Debug -Verbose
back to powershell :
Invoke-RestMethod : Le serveur distant a retourné une erreur : (500) Erreur interne du serveur.
Au caractère C:\Users\DM00DDCL\Downloads\Sans titre2.ps1:15 : 1
+ Invoke-RestMethod -Uri "https://xxxxxxxxxxxxxxxxxxxxxx/rest/plu ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
Log Atlassian jira :
2022-05-24 15:35:46,513+0200 http-nio-8080-exec-15 ERROR XXXXXXXX 935x2962x1 1335k50 XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.p.r.c.error.jersey.ThrowableExceptionMapper] Uncaught exception thrown by REST service: org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
2022-05-24 15:40:46,245+0200 http-nio-8080-exec-1 ERROR XXXXXXXX 940x2969x1 ifj3pu XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.p.r.c.error.jersey.ThrowableExceptionMapper] Uncaught exception thrown by REST service: org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
2022-05-24 16:15:16,538+0200 http-nio-8080-exec-9 ERROR XXXXXXXX 975x3190x1 10q0fox XXXXXXXX,XXXXXXX /rest/plugins/1.0/ [c.a.p.r.c.error.jersey.ThrowableExceptionMapper] Uncaught exception thrown by REST service: org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
And by changing some parameters in my script
code :
$AuthString = "{0}:{1}" -f 'xxxxxxx', 'xxxxx'
$AuthBytes = [System.Text.Encoding]::Ascii.GetBytes($AuthString)
$BasicCreds = [Convert]::ToBase64String($AuthBytes)
$UMPTokens = Invoke-WebRequest -Uri "https://xxxxxxxxxxxxx/rest/plugins/1.0/?os_authType=basic" -Method Head -Headers @{"Authorization" = "Basic $BasicCreds" }
$filePath= "c:\temp\agile-cards-4.6.29.jar"
$fileBytes = [System.IO.File]::ReadAllBytes($FilePath);
$fileEnc = [System.Text.Encoding]::GetEncoding('UTF-8').GetString($fileBytes);
$boundary = [System.Guid]::NewGuid().ToString()
$LF = "`r`n"
$bodyLines = (
"--$boundary",
"Content-Disposition: form-data; name=`"plugin`"; filename=`"agile-cards-4.6.29.jar`"",
"Content-Type: application/octet-stream$LF",
$filenc,
"--$boundary--$LF"
) -join $LF
Invoke-RestMethod -Uri "https://xxxxxxxxxxx/rest/plugins/1.0/?token=$($UMPTokens.Headers.'upm-token')" -Method Post -ContentType "multipart/form-data; boundary=`"$boundary`"" -Body $bodyLines -Headers @{"Authorization" = "Basic $BasicCreds" } -Debug -Verbose
back to powershell :
type : INSTALL
pingAfter : 100
status : @{done=False; statusCode=200; contentType=application/vnd.atl.plugins.install.installing+json; source=agile-cards-4.6.29.jar; name=agile-cards-4.6.29.jar}
links : @{self=/rest/plugins/1.0/pending/b02c370c-bc01-411d-94b6-b6858c047d46; alternate=/rest/plugins/1.0/tasks/b02c370c-bc01-411d-94b6-b6858c047d46}
timestamp : 1653463217788
userKey : JIRAUSER15803
id : b02c370c-bc01-411d-94b6-b6858c047d46
no return in the jira log
return in the UPM audit log :
Failed to install app plugin_9642194383374795082_agile-cards-4.6.29.jar
Return links /rest/plugins/1.0/pending :
type "INSTALL"
pingAfter 100
status
done true
statusCode 200
contentType "application/vnd.atl.plugins.task.install.err+json"
errorMessage "Could not install the file agile-cards-4.6.29.jar. Check that the file is valid."
source "agile-cards-4.6.29.jar"
name "agile-cards-4.6.29.jar"
links
self "/rest/plugins/1.0/pending/b02c370c-bc01-411d-94b6-b6858c047d46"
alternate "/rest/plugins/1.0/tasks/b02c370c-bc01-411d-94b6-b6858c047d46"
timestamp 1653463217788
userKey "JIRAUSER15803"
id "b02c370c-bc01-411d-94b6-b6858c047d46
Return links /rest/plugins/1.0/tasks :
links
self "/rest/plugins/1.0/tasks/b02c370c-bc01-411d-94b6-b6858c047d46"
done true
error
message "Could not install the file agile-cards-4.6.29.jar. Check that the file is valid."
type "INSTALL"
pollDelay 100
timestamp 1653463217788
userKey "JIRAUSER15803"
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Well, that's pretty clear - the file you are trying to upload is not a valid app for the server - this may be a damaged file or it might be invalid for the version of Jira you are on.
What happens when you try doing the installation properly? By using the "upgrade" button in the UPM?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
It's exactly the same file as when I did the test with curl, that's why I'm coming to you because I think more of a problem maybe in the structure of my body or a lack of parameters compared to what Jira UPM expects.
Just by changing the way I provide the jira to file, jira returns errors as well in the log, powershell also and on the other hand the audit log of UPM not and conversely in the change again these parameters nothing in the log of jira, nothing in powershell but this time audit log of UPM announces me a failed with a check that the file is valid.
Thank you in advance for the time you spend on my problem ^^
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Atlassian Government Cloud has achieved FedRAMP Authorization at the Moderate level! Join our webinar to learn how you can accelerate mission success and move work forward faster in cloud, all while ensuring your critical data is secure.
Register Now
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.