judu/re-group-firefox-addonpublic Fork
⑂ 8b27c3c
Commits
⬇ Clone ▾
git clone https://git.rickub.com/judu/re-group-firefox-addon.git
git clone ssh://git@rickub.com/judu/re-group-firefox-addon.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

Improve ci and readmeUnverified

Julien Durillon committed 2026-06-04T10:24:30+02:00 Browse files
8b27c3c parent: 22667a9
modified .gitlab-ci.yml +11 -100
@@ -1,32 +1,24 @@
11 # Pipeline CI/CD re:group
2-# - lint : web-ext lint sur chaque push / MR
2+# - lint : web-ext lint sur chaque push / MR
33 # - secret-detection : scan de secrets (template GitLab)
4-# - sign : signe le .xpi via l'API AMO (unlisted) sur tag vX.Y.Z
5-# - publish : pousse le .xpi signé dans le Package Registry (stockage durable)
6-# - pages : reconstruit updates.json + miroir des .xpi sur GitLab Pages
4+# - sign : soumet + signe la version sur AMO (listed) sur tag vX.Y.Z
75 #
86 # Variables CI à définir (Settings > CI/CD > Variables), masked + protected :
97 # WEB_EXT_API_KEY (jwtIssuer depuis AMO > Manage API Keys)
108 # WEB_EXT_API_SECRET (jwtSecret)
119 # web-ext lit ces deux variables automatiquement : jamais passées en argument.
1210 #
13-# Le job de release ne tourne que sur tags PROTÉGÉS (motif v* à protéger
14-# dans Settings > Repository > Protected tags) → seuls les tags protégés
15-# voient les variables protégées.
11+# Le job sign ne tourne que sur tags PROTÉGÉS (motif v* à protéger dans
12+# Settings > Repository > Protected tags) → seuls les tags protégés voient
13+# les variables protégées. AMO gère la distribution et les mises à jour.
1614
1715 stages:
1816 - test
1917 - secret-detection
2018 - sign
21- - publish
22- - pages
2319
2420 variables:
2521 SECRET_DETECTION_ENABLED: 'true'
26- # Base publique servie par GitLab Pages (unique domain désactivé).
27- PAGES_BASE: 'https://juuduu.gitlab.io/re-group-firefox-addon'
28- # Nom du paquet générique dans le registry.
29- PKG_NAME: 're-group'
3022
3123 include:
3224 - template: Security/Secret-Detection.gitlab-ci.yml
@@ -48,8 +40,9 @@ lint:
4840 - npx web-ext lint --source-dir=.
4941
5042 # ---------------------------------------------------------------------------
51-# Sign — sur tag vX.Y.Z uniquement. Vérifie que le manifest == le tag,
52-# puis signe via AMO (canal unlisted, signature automatique).
43+# Sign — sur tag vX.Y.Z. Vérifie que le manifest == le tag, puis soumet et
44+# signe la version sur AMO (canal listed). La licence est passée via
45+# amo-metadata.json (obligatoire pour une version listed).
5346 # ---------------------------------------------------------------------------
5447 sign:
5548 stage: sign
@@ -66,90 +59,8 @@ sign:
6659 fi
6760 - npm install --no-save web-ext@^10
6861 # WEB_EXT_API_KEY / WEB_EXT_API_SECRET lus depuis l'environnement.
69- - npx web-ext sign --channel=unlisted --source-dir=. --artifacts-dir=signed
70- - mkdir -p out
71- - cp "$(ls -t signed/*.xpi | head -n1)" "out/${PKG_NAME}-${VERSION}.xpi"
72- - echo "VERSION=${VERSION}" >> build.env
62+ - npx web-ext sign --channel=listed --amo-metadata=amo-metadata.json --source-dir=. --artifacts-dir=signed
7363 artifacts:
7464 paths:
75- - out/
76- reports:
77- dotenv: build.env
78-
79-# ---------------------------------------------------------------------------
80-# Publish — dépose le .xpi signé dans le Package Registry générique.
81-# Stockage durable et versionné, jamais écrasé.
82-# ---------------------------------------------------------------------------
83-publish:
84- stage: publish
85- image: curlimages/curl:latest
86- needs: [sign]
87- rules:
88- - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
89- script:
90- - FILE="${PKG_NAME}-${VERSION}.xpi"
91- - |
92- curl --fail --silent --show-error \
93- --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
94- --upload-file "out/${FILE}" \
95- "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PKG_NAME}/${VERSION}/${FILE}"
96-
97-# ---------------------------------------------------------------------------
98-# Release — crée une Release GitLab avec un lien vers le .xpi (pour les humains).
99-# ---------------------------------------------------------------------------
100-release:
101- stage: publish
102- image: registry.gitlab.com/gitlab-org/release-cli:latest
103- needs: [sign, publish]
104- rules:
105- - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
106- script:
107- - echo "Release ${CI_COMMIT_TAG}"
108- release:
109- tag_name: '$CI_COMMIT_TAG'
110- name: 're:group $CI_COMMIT_TAG'
111- description: 'Version signée disponible sur la page de mise à jour.'
112- assets:
113- links:
114- - name: 're_group ${VERSION} (.xpi signé)'
115- url: '${PAGES_BASE}/${PKG_NAME}-${VERSION}.xpi'
116-
117-# ---------------------------------------------------------------------------
118-# Pages — reconstruit le site public : miroir de TOUS les .xpi du registry
119-# + updates.json regénéré depuis la liste complète des versions.
120-# Aucun état à committer : la source de vérité est le registry.
121-# ---------------------------------------------------------------------------
122-pages:
123- stage: pages
124- image: alpine:latest
125- needs: [publish]
126- rules:
127- - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
128- script:
129- - apk add --no-cache curl jq
130- - mkdir -p public
131- - ADDON_ID="$(jq -r '.browser_specific_settings.gecko.id' manifest.json)"
132- # Liste toutes les versions du paquet générique PKG_NAME.
133- - |
134- curl --fail --silent --show-error --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
135- "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages?package_type=generic&per_page=100" \
136- > packages.json
137- - VERSIONS="$(jq -r --arg n "$PKG_NAME" '.[] | select(.name==$n) | .version' packages.json | sort -V)"
138- - echo "[]" > entries.json
139- - |
140- for V in $VERSIONS; do
141- FILE="${PKG_NAME}-${V}.xpi"
142- curl --fail --silent --show-error --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
143- -o "public/${FILE}" \
144- "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PKG_NAME}/${V}/${FILE}"
145- jq --arg v "$V" --arg link "${PAGES_BASE}/${FILE}" \
146- '. += [{"version":$v,"update_link":$link}]' entries.json > entries.tmp
147- mv entries.tmp entries.json
148- done
149- - |
150- jq -n --arg id "$ADDON_ID" --slurpfile e entries.json \
151- '{addons: {($id): {updates: $e[0]}}}' > public/updates.json
152- - cat public/updates.json
153- artifacts:
154- paths:
155- - public
65+ - signed/
66+ expire_in: 1 month
@@ -1,32 +1,24 @@
1 # Pipeline CI/CD re:group1 # Pipeline CI/CD re:group
2-# - lint : web-ext lint sur chaque push / MR2+# - lint : web-ext lint sur chaque push / MR
3 # - secret-detection : scan de secrets (template GitLab)3 # - secret-detection : scan de secrets (template GitLab)
4-# - sign : signe le .xpi via l'API AMO (unlisted) sur tag vX.Y.Z4+# - sign : soumet + signe la version sur AMO (listed) sur tag vX.Y.Z
5-# - publish : pousse le .xpi signé dans le Package Registry (stockage durable)
6-# - pages : reconstruit updates.json + miroir des .xpi sur GitLab Pages
7 #5 #
8 # Variables CI à définir (Settings > CI/CD > Variables), masked + protected :6 # Variables CI à définir (Settings > CI/CD > Variables), masked + protected :
9 # WEB_EXT_API_KEY (jwtIssuer depuis AMO > Manage API Keys)7 # WEB_EXT_API_KEY (jwtIssuer depuis AMO > Manage API Keys)
10 # WEB_EXT_API_SECRET (jwtSecret)8 # WEB_EXT_API_SECRET (jwtSecret)
11 # web-ext lit ces deux variables automatiquement : jamais passées en argument.9 # web-ext lit ces deux variables automatiquement : jamais passées en argument.
12 #10 #
13-# Le job de release ne tourne que sur tags PROTÉGÉS (motif v* à protéger11+# Le job sign ne tourne que sur tags PROTÉGÉS (motif v* à protéger dans
14-# dans Settings > Repository > Protected tags) → seuls les tags protégés12+# Settings > Repository > Protected tags) → seuls les tags protégés voient
15-# voient les variables protégées.13+# les variables protégées. AMO gère la distribution et les mises à jour.
16 14
17 stages:15 stages:
18 - test16 - test
19 - secret-detection17 - secret-detection
20 - sign18 - sign
21- - publish
22- - pages
23 19
24 variables:20 variables:
25 SECRET_DETECTION_ENABLED: 'true'21 SECRET_DETECTION_ENABLED: 'true'
26- # Base publique servie par GitLab Pages (unique domain désactivé).
27- PAGES_BASE: 'https://juuduu.gitlab.io/re-group-firefox-addon'
28- # Nom du paquet générique dans le registry.
29- PKG_NAME: 're-group'
30 22
31 include:23 include:
32 - template: Security/Secret-Detection.gitlab-ci.yml24 - template: Security/Secret-Detection.gitlab-ci.yml
@@ -48,8 +40,9 @@ lint:
48 - npx web-ext lint --source-dir=.40 - npx web-ext lint --source-dir=.
49 41
50 # ---------------------------------------------------------------------------42 # ---------------------------------------------------------------------------
51-# Sign — sur tag vX.Y.Z uniquement. Vérifie que le manifest == le tag,43+# Sign — sur tag vX.Y.Z. Vérifie que le manifest == le tag, puis soumet et
52-# puis signe via AMO (canal unlisted, signature automatique).44+# signe la version sur AMO (canal listed). La licence est passée via
45+# amo-metadata.json (obligatoire pour une version listed).
53 # ---------------------------------------------------------------------------46 # ---------------------------------------------------------------------------
54 sign:47 sign:
55 stage: sign48 stage: sign
@@ -66,90 +59,8 @@ sign:
66 fi59 fi
67 - npm install --no-save web-ext@^1060 - npm install --no-save web-ext@^10
68 # WEB_EXT_API_KEY / WEB_EXT_API_SECRET lus depuis l'environnement.61 # WEB_EXT_API_KEY / WEB_EXT_API_SECRET lus depuis l'environnement.
69- - npx web-ext sign --channel=unlisted --source-dir=. --artifacts-dir=signed62+ - npx web-ext sign --channel=listed --amo-metadata=amo-metadata.json --source-dir=. --artifacts-dir=signed
70- - mkdir -p out
71- - cp "$(ls -t signed/*.xpi | head -n1)" "out/${PKG_NAME}-${VERSION}.xpi"
72- - echo "VERSION=${VERSION}" >> build.env
73 artifacts:63 artifacts:
74 paths:64 paths:
75- - out/65+ - signed/
76- reports:66+ expire_in: 1 month
77- dotenv: build.env
78-
79-# ---------------------------------------------------------------------------
80-# Publish — dépose le .xpi signé dans le Package Registry générique.
81-# Stockage durable et versionné, jamais écrasé.
82-# ---------------------------------------------------------------------------
83-publish:
84- stage: publish
85- image: curlimages/curl:latest
86- needs: [sign]
87- rules:
88- - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
89- script:
90- - FILE="${PKG_NAME}-${VERSION}.xpi"
91- - |
92- curl --fail --silent --show-error \
93- --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
94- --upload-file "out/${FILE}" \
95- "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PKG_NAME}/${VERSION}/${FILE}"
96-
97-# ---------------------------------------------------------------------------
98-# Release — crée une Release GitLab avec un lien vers le .xpi (pour les humains).
99-# ---------------------------------------------------------------------------
100-release:
101- stage: publish
102- image: registry.gitlab.com/gitlab-org/release-cli:latest
103- needs: [sign, publish]
104- rules:
105- - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
106- script:
107- - echo "Release ${CI_COMMIT_TAG}"
108- release:
109- tag_name: '$CI_COMMIT_TAG'
110- name: 're:group $CI_COMMIT_TAG'
111- description: 'Version signée disponible sur la page de mise à jour.'
112- assets:
113- links:
114- - name: 're_group ${VERSION} (.xpi signé)'
115- url: '${PAGES_BASE}/${PKG_NAME}-${VERSION}.xpi'
116-
117-# ---------------------------------------------------------------------------
118-# Pages — reconstruit le site public : miroir de TOUS les .xpi du registry
119-# + updates.json regénéré depuis la liste complète des versions.
120-# Aucun état à committer : la source de vérité est le registry.
121-# ---------------------------------------------------------------------------
122-pages:
123- stage: pages
124- image: alpine:latest
125- needs: [publish]
126- rules:
127- - if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
128- script:
129- - apk add --no-cache curl jq
130- - mkdir -p public
131- - ADDON_ID="$(jq -r '.browser_specific_settings.gecko.id' manifest.json)"
132- # Liste toutes les versions du paquet générique PKG_NAME.
133- - |
134- curl --fail --silent --show-error --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
135- "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages?package_type=generic&per_page=100" \
136- > packages.json
137- - VERSIONS="$(jq -r --arg n "$PKG_NAME" '.[] | select(.name==$n) | .version' packages.json | sort -V)"
138- - echo "[]" > entries.json
139- - |
140- for V in $VERSIONS; do
141- FILE="${PKG_NAME}-${V}.xpi"
142- curl --fail --silent --show-error --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
143- -o "public/${FILE}" \
144- "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${PKG_NAME}/${V}/${FILE}"
145- jq --arg v "$V" --arg link "${PAGES_BASE}/${FILE}" \
146- '. += [{"version":$v,"update_link":$link}]' entries.json > entries.tmp
147- mv entries.tmp entries.json
148- done
149- - |
150- jq -n --arg id "$ADDON_ID" --slurpfile e entries.json \
151- '{addons: {($id): {updates: $e[0]}}}' > public/updates.json
152- - cat public/updates.json
153- artifacts:
154- paths:
155- - public
modified README.md +2 -0
@@ -15,6 +15,8 @@ La spécification complète du comportement est dans [`SPEC.md`](./SPEC.md).
1515 plus longue**.
1616 - Si tu déplaces un onglet à la main, l'extension respecte ton choix jusqu'à ce que
1717 l'URL change vers un **autre** groupe.
18+ - Le bouton "réorganiser" ne respecte pas ton choix manuel, par contre. Ça remettra ton
19+ onglet dans son groupe.
1820 - Les onglets qui ne matchent rien ne sont jamais retirés d'un groupe.
1921 - Les groupes sont **par fenêtre** ; les groupes vides sont supprimés par Firefox.
2022
@@ -15,6 +15,8 @@ La spécification complète du comportement est dans [`SPEC.md`](./SPEC.md).
15 plus longue**.15 plus longue**.
16 - Si tu déplaces un onglet à la main, l'extension respecte ton choix jusqu'à ce que16 - Si tu déplaces un onglet à la main, l'extension respecte ton choix jusqu'à ce que
17 l'URL change vers un **autre** groupe.17 l'URL change vers un **autre** groupe.
18+ - Le bouton "réorganiser" ne respecte pas ton choix manuel, par contre. Ça remettra ton
19+ onglet dans son groupe.
18 - Les onglets qui ne matchent rien ne sont jamais retirés d'un groupe.20 - Les onglets qui ne matchent rien ne sont jamais retirés d'un groupe.
19 - Les groupes sont **par fenêtre** ; les groupes vides sont supprimés par Firefox.21 - Les groupes sont **par fenêtre** ; les groupes vides sont supprimés par Firefox.
20 22
added amo-metadata.json +6 -0
new file mode 100644
@@ -0,0 +1,6 @@
1+{
2+ "categories": ["tabs"],
3+ "version": {
4+ "license": "Unlicense"
5+ }
6+}
new file mode 100644
@@ -0,0 +1,6 @@
1+{
2+ "categories": ["tabs"],
3+ "version": {
4+ "license": "Unlicense"
5+ }
6+}
modified manifest.json +1 -2
@@ -1,14 +1,13 @@
11 {
22 "manifest_version": 3,
33 "name": "__MSG_extName__",
4- "version": "0.5.0",
4+ "version": "0.5.1",
55 "description": "__MSG_extDescription__",
66 "default_locale": "fr",
77 "browser_specific_settings": {
88 "gecko": {
99 "id": "regroup@judu",
1010 "strict_min_version": "151.0",
11- "update_url": "https://juuduu.gitlab.io/re-group-firefox-addon/updates.json",
1211 "data_collection_permissions": {
1312 "required": ["none"]
1413 }
@@ -1,14 +1,13 @@
1 {1 {
2 "manifest_version": 3,2 "manifest_version": 3,
3 "name": "__MSG_extName__",3 "name": "__MSG_extName__",
4- "version": "0.5.0",4+ "version": "0.5.1",
5 "description": "__MSG_extDescription__",5 "description": "__MSG_extDescription__",
6 "default_locale": "fr",6 "default_locale": "fr",
7 "browser_specific_settings": {7 "browser_specific_settings": {
8 "gecko": {8 "gecko": {
9 "id": "regroup@judu",9 "id": "regroup@judu",
10 "strict_min_version": "151.0",10 "strict_min_version": "151.0",
11- "update_url": "https://juuduu.gitlab.io/re-group-firefox-addon/updates.json",
12 "data_collection_permissions": {11 "data_collection_permissions": {
13 "required": ["none"]12 "required": ["none"]
14 }13 }
modified web-ext-config.cjs +1 -0
@@ -3,6 +3,7 @@
33 module.exports = {
44 ignoreFiles: [
55 "**/*.md",
6+ "amo-metadata.json",
67 "test/**",
78 ".code-review-graph/**",
89 "web-ext-config.cjs",
@@ -3,6 +3,7 @@
3 module.exports = {3 module.exports = {
4 ignoreFiles: [4 ignoreFiles: [
5 "**/*.md",5 "**/*.md",
6+ "amo-metadata.json",
6 "test/**",7 "test/**",
7 ".code-review-graph/**",8 ".code-review-graph/**",
8 "web-ext-config.cjs",9 "web-ext-config.cjs",