Votre pipeline échoue avec l'erreur 403 Forbidden ou Connection refused lors de la tentative d'accès à une API externe ou de téléchargement d'une dépendance ? Il est probable que le problème soit que l'adresse IP de votre serveur CI/CD est bloquée du côté de la ressource. Un proxy résout ce problème : vous redirigez le trafic via l'IP souhaitée et le pipeline fonctionne sans interruption. Dans cet article, vous trouverez des instructions étape par étape pour GitHub Actions, GitLab CI et Jenkins.
Pourquoi un proxy dans CI/CD : scénarios réels
Les pipelines CI/CD fonctionnent sur des serveurs avec des adresses IP fixes — des runners cloud GitHub, GitLab ou sur des agents Jenkins auto-hébergés. Ces IP sont bien connues, et de nombreux services externes les bloquent ou limitent le nombre de requêtes. Voici des situations concrètes où un proxy est indispensable :
Accès aux ressources géo-restreintes
De nombreux registres npm d'entreprise, dépôts Maven et API internes ne sont accessibles que depuis certains pays ou plages d'IP. Si votre runner GitHub Actions se trouve dans une région qui est bloquée au niveau du pare-feu du service cible, le pipeline ne pourra pas télécharger les dépendances ou envoyer des données. Un proxy avec la géolocalisation appropriée résout ce problème sans modifier l'infrastructure.
Limitation de taux et blocages par IP
Les runners cloud GitHub Actions utilisent des IP des plages de Microsoft Azure. De nombreuses API publiques connaissent ces plages et leur appliquent des limites strictes — ou les bloquent complètement. Par exemple, le parsing de données publiques, les requêtes vers des API tierces pendant les tests, le téléchargement de distributions depuis des CDN restreints — tout cela échoue régulièrement à cause des IP des runners cloud. La rotation via un proxy permet de contourner la limitation de taux.
Tests d'intégration avec des sites réels
Si vos tests d'intégration accèdent à de vrais sites web ou marketplaces (Wildberries, Ozon, Avito, Amazon), ces sites voient la même IP du runner à chaque exécution et la bloquent rapidement. Un proxy avec rotation d'IP permet aux tests de passer de manière stable sans CAPTCHA ni blocages.
Accès aux ressources internes de l'entreprise
Les réseaux d'entreprise sont souvent fermés au monde extérieur. Si le pipeline doit déployer sur un serveur interne ou accéder à une API fermée, un proxy (ou tunnel SOCKS5) à l'intérieur du réseau d'entreprise devient un pont entre le runner cloud et l'infrastructure fermée.
Tests d'intégration publicitaires et marketing
Les équipes travaillant avec l'API Facebook Ads, l'API TikTok Ads ou l'API Google Ads automatisent souvent la création de campagnes via CI/CD. Ces plateformes ont des règles strictes concernant les IP : les requêtes provenant des IP des centres de données peuvent être bloquées ou nécessiter une vérification supplémentaire. Les proxies résidentiels dans le pipeline rendent les requêtes similaires à un trafic utilisateur normal.
Quel type de proxy choisir pour le pipeline
Le choix du type de proxy dépend de la tâche. Pour les pipelines CI/CD, trois options sont pertinentes — chacune avec ses avantages et ses limitations :
| Type de proxy | Vitesse | Confiance des sites | Mieux pour |
|---|---|---|---|
| Proxies de centre de données | Très élevé | Moyenne | Téléchargement de dépendances, dépôts internes, API rapides sans vérifications strictes |
| Proxies résidentiels | Moyenne | Élevée | Tests d'intégration avec des sites réels, API publicitaires (Facebook, TikTok), marketplaces |
| Proxies mobiles | Moyenne | Maximale | Tests d'API mobiles, travail avec des plateformes avec des protections anti-bot maximales |
Règle pratique :
Si la tâche consiste à télécharger des paquets ou à accéder à un service interne, optez pour des proxies de centre de données — ils sont rapides et moins chers. Si la tâche concerne des tests sur des sites réels ou le travail avec des plateformes publicitaires — des proxies résidentiels sont nécessaires. Le protocole SOCKS5 est préférable à HTTP/HTTPS, car il fonctionne de manière plus transparente avec des ports et protocoles non standards.
Configuration du proxy dans GitHub Actions
GitHub Actions est l'outil CI/CD le plus populaire aujourd'hui. La configuration du proxy ici se fait via des variables d'environnement et des secrets de dépôt. Détaillons étape par étape.
Étape 1 : Ajoutez les données du proxy dans les secrets du dépôt
Ne jamais inscrire le nom d'utilisateur et le mot de passe du proxy directement dans le fichier YAML du workflow. Utilisez les Secrets de GitHub :
- Ouvrez le dépôt → Settings → Secrets and variables → Actions
- Cliquez sur New repository secret
- Créez un secret
PROXY_URLavec une valeur du typehttp://user:[email protected]:port
Étape 2 : Utilisez les variables d'environnement dans le workflow
La plupart des outils (curl, wget, npm, pip, Maven) récupèrent automatiquement les variables d'environnement standard HTTP_PROXY, HTTPS_PROXY et NO_PROXY. Exemple de workflow :
name: Build with Proxy
on: [push]
env:
HTTP_PROXY: ${{ secrets.PROXY_URL }}
HTTPS_PROXY: ${{ secrets.PROXY_URL }}
NO_PROXY: localhost,127.0.0.1,internal.company.com
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm ci
- name: Run integration tests
run: npm test
- name: Call external API
run: |
curl -v https://api.example.com/data
Étape 3 : Proxy SOCKS5 dans GitHub Actions
Si vous utilisez SOCKS5 (recommandé pour la plupart des tâches), les variables d'environnement standard ne suffisent pas — un tunnel local est nécessaire. Utilisez l'outil proxychains ou configurez microsocks :
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Setup SOCKS5 proxy tunnel
run: |
sudo apt-get install -y proxychains4
echo "socks5 proxy.host 1080 user password" >> /etc/proxychains4.conf
- name: Run command through SOCKS5
run: proxychains4 curl https://restricted-resource.com/api
Configuration du proxy pour des outils spécifiques
Certains outils ignorent les variables système et nécessitent une configuration distincte :
| Outil | Comment configurer le proxy |
|---|---|
| npm / yarn | npm config set proxy http://user:pass@host:port |
| pip (Python) | pip install --proxy http://user:pass@host:port package |
| Maven | Via settings.xml section <proxies> |
| Gradle | systemProp.https.proxyHost=host dans gradle.properties |
| Git | git config --global http.proxy http://user:pass@host:port |
| Docker build | --build-arg HTTP_PROXY=http://user:pass@host:port |
Configuration du proxy dans GitLab CI
GitLab CI offre plusieurs niveaux pour définir des variables d'environnement : au niveau du projet, du groupe ou de l'instance. Cela rend la gestion des proxies plus flexible par rapport à GitHub Actions.
Étape 1 : Ajoutez des variables dans GitLab CI/CD Variables
- Ouvrez le projet → Settings → CI/CD → section Variables
- Cliquez sur Add variable
- Ajoutez la variable
PROXY_URLavec le type Masked (cache la valeur dans les logs) - Valeur :
http://user:[email protected]:port
Étape 2 : Utilisez les variables dans .gitlab-ci.yml
variables:
HTTP_PROXY: $PROXY_URL
HTTPS_PROXY: $PROXY_URL
NO_PROXY: "localhost,127.0.0.1,.internal.company.com"
stages:
- build
- test
- deploy
build:
stage: build
image: node:20-alpine
script:
- npm ci
- npm run build
integration_tests:
stage: test
image: python:3.11
script:
- pip install -r requirements.txt
- pytest tests/integration/
deploy:
stage: deploy
script:
- curl -X POST https://api.external-service.com/deploy
-H "Authorization: Bearer $DEPLOY_TOKEN"
-d '{"version": "$CI_COMMIT_SHA"}'
Proxy uniquement pour des jobs spécifiques
Si le proxy n'est pas nécessaire partout (par exemple, uniquement pour les tests d'intégration, mais pas pour la construction), définissez les variables au niveau d'un job spécifique, et non globalement :
integration_tests:
stage: test
variables:
HTTP_PROXY: $PROXY_URL
HTTPS_PROXY: $PROXY_URL
script:
- pytest tests/integration/
build:
stage: build
# Ici, le proxy n'est pas défini — connexion directe
script:
- npm ci && npm run build
GitLab Runner auto-hébergé : configuration du proxy au niveau du runner
Si vous utilisez votre propre GitLab Runner, vous pouvez définir le proxy globalement dans la configuration du runner. Ouvrez le fichier /etc/gitlab-runner/config.toml et ajoutez dans la section [runners.env] :
[[runners]]
name = "my-runner"
url = "https://gitlab.com/"
token = "TOKEN"
executor = "docker"
environment = [
"HTTP_PROXY=http://user:[email protected]:port",
"HTTPS_PROXY=http://user:[email protected]:port",
"NO_PROXY=localhost,127.0.0.1"
]
C'est pratique lorsque tous les pipelines sur ce runner doivent utiliser le proxy — il n'est pas nécessaire de le spécifier dans chaque .gitlab-ci.yml.
Configuration du proxy dans Jenkins
Jenkins est l'outil le plus flexible des trois, mais aussi le plus complexe à configurer. Le proxy peut être défini à plusieurs niveaux : globalement pour tout Jenkins, pour un Pipeline spécifique ou pour une étape individuelle.
Méthode 1 : Paramètres globaux du proxy dans Jenkins
- Ouvrez Manage Jenkins → System
- Trouvez la section HTTP Proxy Configuration
- Remplissez les champs : Serveur, Port, Nom d'utilisateur, Mot de passe
- Dans le champ No Proxy Host, indiquez les adresses internes séparées par des virgules
- Cliquez sur Test URL pour vérifier et enregistrez
Ce paramètre affecte le téléchargement des plugins et des mises à jour de Jenkins lui-même, mais n'est pas automatiquement transmis à l'environnement d'exécution des pipelines. Une configuration distincte est nécessaire pour les pipelines.
Méthode 2 : Proxy dans un Pipeline déclaratif via environment
pipeline {
agent any
environment {
HTTP_PROXY = credentials('proxy-url-credential')
HTTPS_PROXY = credentials('proxy-url-credential')
NO_PROXY = 'localhost,127.0.0.1,internal.company.com'
}
stages {
stage('Build') {
steps {
sh 'npm ci'
sh 'npm run build'
}
}
stage('Integration Tests') {
steps {
sh 'pytest tests/integration/'
}
}
stage('Deploy') {
steps {
sh '''
curl -X POST https://api.external-service.com/deploy \
-H "Authorization: Bearer ${DEPLOY_TOKEN}" \
-d "version=${GIT_COMMIT}"
'''
}
}
}
}
Étape 3 : Ajoutez les identifiants du proxy dans les Credentials de Jenkins
- Ouvrez Manage Jenkins → Credentials → System → Global credentials
- Cliquez sur Add Credentials
- Type : Secret text
- ID :
proxy-url-credential - Secret :
http://user:[email protected]:port
Méthode 3 : Proxy via les paramètres JVM pour les projets Java
Si votre pipeline construit un projet Java (Maven, Gradle), les variables d'environnement système peuvent ne pas fonctionner — la JVM utilise ses propres propriétés système. Ajoutez-les dans JAVA_OPTS :
environment {
JAVA_OPTS = '-Dhttps.proxyHost=proxy.host -Dhttps.proxyPort=8080 -Dhttps.proxyUser=user -Dhttps.proxyPassword=password -Dhttp.nonProxyHosts=localhost|127.0.0.1|*.internal.com'
}
Proxy à l'intérieur des conteneurs Docker dans le pipeline
La plupart des pipelines CI/CD modernes exécutent des étapes à l'intérieur de conteneurs Docker. La transmission du proxy dans le conteneur est une tâche distincte qui peut être résolue de plusieurs manières.
Transmission du proxy via --build-arg lors de la construction de l'image
Si le proxy est nécessaire uniquement lors de la construction de l'image Docker (par exemple, pour l'installation de paquets à l'intérieur du Dockerfile), utilisez des arguments de construction :
# Dans .github/workflows/build.yml ou .gitlab-ci.yml
docker build \
--build-arg HTTP_PROXY=$HTTP_PROXY \
--build-arg HTTPS_PROXY=$HTTPS_PROXY \
--build-arg NO_PROXY=$NO_PROXY \
-t myapp:latest .
# Dans Dockerfile
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY
ENV HTTP_PROXY=$HTTP_PROXY
ENV HTTPS_PROXY=$HTTPS_PROXY
ENV NO_PROXY=$NO_PROXY
RUN apt-get update && apt-get install -y curl
RUN npm ci
⚠️ Important : sécurité lors de la construction d'images
Les variables définies via ARG et ENV dans le Dockerfile sont conservées dans les métadonnées de l'image et visibles via docker inspect. Si le proxy nécessite une authentification, assurez-vous que l'image prête n'est pas publiée dans un registre public — sinon, les identifiants seront accessibles publiquement.
Configuration globale du démon Docker pour le proxy
Sur des runners auto-hébergés, vous pouvez configurer le proxy pour tout le démon Docker — alors tous les conteneurs recevront automatiquement le proxy sans modifications dans le Dockerfile :
# /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://user:[email protected]:port"
Environment="HTTPS_PROXY=http://user:[email protected]:port"
Environment="NO_PROXY=localhost,127.0.0.1,registry.internal.com"
# Appliquer les modifications :
# systemctl daemon-reload
# systemctl restart docker
Sécurité : comment stocker les identifiants du proxy
Les identifiants du proxy sont des secrets tout aussi importants que les clés API ou les mots de passe des bases de données. Leur fuite signifie que quiconque pourra utiliser votre proxy à vos dépens. Voici les règles de stockage sécurisé :
Checklist de sécurité
- ✅ Jamais n'inscrivez le nom d'utilisateur/mot de passe du proxy directement dans les fichiers YAML du pipeline
- ✅ Utilisez des variables masquées dans GitLab et des secrets chiffrés dans GitHub — elles sont cachées dans les logs
- ✅ Dans Jenkins, utilisez le type Secret text ou Username with password dans le Credentials Store
- ✅ Ajoutez
NO_PROXYpour les adresses internes — le trafic vers votre infrastructure ne doit pas passer par le proxy - ✅ Faites régulièrement tourner les mots de passe du proxy — mettez-les à jour uniquement dans le stockage des secrets, sans changer le code du pipeline
- ✅ Utilisez l'authentification IP du proxy (whitelist IP du runner) là où cela est pris en charge — c'est plus fiable qu'un mot de passe
- ✅ Vérifiez les logs du proxy pour détecter une activité inhabituelle
Format de l'URL du proxy : quoi insérer où
| Protocole | Format de l'URL | Quand utiliser |
|---|---|---|
| HTTP | http://user:pass@host:port |
La plupart des outils, npm, pip, curl |
| HTTPS | https://user:pass@host:port |
Connexion chiffrée au serveur proxy |
| SOCKS5 | socks5://user:pass@host:port |
Ports non standards, trafic UDP, compatibilité maximale |
Erreurs fréquentes et comment les corriger
Même après une configuration correcte, des problèmes peuvent survenir. Voici les erreurs les plus courantes et leurs solutions :
Erreur : Proxy Authentication Required (407)
Raison : Nom d'utilisateur ou mot de passe incorrect, ou ils ne sont pas transmis par l'outil.
Solution : Vérifiez le format de l'URL — les caractères spéciaux dans le mot de passe doivent être encodés en URL. Par exemple, p@ss#word → p%40ss%23word. Assurez-vous également que la variable d'environnement est bien transmise à l'étape — affichez-la avec echo $HTTP_PROXY (les premiers caractères) pour vérification.
Erreur : SSL Certificate Verification Failed
Raison : Le proxy effectue une inspection SSL (MITM) et remplace le certificat. Le client ne fait pas confiance au certificat du proxy.
Solution : Ajoutez le certificat racine du proxy aux certificats de confiance. Pour curl : --cacert /path/to/proxy-ca.crt. Pour npm : npm config set cafile /path/to/proxy-ca.crt. Ou utilisez un proxy sans inspection SSL — c'est préférable pour CI/CD.
Erreur : Connection Timeout via le proxy
Raison : Le serveur proxy est inaccessible depuis l'IP du runner, ou le port est bloqué par le pare-feu.
Solution : Vérifiez l'accessibilité du proxy avec la commande nc -zv proxy.host port dans l'étape du pipeline. Assurez-vous que l'IP du runner est ajoutée à la liste blanche du fournisseur de proxy (si l'authentification IP est utilisée). Pour les runners cloud GitHub Actions, les plages d'IP sont publiées dans meta.github.com.
Erreur : L'outil ignore les variables HTTP_PROXY
Raison : Certains outils (en particulier ceux basés sur Java) ne lisent pas les variables d'environnement système.
Solution : Utilisez la configuration native du proxy pour l'outil spécifique (voir le tableau ci-dessus). Pour Java, ajoutez les propriétés JVM via JAVA_OPTS. Pour curl, utilisez le drapeau -x http://proxy:port explicitement.
Erreur : Les services internes passent aussi par le proxy
Raison : La variable NO_PROXY n'est pas définie ou est mal définie.
Solution : Indiquez tous les domaines internes et IP dans NO_PROXY. Utilisez des jokers pour les domaines : NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,.internal.company.com. Notez que certains outils prennent en charge la notation CIDR, d'autres uniquement les domaines exacts.
Conclusion
La configuration du proxy dans un pipeline CI/CD n'est pas une tâche ponctuelle, mais fait partie d'une architecture d'automatisation correcte. Nous avons examiné trois outils principaux : GitHub Actions (via Secrets et variables d'environnement), GitLab CI (via Variables avec masquage) et Jenkins (via Credentials Store et Pipeline déclaratif). Les principes clés sont les mêmes pour tous : ne jamais stocker les identifiants dans le code, utiliser NO_PROXY pour les adresses internes et choisir le type de proxy en fonction de la tâche spécifique.
Le choix du bon type de proxy est crucial pour la stabilité du pipeline. Pour le téléchargement de dépendances et les appels aux API standards, des proxies de centre de données rapides suffisent. Si votre pipeline effectue des tests d'intégration sur des sites réels, travaille avec des plateformes publicitaires (API Facebook Ads, API TikTok Ads) ou accède à des marketplaces — utilisez des proxies résidentiels : leurs IP sont perçues comme un trafic utilisateur normal et sont très rarement soumises à des blocages ou à des limitations de taux.
La règle principale : testez le proxy dans une étape distincte au début du pipeline — cela permettra de diagnostiquer rapidement les problèmes et de ne pas perdre de temps à chercher une erreur à la fin d'une longue construction. Ajoutez une étape curl -v https://api.ipify.org immédiatement après la configuration du proxy — cela montrera l'IP à partir de laquelle les requêtes partent et confirmera que le proxy fonctionne correctement.