بازگشت به وبلاگ

ادغام پروکسی در پایپ‌لاین CI/CD: تنظیمات برای GitHub Actions، GitLab و Jenkins

راهنمای کامل ادغام پروکسی در خط لوله CI/CD برای توسعه‌دهندگان: تنظیم GitHub Actions، GitLab CI، Jenkins با مثال‌های کد و حل مشکلات رایج.

📅۲۸ بهمن ۱۴۰۴
```html

هنگام اتوماسیون استقرار و تست، اغلب نیاز به استفاده از سرورهای پروکسی در فرآیندهای CI/CD وجود دارد. این ممکن است به سیاست‌های امنیتی شرکتی، تست ویژگی‌های جغرافیایی یا دور زدن محدودیت‌های نرخ هنگام بارگذاری وابستگی‌ها مربوط باشد. در این راهنما، پیکربندی عملی پروکسی برای پلتفرم‌های محبوب CI/CD را با نمونه‌های آماده بررسی خواهیم کرد.

چرا به پروکسی در فرآیندهای CI/CD نیاز داریم

استفاده از سرورهای پروکسی در فرآیندهای اتوماسیون استقرار چندین مشکل حیاتی را حل می‌کند. اولاً، بسیاری از شبکه‌های شرکتی نیاز دارند که تمام ترافیک خروجی از طریق پروکسی‌های شرکتی برای کنترل امنیت و ثبت وقایع عبور کند. بدون پیکربندی صحیح، خط لوله CI/CD به سادگی نمی‌تواند وابستگی‌ها را بارگذاری کند یا به سرویس‌های خارجی متصل شود.

ثانیاً، هنگام تست برنامه‌هایی با منطق جغرافیایی، باید عملکرد را از کشورهای مختلف بررسی کرد. به عنوان مثال، اگر شما سرویسی با محتوای منطقه‌ای یا قیمت‌گذاری توسعه می‌دهید، تست‌های خودکار باید کاربران را از مکان‌های مختلف شبیه‌سازی کنند. در اینجا پروکسی‌های مسکونی با آدرس‌های IP از مناطق مورد نیاز کمک می‌کنند.

دلیل سوم — دور زدن محدودیت‌های نرخ و مسدودیت‌ها. هنگام اجرای مکرر خط لوله، به ویژه در تیم‌های بزرگ، سرورهای CI/CD ممکن است تحت محدودیت‌های API سرویس‌های خارجی قرار بگیرند. به عنوان مثال، API گیت‌هاب یا مخازن بسته ممکن است به طور موقت IP را در صورت تجاوز از حد درخواست‌ها مسدود کنند. چرخش پروکسی کمک می‌کند تا بار را توزیع کنیم.

مهم: برای فرآیندهای CI/CD، ثبات اتصال حیاتی است. از پروکسی‌هایی با زمان کارکرد حداقل 99.5% و زمان پاسخ سریع (کمتر از 200 میلی‌ثانیه) استفاده کنید. پروکسی‌های ناپایدار منجر به سقوط‌های تصادفی در ساخت و از دست رفتن زمان تیم برای تحقیق خواهند شد.

تنظیم پروکسی در GitHub Actions

GitHub Actions — یکی از محبوب‌ترین پلتفرم‌ها برای CI/CD است. تنظیم پروکسی در اینجا از طریق متغیرهای محیطی انجام می‌شود که می‌توان آنها را در سطح workflow یا کل سازمان تعیین کرد. چندین روش برای ادغام را بررسی خواهیم کرد.

تنظیم پایه از طریق متغیرهای محیطی

ساده‌ترین روش — تنظیم متغیرهای محیطی HTTP_PROXY و HTTPS_PROXY در ابتدای job. بیشتر ابزارها (curl، wget، npm، pip) به طور خودکار از این متغیرها استفاده می‌کنند:

name: CI with Proxy

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    
    env:
      HTTP_PROXY: http://proxy.example.com:8080
      HTTPS_PROXY: http://proxy.example.com:8080
      NO_PROXY: localhost,127.0.0.1,.internal.domain
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      
      - name: Install dependencies
        run: npm install
      
      - name: Run tests
        run: npm test

متغیر NO_PROXY حیاتی است — این متغیر آدرس‌های محلی و سرویس‌های داخلی را از پروکسی خارج می‌کند. بدون آن ممکن است مشکلاتی در اتصال به localhost یا کانتینرهای Docker داخلی ایجاد شود.

ذخیره‌سازی امن اطلاعات اعتبار از طریق GitHub Secrets

اگر پروکسی نیاز به احراز هویت دارد، هرگز نام کاربری و رمز عبور را به صورت آشکار در فایل workflow ذخیره نکنید. از GitHub Secrets استفاده کنید:

name: CI with Authenticated Proxy

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Configure Proxy
        run: |
          echo "HTTP_PROXY=http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASS }}@${{ secrets.PROXY_HOST }}:${{ secrets.PROXY_PORT }}" >> $GITHUB_ENV
          echo "HTTPS_PROXY=http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASS }}@${{ secrets.PROXY_HOST }}:${{ secrets.PROXY_PORT }}" >> $GITHUB_ENV
          echo "NO_PROXY=localhost,127.0.0.1" >> $GITHUB_ENV
      
      - name: Test proxy connection
        run: curl -I https://api.github.com
      
      - name: Install dependencies
        run: npm ci

secrets را در تنظیمات مخزن ایجاد کنید: Settings → Secrets and variables → Actions → New repository secret. PROXY_USER، PROXY_PASS، PROXY_HOST و PROXY_PORT را اضافه کنید. این مقادیر رمزگذاری شده و در لاگ‌ها قابل دسترسی نخواهند بود.

تنظیم پروکسی برای مراحل خاص

گاهی اوقات نیاز است که پروکسی فقط برای عملیات خاصی استفاده شود، به عنوان مثال، فقط برای بارگذاری وابستگی‌ها، اما نه برای استقرار. متغیرها را در سطح مرحله خاص تنظیم کنید:

steps:
  - name: Download dependencies via proxy
    env:
      HTTP_PROXY: http://proxy.example.com:8080
      HTTPS_PROXY: http://proxy.example.com:8080
    run: npm install
  
  - name: Deploy without proxy
    run: ./deploy.sh

ادغام پروکسی با GitLab CI/CD

GitLab CI/CD چندین سطح تنظیم پروکسی را ارائه می‌دهد: در سطح runner، در سطح پروژه و در سطح job خاص. انتخاب بستگی به این دارد که آیا پروکسی برای تمام پروژه‌ها نیاز است یا فقط برای پروژه‌های خاص.

تنظیم پروکسی در سطح GitLab Runner

اگر از GitLab Runner خود میزبانی شده استفاده می‌کنید و همه پروژه‌ها باید از طریق پروکسی کار کنند، آن را در پیکربندی runner تنظیم کنید. فایل /etc/gitlab-runner/config.toml را ویرایش کنید:

[[runners]]
  name = "docker-runner"
  url = "https://gitlab.com/"
  token = "YOUR_TOKEN"
  executor = "docker"
  
  [runners.docker]
    image = "alpine:latest"
    privileged = false
    
  [runners.docker.services_environment]
    HTTP_PROXY = "http://proxy.example.com:8080"
    HTTPS_PROXY = "http://proxy.example.com:8080"
    NO_PROXY = "localhost,127.0.0.1,.gitlab.com"

پس از تغییر پیکربندی، runner را دوباره راه‌اندازی کنید: sudo gitlab-runner restart. اکنون همه jobs در این runner به طور خودکار از پروکسی استفاده خواهند کرد.

تنظیم از طریق .gitlab-ci.yml

برای تنظیم پروکسی در سطح پروژه خاص، از متغیرها در فایل .gitlab-ci.yml استفاده کنید. این یک رویکرد انعطاف‌پذیرتر است که به پروژه‌های مختلف اجازه می‌دهد از پروکسی‌های مختلف استفاده کنند:

variables:
  HTTP_PROXY: "http://proxy.example.com:8080"
  HTTPS_PROXY: "http://proxy.example.com:8080"
  NO_PROXY: "localhost,127.0.0.1,.internal"

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - echo "Proxy configured: $HTTP_PROXY"
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/

test:
  stage: test
  script:
    - npm test
  dependencies:
    - build

استفاده از متغیرهای GitLab CI/CD برای اطلاعات اعتبار

برای ذخیره‌سازی داده‌های حساس از متغیرهای CI/CD در تنظیمات پروژه استفاده کنید: Settings → CI/CD → Variables. متغیرهای protected و masked را ایجاد کنید:

  • PROXY_URL — URL کامل با اطلاعات اعتبار (masked)
  • PROXY_HOST — میزبان سرور پروکسی
  • PROXY_PORT — پورت
  • PROXY_USER و PROXY_PASS — برای ذخیره‌سازی جداگانه

سپس از آنها در .gitlab-ci.yml استفاده کنید:

build:
  stage: build
  before_script:
    - export HTTP_PROXY="http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}"
    - export HTTPS_PROXY="http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}"
  script:
    - npm install
    - npm run build

پیکربندی پروکسی در Jenkins

Jenkins چندین روش برای تنظیم پروکسی بسته به معماری ارائه می‌دهد: تنظیمات جهانی برای Jenkins master، تنظیمات برای نمایندگان خاص یا تنظیمات در سطح خط لوله‌های جداگانه.

تنظیم جهانی پروکسی برای Jenkins

برای تنظیم پروکسی که Jenkins برای به‌روزرسانی پلاگین‌ها و سایر عملیات داخلی استفاده خواهد کرد، به Manage Jenkins → Manage Plugins → Advanced بروید. در بخش HTTP Proxy Configuration، موارد زیر را مشخص کنید:

  • سرور: proxy.example.com
  • پورت: 8080
  • نام کاربری و رمز عبور (در صورت نیاز به احراز هویت)
  • No Proxy Host: localhost,127.0.0.1,.internal

این تنظیم فقط بر خود Jenkins تأثیر می‌گذارد، اما بر jobs تأثیری ندارد. برای jobs به یک پیکربندی جداگانه نیاز است.

تنظیم پروکسی برای Jenkins Pipeline

در Jenkinsfile می‌توانید متغیرهای محیطی را برای کل خط لوله یا برای مراحل خاص تعیین کنید:

pipeline {
    agent any
    
    environment {
        HTTP_PROXY = 'http://proxy.example.com:8080'
        HTTPS_PROXY = 'http://proxy.example.com:8080'
        NO_PROXY = 'localhost,127.0.0.1,.internal'
    }
    
    stages {
        stage('Build') {
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }
        
        stage('Test') {
            steps {
                sh 'npm test'
            }
        }
    }
}

استفاده از Jenkins Credentials برای پروکسی

برای ذخیره‌سازی امن اطلاعات اعتبار پروکسی از Jenkins Credentials Store استفاده کنید. یک اعتبار از نوع "Username with password" در Manage Jenkins → Manage Credentials ایجاد کنید، سپس از آنها در خط لوله استفاده کنید:

pipeline {
    agent any
    
    stages {
        stage('Build with Authenticated Proxy') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'proxy-credentials',
                    usernameVariable: 'PROXY_USER',
                    passwordVariable: 'PROXY_PASS'
                )]) {
                    sh '''
                        export HTTP_PROXY="http://${PROXY_USER}:${PROXY_PASS}@proxy.example.com:8080"
                        export HTTPS_PROXY="http://${PROXY_USER}:${PROXY_PASS}@proxy.example.com:8080"
                        npm install
                    '''
                }
            }
        }
    }
}

تنظیم پروکسی برای نمایندگان Jenkins

اگر از نمایندگان جداگانه Jenkins (nodes) استفاده می‌کنید، پروکسی را برای هر نماینده به طور جداگانه تنظیم کنید. در پیکربندی نماینده (Manage Jenkins → Manage Nodes → Configure) در متغیرهای محیطی اضافه کنید:

HTTP_PROXY=http://proxy.example.com:8080
HTTPS_PROXY=http://proxy.example.com:8080
NO_PROXY=localhost,127.0.0.1

پروکسی برای Docker در CI/CD

Docker بخشی جدایی‌ناپذیر از فرآیندهای مدرن CI/CD است. تنظیم پروکسی برای Docker ویژگی‌های خاص خود را دارد، زیرا باید پروکسی را هم برای Docker daemon و هم برای کانتینرها تنظیم کنید.

تنظیم پروکسی برای Docker daemon

برای اینکه Docker daemon بتواند تصاویر را از طریق پروکسی دانلود کند، یک فایل drop-in systemd ایجاد کنید. در سیستم Linux، یک دایرکتوری و فایل ایجاد کنید:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

محتوای زیر را اضافه کنید:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,.internal,docker.io"

پیکربندی را دوباره بارگذاری کرده و Docker را راه‌اندازی مجدد کنید:

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl show --property=Environment docker

پروکسی برای کانتینرها در حین ساخت

اگر کانتینرها به دسترسی از طریق پروکسی در حین ساخت (به عنوان مثال، برای نصب بسته‌ها) نیاز دارند، متغیرها را از طریق build args در Dockerfile منتقل کنید:

FROM node:18-alpine

ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY

ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
ENV NO_PROXY=${NO_PROXY}

WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .

# حذف متغیرهای پروکسی برای runtime
ENV HTTP_PROXY=
ENV HTTPS_PROXY=

CMD ["npm", "start"]

در خط لوله CI/CD، build args را منتقل کنید:

# GitHub Actions
- name: Build Docker image with proxy
  run: |
    docker build \
      --build-arg HTTP_PROXY=${{ secrets.PROXY_URL }} \
      --build-arg HTTPS_PROXY=${{ secrets.PROXY_URL }} \
      --build-arg NO_PROXY=localhost,127.0.0.1 \
      -t myapp:latest .

# GitLab CI
docker build:
  script:
    - docker build 
        --build-arg HTTP_PROXY="${PROXY_URL}"
        --build-arg HTTPS_PROXY="${PROXY_URL}"
        -t myapp:latest .

Docker Compose با پروکسی

هنگام استفاده از Docker Compose در CI/CD، پروکسی را از طریق environment در docker-compose.yml تنظیم کنید:

version: '3.8'

services:
  app:
    build:
      context: .
      args:
        - HTTP_PROXY=${HTTP_PROXY}
        - HTTPS_PROXY=${HTTPS_PROXY}
    environment:
      - HTTP_PROXY=${HTTP_PROXY}
      - HTTPS_PROXY=${HTTPS_PROXY}
      - NO_PROXY=localhost,127.0.0.1
    ports:
      - "3000:3000"

تنظیم پروکسی برای مدیران بسته

مدیران بسته اغلب به تنظیمات اضافی پروکسی نیاز دارند، به ویژه اگر از فایل‌های پیکربندی خاص خود استفاده کنند. تنظیمات را برای مدیران بسته محبوب بررسی خواهیم کرد.

NPM و Yarn

NPM می‌تواند از متغیرهای محیطی HTTP_PROXY/HTTPS_PROXY و همچنین پیکربندی خاص خود استفاده کند. برای تنظیم صریح در CI/CD:

# در GitHub Actions یا GitLab CI
- name: Configure npm proxy
  run: |
    npm config set proxy http://proxy.example.com:8080
    npm config set https-proxy http://proxy.example.com:8080
    npm config set noproxy "localhost,127.0.0.1"

- name: Install dependencies
  run: npm install

# برای Yarn
- name: Configure yarn proxy
  run: |
    yarn config set proxy http://proxy.example.com:8080
    yarn config set https-proxy http://proxy.example.com:8080

روش جایگزین — ایجاد فایل .npmrc در ریشه پروژه (اما اطلاعات اعتبار را کامیت نکنید!):

# .npmrc (در CI تولید می‌شود)
proxy=http://proxy.example.com:8080
https-proxy=http://proxy.example.com:8080
noproxy=localhost,127.0.0.1

Python pip و Poetry

Pip از متغیرهای محیطی استفاده می‌کند، اما می‌توان آن را همچنین از طریق پیکربندی تنظیم کرد:

# از طریق متغیرهای محیطی (برای CI توصیه می‌شود)
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
pip install -r requirements.txt

# یا از طریق پارامترهای pip
pip install --proxy http://proxy.example.com:8080 -r requirements.txt

# برای Poetry
poetry config http-basic.proxy http://proxy.example.com:8080
poetry install

Maven و Gradle

برای پروژه‌های Java، تنظیم پروکسی نیاز به ایجاد فایل‌های پیکربندی دارد. برای Maven، یک settings.xml در خط لوله CI ایجاد کنید:

- name: Configure Maven proxy
  run: |
    mkdir -p ~/.m2
    cat > ~/.m2/settings.xml << EOF
    <settings>
      <proxies>
        <proxy>
          <id>http-proxy</id>
          <active>true</active>
          <protocol>http</protocol>
          <host>proxy.example.com</host>
          <port>8080</port>
          <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
        </proxy>
      </proxies>
    </settings>
    EOF

- name: Build with Maven
  run: mvn clean install

برای Gradle، تنظیمات را در gradle.properties اضافه کنید:

systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
systemProp.http.nonProxyHosts=localhost|127.0.0.1

ذخیره‌سازی امن اطلاعات اعتبار پروکسی

ذخیره‌سازی اطلاعات اعتبار پروکسی یک جنبه حیاتی امنیت CI/CD است. نشت این داده‌ها می‌تواند منجر به استفاده غیرمجاز از پروکسی و خسارات مالی شود. بهترین شیوه‌ها را برای پلتفرم‌های مختلف بررسی خواهیم کرد.

GitHub Actions Secrets

GitHub Actions سه سطح از اسرار را ارائه می‌دهد: repository، environment و organization. برای اطلاعات اعتبار پروکسی از موارد زیر استفاده کنید:

  • Repository secrets — برای پروژه‌هایی که پروکسی فقط در یک مخزن نیاز است
  • Organization secrets — اگر یک پروکسی در تمام پروژه‌های سازمان استفاده شود
  • Environment secrets — برای پروکسی‌های مختلف در محیط‌های staging/production

قوانین مهم امنیتی:

  • هرگز اسرار را در لاگ‌ها نمایش ندهید: GitHub به طور خودکار آنها را ماسک می‌کند، اما بهتر است از echo اجتناب کنید
  • از اطلاعات اعتبار مختلف برای محیط‌های مختلف استفاده کنید
  • به طور منظم رمزهای عبور پروکسی را چرخش دهید (حداقل هر 90 روز)
  • دسترسی به اسرار را از طریق قوانین حفاظت از branch محدود کنید

GitLab CI/CD Variables

GitLab گزینه‌های اضافی برای محافظت از متغیرها را ارائه می‌دهد:

  • Protected — متغیر فقط در branches محافظت‌شده (main، production) در دسترس است
  • Masked — مقدار به طور خودکار در لاگ‌ها پنهان می‌شود
  • Environment scope — محدودیت استفاده برای محیط‌های خاص

پیکربندی توصیه‌شده برای اطلاعات اعتبار پروکسی:

# Settings → CI/CD → Variables
PROXY_USER: myuser (Protected: Yes, Masked: Yes)
PROXY_PASS: secret123 (Protected: Yes, Masked: Yes)
PROXY_HOST: proxy.example.com (Protected: No, Masked: No)
PROXY_PORT: 8080 (Protected: No, Masked: No)

Jenkins Credentials Store

Jenkins Credentials Store از چندین نوع ذخیره‌سازی اطلاعات اعتبار پشتیبانی می‌کند. برای پروکسی، توصیه می‌شود:

  • از "Username with password" برای نام کاربری/رمز عبور پروکسی استفاده کنید
  • برای تیم‌ها/پروژه‌های مختلف، اعتبارهای سطح Folder را تنظیم کنید
  • پلاگین Credentials Binding را برای استفاده امن در Pipeline فعال کنید
  • برای پیگیری استفاده از اطلاعات اعتبار، logging audit را تنظیم کنید

سیستم‌های خارجی مدیریت اسرار

برای محیط‌های سازمانی، توصیه می‌شود از سیستم‌های تخصصی مدیریت اسرار استفاده کنید: HashiCorp Vault، AWS Secrets Manager، Azure Key Vault یا Google Secret Manager. نمونه‌ای از ادغام با HashiCorp Vault در GitHub Actions:

- name: Import Secrets from Vault
  uses: hashicorp/vault-action@v2
  with:
    url: https://vault.example.com
    token: ${{ secrets.VAULT_TOKEN }}
    secrets: |
      secret/data/proxy proxy_user | PROXY_USER ;
      secret/data/proxy proxy_pass | PROXY_PASS ;
      secret/data/proxy proxy_host | PROXY_HOST

- name: Configure Proxy
  run: |
    export HTTP_PROXY="http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:8080"
    npm install

حل مشکلات رایج

هنگام ادغام پروکسی در CI/CD، اغلب با مشکلات مشابهی مواجه می‌شوید. رایج‌ترین مشکلات و راه‌حل‌های آنها را بررسی خواهیم کرد.

مشکل: Connection timeout هنگام بارگذاری وابستگی‌ها

علائم: npm install، pip install یا docker pull با خطای timeout پس از 30-60 ثانیه به پایان می‌رسند.

دلایل:

  • سرور پروکسی در دسترس نیست یا بارگذاری شده است
  • فرمت URL پروکسی نادرست است (http:// را در ابتدا فراموش کرده‌اید)
  • پروکسی نیاز به احراز هویت دارد، اما اطلاعات اعتبار منتقل نشده است
  • Firewall اتصال از CI/CD runner به پروکسی را مسدود می‌کند

راه‌حل:

# 1. دسترسی پروکسی را بررسی کنید
- name: Test proxy connectivity
  run: |
    curl -v -x http://proxy.example.com:8080 https://www.google.com
    echo "Proxy test completed"

# 2. زمان timeout را برای npm افزایش دهید
- name: Install with increased timeout
  run: |
    npm config set fetch-timeout 300000
    npm install

# 3. فرمت URL را بررسی کنید
- name: Debug proxy configuration
  run: |
    echo "HTTP_PROXY: $HTTP_PROXY"
    echo "HTTPS_PROXY: $HTTPS_PROXY"
    # باید باشد: http://user:pass@host:port

مشکل: SSL certificate verification failed

علائم: خطاهایی مانند "SSL certificate problem: unable to get local issuer certificate" یا "CERT_UNTRUSTED".

دلیل: پروکسی‌های شرکتی اغلب SSL inspection را انجام می‌دهند و گواهی‌ها را تغییر می‌دهند. CI/CD runner به CA شرکتی اعتماد ندارد.

راه‌حل:

# گزینه 1: گواهی CA شرکتی را اضافه کنید
- name: Install corporate CA certificate
  run: |
    sudo cp corporate-ca.crt /usr/local/share/ca-certificates/
    sudo update-ca-certificates

# گزینه 2: بررسی SSL را غیرفعال کنید (برای production توصیه نمی‌شود!)
- name: Install with SSL verification disabled
  run: |
    npm config set strict-ssl false
    npm install
  env:
    NODE_TLS_REJECT_UNAUTHORIZED: 0

# گزینه 3: استفاده از پروکسی فقط برای HTTP، HTTPS به صورت مستقیم
- name: Selective proxy usage
  run: npm install
  env:
    HTTP_PROXY: http://proxy.example.com:8080
    # HTTPS_PROXY را تنظیم نمی‌کنیم

هشدار: غیرفعال کردن بررسی گواهی‌های SSL خطر امنیتی جدی ایجاد می‌کند. از این روش فقط برای شبکه‌های داخلی شرکتی استفاده کنید و حتماً CA شرکتی را به لیست مورد اعتماد اضافه کنید.

مشکل: پروکسی برای برخی از دستورات کار می‌کند، اما برای دیگران کار نمی‌کند

علائم: npm install از طریق پروکسی کار می‌کند، اما git clone یا docker pull تنظیمات پروکسی را نادیده می‌گیرند.

دلیل: ابزارهای مختلف از مکانیزم‌های مختلفی برای تنظیم پروکسی استفاده می‌کنند. Git و Docker دارای فایل‌های پیکربندی خاص خود هستند.

راه‌حل:

# تنظیم پروکسی Git
- name: Configure Git proxy
  run: |
    git config --global http.proxy http://proxy.example.com:8080
    git config --global https.proxy http://proxy.example.com:8080

# تنظیم پروکسی Docker (به بخش Docker بالا مراجعه کنید)
# برای wget/curl
- name: Configure wget/curl
  run: |
    echo "use_proxy = on" >> ~/.wgetrc
    echo "http_proxy = http://proxy.example.com:8080" >> ~/.wgetrc
    echo "https_proxy = http://proxy.example.com:8080" >> ~/.wgetrc

مشکل: سرویس‌های داخلی هنگام فعال بودن پروکسی در دسترس نیستند

علائم: پس از تنظیم پروکسی، اتصالات به localhost، کانتینرهای Docker داخلی یا سرویس‌های شرکتی متوقف شده است.

دلیل: متغیر NO_PROXY به درستی تنظیم نشده است و تمام درخواست‌ها از طریق پروکسی می‌روند، از جمله محلی‌ها.

راه‌حل:

# تنظیم صحیح NO_PROXY
env:
  HTTP_PROXY: http://proxy.example.com:8080
  HTTPS_PROXY: http://proxy.example.com:8080
  NO_PROXY: |
    localhost,
    127.0.0.1,
    0.0.0.0,
    .internal,
    .local,
    .corp.example.com,
    docker.internal,
    host.docker.internal

# برای Docker Compose همچنین اضافه کنید
services:
  app:
    environment:
      - NO_PROXY=localhost,127.0.0.1,db,redis
      # db و redis — نام‌های سایر سرویس‌ها در compose

مشکل: اطلاعات اعتبار پروکسی در لاگ‌ها ظاهر می‌شود

علائم: در لاگ‌های CI/CD، رمزهای عبور پروکسی به صورت آشکار قابل مشاهده است.

دلیل: نمایش متغیرهای محیطی از طریق echo یا حالت verbose دستورات.

راه‌حل:

# ❌ بد - اطلاعات اعتبار در لاگ‌ها
- name: Debug proxy
  run: |
    echo "Proxy: $HTTP_PROXY"  # http://user:pass@host:port را نشان می‌دهد
    curl -v ...  # حالت verbose اطلاعات اعتبار را نشان می‌دهد

# ✅ خوب - خروجی امن
- name: Debug proxy (safe)
  run: |
    echo "Proxy host configured: $(echo $HTTP_PROXY | cut -d'@' -f2)"
    # فقط host:port را نشان می‌دهد
    
# از secrets برای ماسک کردن استفاده کنید
- name: Configure proxy
  env:
    PROXY_URL: ${{ secrets.PROXY_URL }}  # GitHub به طور خودکار ماسک می‌کند
  run: |
    export HTTP_PROXY="$PROXY_URL"

نتیجه‌گیری

ادغام پروکسی در خط لوله CI/CD یک جنبه مهم از اتوماسیون است که امنیت، تطابق با سیاست‌های شرکتی و امکان تست ویژگی‌های جغرافیایی را فراهم می‌کند. در این راهنما، روش‌های عملی برای تنظیم پروکسی برای GitHub Actions، GitLab CI، Jenkins، Docker و مدیران بسته محبوب را بررسی کردیم.

نکات کلیدی که باید هنگام تنظیم پروکسی در CI/CD به خاطر بسپارید: همیشه از ذخیره‌سازی امن اطلاعات اعتبار از طریق مکانیزم‌های داخلی اسرار پلتفرم استفاده کنید، NO_PROXY را به درستی برای استثنای سرویس‌های محلی و داخلی تنظیم کنید، اتصال به پروکسی را قبل از عملیات اصلی تست کنید و لاگ‌ها را برای نشت داده‌های حساس نظارت کنید. برای محیط‌های production حساس، توصیه می‌شود از سیستم‌های خارجی مدیریت اسرار مانند HashiCorp Vault استفاده کنید.

انتخاب نوع پروکسی بستگی به وظایف شما دارد: برای شبکه‌های شرکتی معمولاً از پروکسی‌های HTTP/HTTPS موجود استفاده می‌شود، برای تست ویژگی‌های جغرافیایی پروکسی‌های مسکونی با IP از کشورهای مورد نیاز مناسب هستند و برای بارگذاری سریع وابستگی‌ها می‌توان از پروکسی‌های دیتا سنتر استفاده کرد. مهم است که زمان کارکرد سرورهای پروکسی را بالا نگه دارید، زیرا عدم دسترسی آنها منجر به سقوط تمام ساخت‌ها و مسدود شدن کار تیم توسعه خواهد شد.

در صورت بروز مشکلات، با بررسی دسترسی پایه پروکسی از طریق curl یا wget شروع کنید، سپس فرمت URL و اطلاعات اعتبار را بررسی کنید و تنها پس از آن به تنظیمات خاص ابزارهای خاص بروید. بیشتر مشکلات با تنظیم صحیح متغیرهای محیطی HTTP_PROXY، HTTPS_PROXY و NO_PROXY حل می‌شود.

```