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