{"revision":"c10276e953456835cdbb1f3a60d58ae1980be353","document":{"id":32096,"path":"it-service-management/devops-change-velocity/creating-dev-ops-subflows.md","title":"Creating DevOps subflows","bundle":null,"doc_type":null,"release":"australia","body":"\n# Creating DevOps subflows\n\nFor user-created integrations, create a DevOps Workflow Studio subflow to collect and transform data from the tool you are integrating.\n\nServiceNow [Flow Designer](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/application-development/flow-designer.md) is a ServiceNow AI Platform feature your integration developer can use to automate processes using a sequence of actions. Trigger conditions start the flow, and variables pass information between actions.\n\nSee [Flow Designer](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/application-development/flow-designer.md) [Subflows](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/build-workflows/subflows.md) for information on how to create a subflow.\n\n## Notification capability subflow\n\n<table id=\"table_hbx_dn1_1kb\"><thead><tr><th>\n\nItem\n\n</th><th>\n\nExpected value\n\n</th></tr></thead><tbody><tr><td>\n\nInputs\n\n</td><td>\n\nLabel: current\n\n Type: Reference.Inbound Event\n\n</td></tr><tr><td>\n\nOutputs\n\n</td><td>\n\nN/A\n\n</td></tr></tbody>\n</table>Transform the original payload, and save the final payload in the **transformed\\_payload** field.\n\n-   **Expected standard JSON Notification capability payload - Planning tool**\n\n    **Note:** The version attribute in the JSON payload is optional. Even if you do not provide the version attribute, the payload is processed successfully.\n\n    ```\n    {\n      \"id\": \"STR1234\",\n      \"type\": \"Story\",\n      \"shortDescription\": \"Planning API Spec\",\n      \"state\": \"In-progress\",\n      \"createdDateTime\": \"1970-01-01T08:15:30-05:00\",\n      \"assignedTo\": {\n        \"name\": \"Leo Neo\",\n        \"userName\": \"lenn\",\n        \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n        \"email\": \"lenn@smithworksinc.com\"\n      },\n    // The Version attribute is optional\n      \"version\": {\n          \"id\": \"REL1234\",\n          \"shortDescription\": \"APIs Release\",\n          \"createdDateTime\": \"1970-01-01T08:15:30-05:00\",\n          \"app\": {\n              \"id\": \"PRODUCT1234\",\n              \"shortDescription\": \"Mobile UI\",\n              \"createdDateTime\": \"1970-01-01T08:15:30-05:00\",\n              \"url\": \"https://jira.com/mycompany/browse/PRODUCT-125\"\n            },\n          \"url\": \"https://jira.com/mycompany/browse/REL-125\"\n        },\n      \"app\": {\n          \"id\": \"PRODUCT1234\",\n          \"shortDescription\": \"Mobile UI\",\n          \"createdDateTime\": \"1970-01-01T08:15:30-05:00\",\n          \"url\": \"https://jira.com/mycompany/browse/PRODUCT-125\"\n        },\n      \"url\": \"https://jira.com/mycompany/browse/HALOKEY-25\"\n    }\n    ```\n\n-   **Expected standard JSON Notification capability payload - Coding tool**\n\n    ```\n    {\n      \"id\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\",\n      \"url\": \"https://github.com/mycompany/mobileplatform/commit/3fa85f6457174562b3fc2c963f66afa6\",\n      \"committedDate\": \"1970-01-01T08:15:30-05:00\",\n      \"repository\": {\n        \"name\": \"Platform-Mobile\",\n        \"url\": \"https://github.com/mycompany/mobileplatform\"\n      },\n     \"branch\": {\n        \"name\": \"master\",\n        \"path\": \"refs/heads/master\"\n      },\n      \"committer\": {\n        \"email\": \"lenn@smithworksinc.com\"\n      },\n      \"details\": [\n        {\n          \"additions\": 0,\n          \"deletions\": 0,\n          \"totalChanges\": 0,\n          \"file\": \"src/test/java/com/mycompany/app/App.java\",\n          \"action\": \"modified\",\n          \"changes\": \"%40%40%20-30%2C6%20%2B30%2C18%20%40%40%20public%20void%20testAppConstructor%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%7D%0A%20%0A%2B%20%20%20%20%40Test%0A%2B%20%20%20%20public%20void%20testDatabase%28%29%0A%2B%20%20%20%20%7B%0A%2B%09%2F%2FThis%20is%20a%20test%20function%0A%2B%20%20%20%20%20%20%20%20App.main%28null%29%3B%0A%2B%20%20%20%20%20%20%20%20try%20%7B%0A%2B%20%20%20%20%20%20%20%20%20%20%20%20assertEquals%28%22Hello%20World%21%22%20%2B%20System.getProperty%28%22line.separator%22%29%2C%20outContent.toString%28%29%29%3B%0A%2B%20%20%20%20%20%20%20%20%7D%20catch%20%28AssertionError%20e%29%20%7B%0A%2B%20%20%20%20%20%20%20%20%20%20%20%20fail%28%22%22message%22%20is%20not%20%22Hello%20World%21%22%22%29%3B%0A%2B%20%20%20%20%20%20%20%20%7D%0A%2B%20%20%20%20%7D%0A%2B%0A%20%20%20%20%20%40Test%0A%20%20%20%20%20public%20void%20testAppMain%28%29%0A%20%20%20%20%20%7B\"\n        }\n      ]\n    }\n     \n    ```\n\n-   **Expected standard JSON Notification capability payload - Orchestration tool**\n\n    ```\n    {\n      \"toolId\": \"bc1d9454dbdb0810ae77f3c61d9619d1\",\n      \"buildNumber\": \"100\",\n      \"nativeId\": \"HILR/Prod #100\",\n      \"name\": \"HILR/Prod\",\n      \"id\": \"HILR/Prod #100\",\n      \"url\": \"https://dev.azure.com/lenn/CorpSite-ADO/_build/results?buildId=100#Prod/\",\n      \"isMultiBranch\": \"false\",\n      \"orchestrationTaskUrl\": \"https://dev.azure.com/lenn/CorpSite-ADO/_build?name=HILR#Prod\",\n      \"orchestrationTaskName\": \"CorpSite-ADO/HILR#Prod\",\n      \"upstreamTaskUrl\": \"https://dev.azure.com/lenn/CorpSite-ADO/_build/results?buildId=100#UAT/\",\n      \"upstreamId\": \"CorpSite-ADO/HILR#UAT\",\n      \"result\": \"building\",\n      \"startDateTime\": \"2020-03-20 22:59:27\"\n    }\n    \n    ```\n\n-   **Expected standard JSON Notification capability payload - Test tool**\n\n    Functional:\n\n    ```\n    { \n    \"name\": \"CorpSite-selenium#55\", \n    \"duration\": 78.802, \n    \"passedTests\": 4, \n    \"failedTests\": 0, \n    \"skippedTests\": 0, \n    \"blockedTests\": 0, \n    \"totalTests\": 4, \n    \"startTime\": \"2020-06-30T18:12:31Z\", \n    \"finishTime\": \"2020-06-30T18:12:31Z\", \n    \"passingPercent\": 100, \n     \n     \n    // Use Artifact OR Package OR Build + Stage + PipelineName Attributes \n    \"packages\": [{\"name\": \"CorpSite-pkg1\"}], \n    \"artifacts\": [{\"name\": \"CorpSite-artifact\", \"version\": \"1.0.0\"}], \n    \"buildNumber\": \"55\", \n    \"stageName\": \"test\", \n    \"pipelineName\": \"CorpSite-selenium\", \n    } \n    \n    ```\n\n    Performance:\n\n    ```\n    { \n    \"name\": \"Performance Tests\", \n    \"url\": \"http://abc.com\", \n    \"startTime\": \"2020-06-30T18:12:31Z\", \n    \"finishTime\": \"2020-06-30T18:12:31Z\", \n    \"duration\": 78.802, \n    \"maximumVirtualUsers\": \"\", \n    \"throughput\": \"\", \n    \"maximumTime\": \"\", \n    \"minimumTime\": \"\", \n    \"averageTime\": \"\", \n    \"ninetyPercent\": \"\", \n    \"standardDeviation\": \"\", \n     \n    // Use Artifact OR Package OR Build + Stage + PipelineName Attributes \n    \"packages\": [{\"name\": \"CorpSite-pkg1\"}], \n    \"artifacts\": [{\"name\": \"CorpSite-artifact\", \"version\": \"1.0.0\"}], \n    \"buildNumber\": \"55\", \n    \"stageName\": \"test\", \n    \"pipelineName\": \"CorpSite-Performance\", \n    } \n    \n    ```\n\n-   **Expected standard JSON Notification capability payload - Artifact tool**\n\n    Pipelines:\n\n    ```\n    {\n      \"artifacts\": [\n        {\n          \"name\": \"acm.jar\",\n          \"version\": \"1.82\",\n          \"semanticVersion\": \"1.82.0\",\n          \"repositoryName\": \"acm-repo\"\n        }\n      ],\n      \"pipelineName\": \"testMultiBranch/master\",\n      \"taskExecutionNumber\": \"82\",\n      \"stageName\": \"buildmbmaster\",\n      \"branchName\": \"master\"\n    }\n    \n    ```\n\n    Jenkins Freestyle/Maven Project:\n\n    ```\n    {\n      \"artifacts\": [\n        {\n          \"name\": \"mav1.jar\",\n          \"version\": \"1.11\",\n          \"semanticVersion\": \"1.11.0\",\n          \"repositoryName\": \"mav-repo\"\n        }\n      ],\n      \"projectName\": \"maven-test-proj\",\n      \"taskExecutionNumber\": \"11\"\n    }\n    \n    ```\n\n\n\\[Omitted image \"dev-ops-notification-coding-flow.png\"\\] Alt text: DevOps Notification Coding Tool Flow\n\n## Connect capability subflow\n\nThe Connect capability is supported.\n\n<table id=\"table_xys_nm1_1kb\"><thead><tr><th>\n\nItem\n\n</th><th>\n\nExpected value\n\n</th></tr></thead><tbody><tr><td>\n\nInputs\n\n</td><td>\n\nLabel: current\n\n Type: Reference.DevOps Tool\n\n Tool record for which the **Connect** button action is clicked.\n\n</td></tr><tr><td>\n\nOutputs\n\n See [subflow outputs](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/build-workflows/subflows.md).\n\n</td><td>\n\n-   Label: connected\n\nFlag indicating the success or failure of the connection made to the target tool \\(true/false\\).\n\n-   Label: errormessage\n\nString message displayed on the form for connection failure. The variable is an empty string if the connection is successful.\n\n\n</td></tr></tbody>\n</table>Connect errors shown on the DevOps tool form:\n\n-   **Connection failed**\n\n    Subflow was executed successfully but the connection could not be made.\n\n-   **Error: Failed to get failure details from the tool specific connect flow**\n\n    Subflow execution failed for an unknown reason.\n\n-   **Error updating the tool connect status**\n\n    The connection\\_state attribute could not be updated for an unknown reason.\n\n\n\\[Omitted image \"dev-ops-connect-orch-flow.png\"\\] Alt text: DevOps Connect Orchestration Tool\n\n## Discover capability subflow\n\nThe Discover capability is supported.\n\n<table id=\"table_acq_yj1_1kb\"><thead><tr><th>\n\nItem\n\n</th><th>\n\nExpected value\n\n</th></tr></thead><tbody><tr><td>\n\nInputs\n\n</td><td>\n\nLabel: current\n\n Type: Reference.DevOps Tool\n\n</td></tr><tr><td>\n\nOutputs\n\n See [subflow outputs](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/build-workflows/subflows.md).\n\n</td><td>\n\nWithout pagination:\n\n Label: discoverpayload\n\n Type: Array of objects as JSON string.\n\n `(JSON.stringify([{},{}]))`\n\n Planning tool without pagination:\n\n ```\n[\n{\n   \"id\":\"REL1234567\",\n   \"name\": \"REL NUMBERS\",\n   \"url\":\"https://jira.com/vult/browse/REL1234567\",\n   \"nativeId\": \"1790e6cc-085b-4529-9cb8-47f393182226\"\n},\n{\n   \"id\":\"TOR67\",\n   \"name\": \"TOR 67\",\n   \"url\":\"https://jira.com/welp/browse/TOR67\",\n   \"nativeId\": \"482ce864-085b-4529-9cb8-47f393767eb2\"\n}\n]\n```\n\n Coding tool without pagination:\n\n```\n[\n  {\n      \"name\": \"nvm_repo\",\n      \"url\": \"https://github.com/nvm_repo/\"\n  },\n  {\n      \"name\": \"golang_util\",\n      \"url\": \"https://github.com/golang_util/\"\n  }\n];\n```\n\n Orchestration tool without pagination:\n\n```\n{\n  \"orchestrationTasks\": [\n    {\n      \"name\": \"Build_APC_1\",\n      \"url\": \"https://jenkins.wsf.xyz/job/Build_APC_1\",\n      \"projectName\": \"Build_APC_1\"\n    },\n    {\n      \"name\": \"CI_CD_Jenkins\",\n      \"url\": \"https://pt1.jenkins.com/job/CI_CD_Jenkins\",\n      \"projectName\": \"CI_CD_Jenkins\"\n    },\n    {\n      \"name\": \"CI_deploy\",\n      \"url\": \"https://pt2.jenkins.com/job/CI_deploy\",\n      \"projectName\": \"CI_deploy\"\n    }\n  ],\n  \"pipelines\": [\n    {\n      \"name\": \"Build_APC_1\",\n      \"url\": \"https://jenkins.wsf.xyz/job/Build_APC_1\",\n      \"projectName\": \"Build_APC_1\"\n    },\n    {\n      \"name\": \"CI_CD_Jenkins\",\n      \"url\": \"https://pt1.jenkins.com/job/CI_CD_Jenkins\",\n      \"projectName\": \"CI_CD_Jenkins\"\n    },\n    {\n      \"name\": \"CI_deploy\",\n      \"url\": \"https://pt2.jenkins.com/job/CI_deploy\",\n      \"projectName\": \"CI_deploy\"\n    }\n  ]\n}\n```\n\n With pagination:\n\n Label: discoverpayload\n\n Type: Array of objects as JSON string.\n\n `(JSON.stringify([{},{}]))`\n\n Sample JSON format:\n\n ```\n\"pageInfo\" : {\n    \"isLastPage\" : true, \n    \"discoverPayload\" : {},\n    “pageDetails” : {}\n}\n```\n\n Planning tool with pagination:\n\n```\n{               \n    \"pageInfo\": {\n        \"isLastPage\": false,\n        \"discoverPayload\": [\n            {\n               \"id\":\"REL1234567\",\n               \"name\": \"REL NUMBERS\",\n        \"url\":\"https://jira.com/vult/browse/REL1234567\",\n               \"nativeId\": \"1790e6cc-085b-4529-9cb8-47f393182226\"\n            },\n            {\n               \"id\":\"TOR67\",\n               \"name\": \"TOR 67\",\n               \"url\":\"https://jira.com/welp/browse/TOR67\",\n               \"nativeId\": \"482ce864-085b-4529-9cb8-47f393767eb2\"\n            }\n            ],\n        \"pageDetails\": {\n            \"curPage\" : 1,\n            \"nextPage\": 2\n        }\n    }\n}\n```\n\n Coding tool with pagination:\n\n```\n{\n    \"pageInfo\": {\n        \"isLastPage\": false,\n        \"discoverPayload\": [\n            {\n                \"name\": \"nvm_repo\",\n                \"url\": \"https://github.com/nvm_repo/\"\n            },\n            {\n                \"name\": \"golang_util\",\n                \"url\": \"https://github.com/golang_util/\"\n            }\n        ],\n        \"pageDetails\": {\n            \"curPage\" : 1,\n            \"nextPage\": 2\n        }\n    }\n}\n```\n\n Orchestration tool with pagination:\n\n```\n{ \n    \"pageInfo\": { \n        \"isLastPage\": false, \n        \"discoverPayload\": { \n            \"orchestrationTasks\": [ \n              { \n                \"name\": \"Build_APC_1\", \n                \"url\": \"https://jenkins.wsf.xyz/job/Build_APC_1\", \n                \"projectName\": \"Build_APC_1\" \n              }, \n              { \n                \"name\": \"CI_CD_Jenkins\", \n                \"url\": \"https://pt1.jenkins.com/job/CI_CD_Jenkins\", \n                \"projectName\": \"CI_CD_Jenkins\" \n              } \n            ], \n            \"pipelines\": [ \n              { \n                \"name\": \"Build_APC_1\", \n                \"url\": \"https://jenkins.wsf.xyz/job/Build_APC_1\", \n                \"projectName\": \"Build_APC_1\" \n              } \n            ] \n          }, \n        \"pageDetails\": { \n            \"curPage\" : 1, \n            \"nextPage\": 2 \n        } \n    } \n} \n```\n\n</td></tr></tbody>\n</table>The Discover main flow is triggered during import request record creation. An import request has these states and messages.\n\n<table id=\"table_pjc_x5t_jkb\"><thead><tr><th>\n\nState\n\n</th><th>\n\nMessage\n\n</th></tr></thead><tbody><tr><td>\n\nRequested\n\n</td><td>\n\n--\n\n</td></tr><tr><td>\n\nProcessing\n\n</td><td>\n\n--\n\n</td></tr><tr><td>\n\nCompleted\n\n</td><td>\n\nUpdated &lt;number&gt; object\\(s\\)\n\n Found &lt;number&gt; objects with invalid toolId\n\n Found &lt;number&gt; objects failed validation\n\n</td></tr><tr><td>\n\nError\n\n</td><td>\n\n-   Unable to parse payload string from Subflow\n-   discoverpayload is expected to be an array of objects\n-   ImportRequest record does not have reference to tool table\n\n</td></tr><tr><td>\n\nPaused\n\n</td><td>\n\n--\n\n</td></tr><tr><td>\n\nCanceled\n\n</td><td>\n\n--\n\n</td></tr><tr><td>\n\nUnmatched\n\n</td><td>\n\n--\n\n</td></tr></tbody>\n</table>\\[Omitted image \"dev-ops-discover-planning-flow.png\"\\] Alt text: DevOps Discover Plan Tool Flow\n\n\\[Omitted image \"dev-ops-user-integrations-pagination.png\"\\] Alt text: Flow diagram of a typical discover flow with pagination support\n\n## Update Import Request Workflow Studio action\n\nYou can use the Update Import Request action in your Discover subflow to modify the Import Request record state, if desired.\n\n<table id=\"table_ncn_xs1_1kb\"><thead><tr><th>\n\nInput label\n\n</th><th>\n\nType\n\n</th></tr></thead><tbody><tr><td>\n\ncurrent\n\n</td><td>\n\nReference.Import Request\n\n</td></tr><tr><td>\n\nstate\n\n</td><td>\n\n\\(String\\)-   requested\n-   processing\n\n**Note:** Flow execution is stopped \\(once the return is received from the subflow\\) when the state is set to processing.\n\n-   completed\n-   error\n-   paused\n-   canceled\n-   unmatched\n\n</td></tr><tr><td>\n\ndetails\n\n</td><td>\n\n\\(String\\)\n\n</td></tr></tbody>\n</table>**Parent Topic:**[User-created integrations in DevOps Change Velocity](https://raw.githubusercontent.com/ServiceNow/ServiceNowDocs/australia/markdown/australia/it-service-management/devops-change-velocity/dev-ops-tool-integration.md)\n\n"}}