1
+ name : Github --> Asana Issue Updates Workflow
2
+
3
+ on :
4
+ issues :
5
+ types : [edited, deleted, closed, reopened, assigned, unassigned, labeled, unlabeled, milestoned, demilestoned, pinned, unpinned, locked, unlocked, transferred]
6
+ workflow_dispatch :
7
+
8
+ jobs :
9
+ build :
10
+ runs-on : ubuntu-latest
11
+ permissions :
12
+ issues : read
13
+ steps :
14
+ - name : Get Asana Task Corresponding to Issue
15
+ env :
16
+ ISSUE_ID : ${{ github.event.issue.id }}
17
+ REPO_FULL_NAME : ${{ github.event.repository.full_name }}
18
+ WORKSPACE_ID : " 780103692902078"
19
+ run : |
20
+ REPO_SCOPED_ISSUE_ID="$REPO_FULL_NAME#$ISSUE_ID"
21
+
22
+ curl --request GET \
23
+ --url "https://app.asana.com/api/1.0/workspaces/$WORKSPACE_ID/tasks/search?opt_fields=notes&text=$REPO_SCOPED_ISSUE_ID&sort_by=modified_at&sort_ascending=false" \
24
+ --header 'accept: application/json' \
25
+ --header 'authorization: Bearer ${{ secrets.ASANA_PAT }}' \
26
+ --output response.json
27
+ TASK_GID=$(jq -r '.data[0].gid' response.json)
28
+ echo "TASK_GID=$TASK_GID" >> $GITHUB_ENV
29
+ - name : Determine Action and Post to Asana
30
+ env :
31
+ ACTION_TYPE : ${{ github.event.action }}
32
+ ACTOR_NAME : ${{ github.event.sender.login }}
33
+ ISSUE_TITLE : ${{ github.event.issue.title }}
34
+ ISSUE_NUMBER : ${{ github.event.issue.number }}
35
+ ISSUE_STATE : ${{ github.event.issue.state }}
36
+ run : |
37
+ # Map GitHub action types to human-readable descriptions
38
+ case "$ACTION_TYPE" in
39
+ "edited")
40
+ ACTION_DESC="edited the issue"
41
+ ;;
42
+ "deleted")
43
+ ACTION_DESC="deleted the issue"
44
+ ;;
45
+ "closed")
46
+ ACTION_DESC="closed the issue"
47
+ ;;
48
+ "reopened")
49
+ ACTION_DESC="reopened the issue"
50
+ ;;
51
+ "assigned")
52
+ ACTION_DESC="assigned the issue"
53
+ ;;
54
+ "unassigned")
55
+ ACTION_DESC="unassigned the issue"
56
+ ;;
57
+ "labeled")
58
+ ACTION_DESC="added labels to the issue"
59
+ ;;
60
+ "unlabeled")
61
+ ACTION_DESC="removed labels from the issue"
62
+ ;;
63
+ "milestoned")
64
+ ACTION_DESC="added the issue to a milestone"
65
+ ;;
66
+ "demilestoned")
67
+ ACTION_DESC="removed the issue from a milestone"
68
+ ;;
69
+ "pinned")
70
+ ACTION_DESC="pinned the issue"
71
+ ;;
72
+ "unpinned")
73
+ ACTION_DESC="unpinned the issue"
74
+ ;;
75
+ "locked")
76
+ ACTION_DESC="locked the issue"
77
+ ;;
78
+ "unlocked")
79
+ ACTION_DESC="unlocked the issue"
80
+ ;;
81
+ "transferred")
82
+ ACTION_DESC="transferred the issue"
83
+ ;;
84
+ *)
85
+ ACTION_DESC="performed an action on the issue"
86
+ ;;
87
+ esac
88
+
89
+ # Add additional context for specific actions based on webhook payload
90
+ if [ "$ACTION_TYPE" = "assigned" ] && [ -n "${{ github.event.assignee.login }}" ]; then
91
+ ACTION_DESC="assigned the issue to ${{ github.event.assignee.login }}"
92
+ fi
93
+
94
+ if [ "$ACTION_TYPE" = "unassigned" ] && [ -n "${{ github.event.assignee.login }}" ]; then
95
+ ACTION_DESC="unassigned the issue from ${{ github.event.assignee.login }}"
96
+ fi
97
+
98
+ if [ "$ACTION_TYPE" = "labeled" ] && [ -n "${{ github.event.label.name }}" ]; then
99
+ LABEL_COLOR="${{ github.event.label.color }}"
100
+ ACTION_DESC="added label '${{ github.event.label.name }}' to the issue"
101
+ if [ -n "$LABEL_COLOR" ]; then
102
+ ACTION_DESC="$ACTION_DESC (color: #$LABEL_COLOR)"
103
+ fi
104
+ fi
105
+
106
+ if [ "$ACTION_TYPE" = "unlabeled" ] && [ -n "${{ github.event.label.name }}" ]; then
107
+ LABEL_COLOR="${{ github.event.label.color }}"
108
+ ACTION_DESC="removed label '${{ github.event.label.name }}' from the issue"
109
+ if [ -n "$LABEL_COLOR" ]; then
110
+ ACTION_DESC="$ACTION_DESC (color: #$LABEL_COLOR)"
111
+ fi
112
+ fi
113
+
114
+ if [ "$ACTION_TYPE" = "milestoned" ] && [ -n "${{ github.event.milestone.title }}" ]; then
115
+ MILESTONE_DUE_DATE="${{ github.event.milestone.due_on }}"
116
+ ACTION_DESC="added the issue to milestone '${{ github.event.milestone.title }}'"
117
+ if [ -n "$MILESTONE_DUE_DATE" ] && [ "$MILESTONE_DUE_DATE" != "null" ]; then
118
+ ACTION_DESC="$ACTION_DESC (due: $MILESTONE_DUE_DATE)"
119
+ fi
120
+ fi
121
+
122
+ if [ "$ACTION_TYPE" = "demilestoned" ] && [ -n "${{ github.event.milestone.title }}" ]; then
123
+ ACTION_DESC="removed the issue from milestone '${{ github.event.milestone.title }}'"
124
+ fi
125
+
126
+ if [ "$ACTION_TYPE" = "transferred" ] && [ -n "${{ github.event.changes.new_repository.full_name }}" ]; then
127
+ ACTION_DESC="transferred the issue to repository ${{ github.event.changes.new_repository.full_name }}"
128
+ fi
129
+
130
+ if [ "$ACTION_TYPE" = "edited" ] && [ -n "${{ github.event.changes.title.from }}" ]; then
131
+ OLD_TITLE="${{ github.event.changes.title.from }}"
132
+ NEW_TITLE="${{ github.event.issue.title }}"
133
+ ACTION_DESC="edited the issue title from '$OLD_TITLE' to '$NEW_TITLE'"
134
+ fi
135
+
136
+ echo "ACTION_DESC=$ACTION_DESC" >> $GITHUB_ENV
137
+
138
+ # Only proceed if we found a task
139
+ if [ "$TASK_GID" != "null" ] && [ -n "$TASK_GID" ]; then
140
+ # Create a more detailed message with additional context
141
+ MESSAGE_TEXT="$ACTOR_NAME performed an action: $ACTION_DESC"
142
+
143
+ # Add issue state information for state changes
144
+ if [ "$ACTION_TYPE" = "closed" ] || [ "$ACTION_TYPE" = "reopened" ]; then
145
+ MESSAGE_TEXT=$(printf "%s\nIssue state: %s" "$MESSAGE_TEXT" "$ISSUE_STATE")
146
+ fi
147
+
148
+ # Add repository information for transferred issues
149
+ if [ "$ACTION_TYPE" = "transferred" ]; then
150
+ REPO_NAME="${{ github.event.repository.full_name }}"
151
+ MESSAGE_TEXT=$(printf "%s\nFrom repository: %s" "$MESSAGE_TEXT" "$REPO_NAME")
152
+ fi
153
+
154
+ MESSAGE_TEXT=$(printf "%s\n\nIssue: #%s - %s" "$MESSAGE_TEXT" "$ISSUE_NUMBER" "$ISSUE_TITLE")
155
+
156
+ BODY_DATA=$(jq -n \
157
+ --arg text "$MESSAGE_TEXT" \
158
+ '{
159
+ "data": {
160
+ "text": $text
161
+ }
162
+ }')
163
+
164
+ curl --request POST \
165
+ --url https://app.asana.com/api/1.0/tasks/$TASK_GID/stories \
166
+ --header 'accept: application/json' \
167
+ --header 'authorization: Bearer ${{ secrets.ASANA_PAT }}' \
168
+ --header 'content-type: application/json' \
169
+ --data "$BODY_DATA"
170
+ else
171
+ echo "No corresponding Asana task found for issue ID: $ISSUE_ID"
172
+ fi
0 commit comments