Repository navigation
135 lines (115 loc) · 3.83 KB
/
Copy pathlinear-deployed.yml
File metadata and controls
135 lines (115 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
name: Move Linear tickets to Deployed
on:
workflow_call:
inputs:
release_body:
required: true
type: string
team_key:
required: false
type: string
default: 'SDK'
secrets:
LINEAR_GITHUB_API_KEY:
required: true
jobs:
update-linear:
runs-on: ubuntu-latest
steps:
- name: Update Linear tickets to Deployed
env:
LINEAR_GITHUB_API_KEY: ${{ secrets.LINEAR_GITHUB_API_KEY }}
TEAM_KEY: ${{ inputs.team_key }}
run: |
set -euo pipefail
RELEASE_BODY=$(cat <<'EOF'
${{ inputs.release_body }}
EOF
)
TICKETS=$(echo "$RELEASE_BODY" | grep -oE "${TEAM_KEY}-[0-9]+" | sort -u || true)
if [ -z "$TICKETS" ]; then
echo "No ${TEAM_KEY} tickets found in release notes"
exit 0
fi
linear_query() {
local query="$1"
local payload
local response
payload=$(jq -cn --arg query "$query" '{query: $query}')
response=$(curl -sS -X POST https://api.linear.app/graphql \
-H "Authorization: $LINEAR_GITHUB_API_KEY" \
-H "Content-Type: application/json" \
-d "$payload")
if [ "$(echo "$response" | jq '.errors | length > 0')" = "true" ]; then
echo "Linear GraphQL query failed:" >&2
echo "$response" | jq '.errors' >&2
return 1
fi
echo "$response"
}
STATE_RESPONSE=$(linear_query '{
workflowStates(filter: { name: { eq: "Deployed" } }) {
nodes {
id
name
team {
key
}
}
}
}')
STATE_ID=$(echo "$STATE_RESPONSE" | jq -r --arg team_key "$TEAM_KEY" '
[.data.workflowStates.nodes[] | select(.team.key == $team_key)][0].id // empty
')
if [ -z "$STATE_ID" ]; then
echo "Unable to find a Deployed workflow state for team $TEAM_KEY" >&2
echo "Available Deployed states:" >&2
echo "$STATE_RESPONSE" | jq -r '
.data.workflowStates.nodes[]
| "- \(.team.key): \(.id)"
' >&2
exit 1
fi
echo "Deployed state ID: $STATE_ID"
for TICKET in $TICKETS; do
echo "Processing $TICKET..."
ISSUE_RESPONSE=$(linear_query "{
issue(id: \"$TICKET\") {
id
title
team {
key
}
}
}")
ISSUE_ID=$(echo "$ISSUE_RESPONSE" | jq -r --arg team_key "$TEAM_KEY" '
if .data.issue and .data.issue.team.key == $team_key then
.data.issue.id
else
empty
end
')
if [ -z "$ISSUE_ID" ]; then
echo " ⚠️ $TICKET not found in Linear team $TEAM_KEY"
continue
fi
UPDATE_RESPONSE=$(linear_query "mutation {
issueUpdate(id: \"$ISSUE_ID\", input: { stateId: \"$STATE_ID\" }) {
success
issue {
identifier
title
state {
name
}
}
}
}")
if [ "$(echo "$UPDATE_RESPONSE" | jq -r '.data.issueUpdate.success')" != "true" ]; then
echo " ❌ Failed to move $TICKET to Deployed" >&2
echo "$UPDATE_RESPONSE" | jq '.data.issueUpdate' >&2
exit 1
fi
ISSUE_STATE=$(echo "$UPDATE_RESPONSE" | jq -r '.data.issueUpdate.issue.state.name')
echo " ✅ $TICKET → $ISSUE_STATE"
done