Hi,
I would like user to create an Epic with a number of linked Tasks
(Epic) Product X
(task) Desgin Product X
(task) Build Product X
(task) Test Procuts X
Can this be done using script runner?
I have looked but can't fine a recent referance to this.
Could this be done using workflow post actions, create Epic then task are created automaicly afterward?
I not very techincal so, any help would be great.
I don't have any money for another add-on.
Many Thanks
Kevin
Thanks @PD Sheehan for your support.
Turns out that my script was correct. The problem was the channel name I was using. Slack has specific requirements for naming a channel. I was creating my name based off the version description. Because of this, I have to parse out all special characters, spaces and capitals. I also had to limit the string length to 80 characters.
Here is my updated code
import org.apache.log4j.Level
//For Slack POST
import groovyx.net.http.ContentType
import groovyx.net.http.RESTClient
import groovyx.net.http.HttpResponseDecorator
import java.util.*
import java.io.*
/////////////// GET EVENT DETAILS /////////////////
def fieldMap = [:]
fieldMap["versionName"] = event.getVersion().getName()
fieldMap["versionReleaseDate"] = event.getVersion().getReleaseDate()
fieldMap["parsedReleaseDate"] = event.getVersion().getReleaseDate().toString().substring(0,10)
fieldMap["versionStartDate"] = event.getVersion().getStartDate()
fieldMap["versionDescription"] = event.getVersion().getDescription()
/////////////// CREATE SLACK CHANNEL /////////////////
def slackchannelName = fieldMap.versionDescription.toString()
def slackchannelPrivacy = "false" //true = private / false = public
def slackchannelNameModified = slackchannelName.toLowerCase().replaceAll("[^a-zA-Z0-9]","-")
def slackchannelNameModified2 = slackchannelNameModified.replaceAll("\\s+","-")
log.debug("slackchannelNameModified: " + slackchannelNameModified.length() + " = $slackchannelNameModified")
Vector<Character> v = new Vector<>();
for (int i = 0; i < slackchannelNameModified.length(); ++i){
def myChar = slackchannelNameModified.charAt(i)
v.add(myChar);
if (v.size() > 1 && myChar == "-"){
int sz = v.size();
// removing two consecutive duplicates
if (v.get(sz - 1) == v.get(sz - 2)){
v.setSize(sz - 2); // Removing two characters from the string
}
}
}
//Puting the string back together
def endChannelName = ""
for(n in v){
endChannelName = endChannelName + n
}
//endChannelName.take(80)
log.debug("endChannelName: " + endChannelName.length() + " = $endChannelName")
final String URL = "https://slack.com/api/"
def data = [:]
data.put("name", endChannelName)
data.put("is_private", "false") //slackchannelPrivacy)
data.put("prety", "1")
def postResponse = post(URL, "conversations.create?", data)
def post(def hostUrl, def endpointAndQuery, def bodyJson) {
//TOKEN FOR SLACK APP
def SLACK_API_TOKEN = ""
def client = new RESTClient(hostUrl)
client.encoder.charset = 'utf-8'
client.setHeaders([
'Authorization': "Bearer $SLACK_API_TOKEN"
])
client.handler.success = { HttpResponseDecorator response ->
log.debug("POST Status: $response.")
log.debug("POST Response: $response.entity.content.text")
}
client.handler.failure = { HttpResponseDecorator response ->
log.error "POST Error: $response."
}
client.post(
path: endpointAndQuery,
contentType: ContentType.JSON,
body: bodyJson
)
}
So, when executing in the listener, you get a log entry that shows the post request was successful but the corresponding slack channel isn't created?
It's possible for an API to respond with a success status code, but report a failure as part of the message.
Maybe you need to extract a bit more out of that response to get some clues.
import groovyx.net.http.ContentType
import groovyx.net.http.HttpResponseDecorator
import groovyx.net.http.RESTClient
final String URL = "https://slack.com/api/"
def channelName = "pretend-channel-4"
def channelPrivacy = "false" //true = private / false = public
def data = [:]
data.put("name", channelName)
data.put("is_private", channelPrivacy)
data.put("prety", "1")
def postResponse = post(URL, "conversations.create?", data)
def post(def hostUrl, def endpointAndQuery, def bodyJson) {
//TOKEN FOR SLACK APP
def SLACK_API_TOKEN = "<SLACK TOKEN>"
def client = new RESTClient(hostUrl)
client.setHeaders([
'Authorization': "Bearer $SLACK_API_TOKEN"
])
client.handler.success = { HttpResponseDecorator response ->
log.debug("POST Status: $response.")
log.debug("POST Response: $response.entity.content.text")
}
client.handler.failure = { HttpResponseDecorator response ->
log.error "POST Error: $response."
}
client.post(
path: endpointAndQuery,
contentType: ContentType.JSON,
body: bodyJson
)
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
@PD Sheehan Thanks for the direction. It looks like it is doing exactly what you say. The request is successful but I am getting
POST Response: {"ok":false,"error":"invalid_name_specials","warning":"missing_charset","response_metadata":{"warnings":["missing_charset"]}}do you know how to fix this? I have never had to define the ContentType other then what is currently in the script. From what I can tell it needs the Charset defined.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I don't think it'a content type error.
I haven't worked with Slack API before, but a quick google search revealed this:
https://api.slack.com/methods/conversations.create#errors
See the "invalid_name_specials" error.
That means your channel name "pretend-channel-4" is apparently invalid.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
And if you want to take care of the warning too... you can try adding something like this:
client.encoder.charset = 'utf-8'
But I'm not sure. I've never tried that. I just found it from the javadocs.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.