13
13
GH_TOKEN : ${{ secrets.RELEASE_TOKEN }}
14
14
ORG_NAME : HathorNetwork
15
15
PROJECT_NUMBER : 15
16
+ COLUMN_FIELD : " Status"
16
17
COLUMN_NAME : " In Progress (Done)"
18
+ FROM_BRANCH : " release"
19
+ TO_BRANCH : " master"
17
20
18
21
steps :
19
22
- name : Checkout
@@ -22,135 +25,63 @@ jobs:
22
25
uses : actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
23
26
24
27
- name : Create Pull Request
28
+ env :
29
+ TAG : ${{ github.ref_type == 'tag' && github.ref_name || '' }}
25
30
id : create_pull
26
31
run : |
32
+ echo "Finding author of release $TAG"
33
+ AUTHOR=$(gh release view $TAG --json author -q '.author.login')
34
+ echo "release author: $AUTHOR"
35
+
36
+ # This just checks that the user exists, if the release could not be found the AUTHOR
37
+ # would be "release not found" which is a non-existant user.
38
+ [$(gh api -X GET search/users -f q=$AUTHOR) == "0"] && echo "Could not find author" && exit 1;
39
+
40
+ echo "Creating chore/sync-release-$TAG from release branch"
41
+ git fetch origin $TO_BRANCH:$TO_BRANCH $FROM_BRANCH:$FROM_BRANCH
42
+ git checkout $FROM_BRANCH
43
+ git checkout -b chore/sync-release-$TAG
44
+ git push -u origin chore/sync-release-$TAG
45
+
27
46
# The assignee will be the user that manually published the release
28
47
PR_URL=$(gh pr create \
29
48
--title "chore: [${{ github.ref_name }}] Merge release into master" \
30
49
--body "Automated PR to merge `release` branch into `master` based on release event." \
31
- --base "master" \
32
- --head "release" \
33
- --assignee "@me")
34
-
35
- # Obtaining the PR number from its URL
36
- PR_NUMBER=$(echo $PR_URL | grep -oP '/pull/\K\d+')
50
+ --base "$TO_BRANCH" \
51
+ --head "chore/sync-release-$TAG" \
52
+ --assignee "$AUTHOR")
37
53
38
54
# Store values in step output
39
55
echo "PR_URL=$PR_URL" >> "$GITHUB_OUTPUT"
40
- echo "PR_NUMBER=$PR_NUMBER" >> "$GITHUB_OUTPUT"
41
-
42
- - name : Associate PR with project
43
- env :
44
- PR_URL : ${{ steps.create_pull.outputs.PR_URL }}
45
- run : |
46
- gh project item-add $PROJECT_NUMBER \
47
- --owner $ORG_NAME \
48
- --url "$PR_URL" \
49
56
50
57
- name : Fetch project and column data
51
58
id : proj_columns
52
- # There is no direct command to move a card inside a project. Here we start gathering id data about the project
53
- # to do this operation through the API
54
59
run : |
55
- QUERY="
56
- query {
57
- organization(login: \"$ORG_NAME\") {
58
- projectV2(number: $PROJECT_NUMBER) {
59
- id
60
- field(name: \"Status\") {
61
- __typename
62
- ...on ProjectV2SingleSelectField {
63
- id
64
- options {
65
- id
66
- name
67
- }
68
- }
69
- }
70
- }
71
- }
72
- }
73
- "
74
- PROJ_RESPONSE=$(gh api graphql -f query="$QUERY")
60
+ FIELD_QUERY=".fields[] | select(.name==\"$COLUMN_FIELD\") | .id"
61
+ FIELD_ID=$(gh project field-list $PROJECT_NUMBER --owner $ORG_NAME --format json -q "$FIELD_QUERY")
75
62
76
- # Parse json response and fetch necessary data identifiers from it
77
- PROJ_DATA=$(echo "$PROJ_RESPONSE" | jq -r --arg column_name "$COLUMN_NAME" '
78
- .data.organization.projectV2.id as $projectId |
79
- .data.organization.projectV2.field.id as $fieldId |
80
- .data.organization.projectV2.field.options[] |
81
- select(.name == $column_name) |
82
- {
83
- projectId: $projectId,
84
- fieldId: $fieldId,
85
- optionId: .id
86
- }')
87
- PROJECT_ID=$(echo "$PROJ_DATA" | jq -r '.projectId')
88
- FIELD_ID=$(echo "$PROJ_DATA" | jq -r '.fieldId')
89
- OPTION_ID=$(echo "$PROJ_DATA" | jq -r '.optionId')
63
+ OPTION_QUERY=".fields[] | select(.name==\"$COLUMN_FIELD\") | .options[] | select(.name==\"$COLUMN_NAME\") | .id"
64
+ OPTION_ID=$(gh project field-list $PROJECT_NUMBER --owner $ORG_NAME --format json -q "$OPTION_QUERY")
65
+
66
+ PROJECT_QUERY=".projects[] | select(.number==$PROJECT_NUMBER) | .id"
67
+ PROJECT_ID=$(gh project list --owner $ORG_NAME --format json -q "$PROJECT_QUERY")
90
68
91
69
# Store values in step output
92
70
echo "PROJECT_ID=$PROJECT_ID" >> "$GITHUB_OUTPUT"
93
71
echo "FIELD_ID=$FIELD_ID" >> "$GITHUB_OUTPUT"
94
72
echo "OPTION_ID=$OPTION_ID" >> "$GITHUB_OUTPUT"
95
73
96
- - name : Fetch PR card Id
97
- id : proj_cardId
98
- env :
99
- PR_NUMBER : ${{ steps.create_pull.outputs.PR_NUMBER }}
100
- run : |
101
- # The github repository contains the owner organization too: we need to get only the last part of it
102
- REPO_NAME=$(basename ${{ github.repository }})
103
-
104
- # Executing graphql query to fetch the Id of the card that links the PR to the Project
105
- QUERY="
106
- query {
107
- repository(owner: \"$ORG_NAME\", name: \"$REPO_NAME\") {
108
- pullRequest(number: $PR_NUMBER) {
109
- id
110
- projectItems(first: 100) {
111
- ... on ProjectV2ItemConnection {
112
- nodes {
113
- ... on ProjectV2Item {
114
- id
115
- }
116
- }
117
- }
118
- }
119
- }
120
- }
121
- }"
122
- PROJ_RESPONSE=$(gh api graphql -f query="$QUERY")
123
-
124
- # Fetching the id of the project card related to this PR
125
- CARD_ID=$(echo "$PROJ_RESPONSE" | jq -r '.data.repository.pullRequest.projectItems.nodes[0].id')
126
-
127
- # Store value in step output
128
- echo "CARD_ID=$CARD_ID" >> "$GITHUB_OUTPUT"
129
-
130
- - name : Move card to correct column
131
- id : mutateCard
74
+ - name : Associate PR with project
132
75
env :
76
+ PR_URL : ${{ steps.create_pull.outputs.PR_URL }}
133
77
PROJECT_ID : ${{ steps.proj_columns.outputs.PROJECT_ID }}
134
78
FIELD_ID : ${{ steps.proj_columns.outputs.FIELD_ID }}
135
79
OPTION_ID : ${{ steps.proj_columns.outputs.OPTION_ID }}
136
- CARD_ID : ${{ steps.proj_cardId.outputs.CARD_ID }}
137
80
run : |
138
- QUERY="
139
- mutation {
140
- updateProjectV2ItemFieldValue(
141
- input: {
142
- projectId: \"$PROJECT_ID\",
143
- itemId: \"$CARD_ID\",
144
- fieldId: \"$FIELD_ID\",
145
- value: {
146
- singleSelectOptionId: \"$OPTION_ID\"
147
- }
148
- }
149
- ) {
150
- projectV2Item {
151
- id
152
- }
153
- }
154
- }
155
- "
156
- PROJ_RESPONSE=$(gh api graphql -f query="$QUERY")
81
+ ITEM_ID=$(gh project item-add $PROJECT_NUMBER \
82
+ --owner $ORG_NAME \
83
+ --url "$PR_URL" \
84
+ --format json \
85
+ -q '.id' )
86
+
87
+ gh project item-edit --project-id $PROJECT_ID --id $ITEM_ID --field-id $FIELD_ID --single-select-option-id $OPTION_ID
0 commit comments