Skip to content

Commit e3b4727

Browse files
committed
Add CI workflow to synchronize with shared repository labels
On every push that changes relevant files, and periodically, configure the repository's issue and pull request labels according to the universal, shared, and local label configuration files.
1 parent fe7419e commit e3b4727

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

.github/workflows/sync-labels.yml

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
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/writing-workflows/choosing-when-your-workflow-runs/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_PREFIX: label-configuration-file-
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: ${{ matrix.filename }}
79+
if-no-files-found: error
80+
name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}${{ matrix.filename }}
81+
82+
sync:
83+
needs: download
84+
runs-on: ubuntu-latest
85+
permissions:
86+
contents: read
87+
issues: write
88+
89+
steps:
90+
- name: Set environment variables
91+
run: |
92+
# See: https://docs.github.com/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#setting-an-environment-variable
93+
echo "MERGED_CONFIGURATION_PATH=${{ runner.temp }}/labels.yml" >> "$GITHUB_ENV"
94+
95+
- name: Determine whether to dry run
96+
id: dry-run
97+
if: >
98+
github.event_name == 'pull_request' ||
99+
(
100+
(
101+
github.event_name == 'push' ||
102+
github.event_name == 'workflow_dispatch'
103+
) &&
104+
github.ref != format('refs/heads/{0}', github.event.repository.default_branch)
105+
)
106+
run: |
107+
# Use of this flag in the github-label-sync command will cause it to only check the validity of the
108+
# configuration.
109+
echo "flag=--dry-run" >> $GITHUB_OUTPUT
110+
111+
- name: Checkout repository
112+
uses: actions/checkout@v4
113+
114+
- name: Download configuration file artifacts
115+
uses: actions/download-artifact@v4
116+
with:
117+
merge-multiple: true
118+
pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}*
119+
path: ${{ env.CONFIGURATIONS_FOLDER }}
120+
121+
- name: Remove unneeded artifacts
122+
uses: geekyeggo/delete-artifact@v5
123+
with:
124+
name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}*
125+
126+
- name: Merge label configuration files
127+
run: |
128+
# Merge all configuration files
129+
shopt -s extglob
130+
cat "${{ env.CONFIGURATIONS_FOLDER }}"/*.@(yml|yaml) > "${{ env.MERGED_CONFIGURATION_PATH }}"
131+
132+
- name: Install github-label-sync
133+
run: sudo npm install --global github-label-sync
134+
135+
- name: Sync labels
136+
env:
137+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
138+
run: |
139+
# See: https://github.com/Financial-Times/github-label-sync
140+
github-label-sync \
141+
--labels "${{ env.MERGED_CONFIGURATION_PATH }}" \
142+
${{ steps.dry-run.outputs.flag }} \
143+
${{ github.repository }}

0 commit comments

Comments
 (0)