name: "ZenDesk: Comment GitHub Issue on Zendesk Ticket Comment" on: workflow_dispatch: inputs: external_id: description: "GitHub issue url" required: true type: string custom_field: description: "Space separated list of labels" required: false default: "" type: string comment_body: description: "Zendesk comment body" required: true type: string author: description: "Zendesk comment author" required: false default: "" type: string jobs: process_comment_and_labels: runs-on: ubuntu-latest steps: - uses: hmarr/debug-action@v3.0.0 - uses: actions/github-script@v8 env: WORKFLOW_RUN_LINK: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" with: github-token: ${{ secrets.GIT_PAT_HEIDI }} script: | // Extract issue details from the Zendesk external_id const parts = context.payload.inputs.external_id.split("/"); const issue_number = parts[parts.length - 1]; const issue_repo = parts[parts.length - 3]; const issue_owner = parts[parts.length - 4]; // Extract comment details const comment_author = context.payload.inputs.author || "HumanSignal Support"; const comment_body = context.payload.inputs.comment_body; const formatted_comment_body = `${comment_body} > Comment by ${comment_author} > [Workflow Run](${process.env.WORKFLOW_RUN_LINK})`; // Add a comment to the GitHub issue if (comment_body.startsWith('[GITHUB_ISSUE_')) { core.notice(`Skipping comment creation.`); } else { const { data: comment } = await github.rest.issues.createComment({ owner: issue_owner, repo: issue_repo, issue_number: issue_number, body: formatted_comment_body }); core.notice(`Comment created ${comment.html_url}`); } // Extract labels from the custom_field let new_labels = []; if (context.payload.inputs.custom_field) { new_labels = context.payload.inputs.custom_field.split(" ").map(label => label.trim()); } // Get the current labels on the GitHub issue const { data: current_labels } = await github.rest.issues.listLabelsOnIssue({ owner: issue_owner, repo: issue_repo, issue_number: issue_number }); const current_label_names = current_labels.map(label => label.name); // Labels to be added const labels_to_add = new_labels.filter(label => !current_label_names.includes(label)); // Labels to be removed const labels_to_remove = current_label_names.filter(label => !new_labels.includes(label)); // Remove labels that are not in the new labels list for (const label of labels_to_remove) { await github.rest.issues.removeLabel({ owner: issue_owner, repo: issue_repo, issue_number: issue_number, name: label }); } // Add the new labels if (labels_to_add.length > 0) { await github.rest.issues.addLabels({ owner: issue_owner, repo: issue_repo, issue_number: issue_number, labels: labels_to_add }); }