1
+ # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/sync-labels.md
2
+ name : Sync Labels
3
+
4
+ # See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows
5
+ on :
6
+ push :
7
+ paths :
8
+ - " .github/workflows/sync-labels.ya?ml"
9
+ - " .github/label-configuration-files/*.ya?ml"
10
+ pull_request :
11
+ paths :
12
+ - " .github/workflows/sync-labels.ya?ml"
13
+ - " .github/label-configuration-files/*.ya?ml"
14
+ schedule :
15
+ # Run daily at 8 AM UTC to sync with changes to shared label configurations.
16
+ - cron : " 0 8 * * *"
17
+ workflow_dispatch :
18
+ repository_dispatch :
19
+
20
+ env :
21
+ CONFIGURATIONS_FOLDER : .github/label-configuration-files
22
+ CONFIGURATIONS_ARTIFACT : label-configuration-files
23
+
24
+ jobs :
25
+ check :
26
+ runs-on : ubuntu-latest
27
+ permissions :
28
+ contents : read
29
+
30
+ steps :
31
+ - name : Checkout repository
32
+ uses : actions/checkout@v4
33
+
34
+ - name : Download JSON schema for labels configuration file
35
+ id : download-schema
36
+ uses : carlosperate/download-file-action@v2
37
+ with :
38
+ file-url : https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json
39
+ location : ${{ runner.temp }}/label-configuration-schema
40
+
41
+ - name : Install JSON schema validator
42
+ run : |
43
+ sudo npm install \
44
+ --global \
45
+ ajv-cli \
46
+ ajv-formats
47
+
48
+ - name : Validate local labels configuration
49
+ run : |
50
+ # See: https://github.com/ajv-validator/ajv-cli#readme
51
+ ajv validate \
52
+ --all-errors \
53
+ -c ajv-formats \
54
+ -s "${{ steps.download-schema.outputs.file-path }}" \
55
+ -d "${{ env.CONFIGURATIONS_FOLDER }}/*.{yml,yaml}"
56
+
57
+ download :
58
+ needs : check
59
+ runs-on : ubuntu-latest
60
+ permissions : {}
61
+
62
+ strategy :
63
+ matrix :
64
+ filename :
65
+ # Filenames of the shared configurations to apply to the repository in addition to the local configuration.
66
+ # https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/sync-labels
67
+ - universal.yml
68
+
69
+ steps :
70
+ - name : Download
71
+ uses : carlosperate/download-file-action@v2
72
+ with :
73
+ file-url : https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }}
74
+
75
+ - name : Pass configuration files to next job via workflow artifact
76
+ uses : actions/upload-artifact@v4
77
+ with :
78
+ path : |
79
+ *.yaml
80
+ *.yml
81
+ if-no-files-found : error
82
+ name : ${{ env.CONFIGURATIONS_ARTIFACT }}
83
+
84
+ sync :
85
+ needs : download
86
+ runs-on : ubuntu-latest
87
+ permissions :
88
+ contents : read
89
+ issues : write
90
+
91
+ steps :
92
+ - name : Set environment variables
93
+ run : |
94
+ # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable
95
+ echo "MERGED_CONFIGURATION_PATH=${{ runner.temp }}/labels.yml" >> "$GITHUB_ENV"
96
+
97
+ - name : Determine whether to dry run
98
+ id : dry-run
99
+ if : >
100
+ github.event_name == 'pull_request' ||
101
+ (
102
+ (
103
+ github.event_name == 'push' ||
104
+ github.event_name == 'workflow_dispatch'
105
+ ) &&
106
+ github.ref != format('refs/heads/{0}', github.event.repository.default_branch)
107
+ )
108
+ run : |
109
+ # Use of this flag in the github-label-sync command will cause it to only check the validity of the
110
+ # configuration.
111
+ echo "flag=--dry-run" >> $GITHUB_OUTPUT
112
+
113
+ - name : Checkout repository
114
+ uses : actions/checkout@v4
115
+
116
+ - name : Download configuration files artifact
117
+ uses : actions/download-artifact@v4
118
+ with :
119
+ name : ${{ env.CONFIGURATIONS_ARTIFACT }}
120
+ path : ${{ env.CONFIGURATIONS_FOLDER }}
121
+
122
+ - name : Remove unneeded artifact
123
+ uses : geekyeggo/delete-artifact@v5
124
+ with :
125
+ name : ${{ env.CONFIGURATIONS_ARTIFACT }}
126
+
127
+ - name : Merge label configuration files
128
+ run : |
129
+ # Merge all configuration files
130
+ shopt -s extglob
131
+ cat "${{ env.CONFIGURATIONS_FOLDER }}"/*.@(yml|yaml) > "${{ env.MERGED_CONFIGURATION_PATH }}"
132
+
133
+ - name : Install github-label-sync
134
+ run : sudo npm install --global github-label-sync
135
+
136
+ - name : Sync labels
137
+ env :
138
+ GITHUB_ACCESS_TOKEN : ${{ secrets.GITHUB_TOKEN }}
139
+ run : |
140
+ # See: https://github.com/Financial-Times/github-label-sync
141
+ github-label-sync \
142
+ --labels "${{ env.MERGED_CONFIGURATION_PATH }}" \
143
+ ${{ steps.dry-run.outputs.flag }} \
144
+ ${{ github.repository }}
0 commit comments