Apakah pipeline Anda gagal dengan kesalahan 403 Forbidden atau Connection refused saat mencoba mengakses API eksternal atau mengunduh dependensi? Kemungkinan besar, masalahnya adalah alamat IP server CI/CD Anda diblokir di sisi sumber daya. Proxy menyelesaikan masalah ini: Anda mengarahkan lalu lintas melalui IP yang diperlukan dan pipeline berjalan tanpa gangguan. Dalam artikel ini ā instruksi langkah demi langkah untuk GitHub Actions, GitLab CI, dan Jenkins.
Mengapa proxy dalam CI/CD: skenario nyata
Pipeline CI/CD berjalan di server dengan alamat IP tetap ā runner cloud GitHub, GitLab, atau agen Jenkins milik sendiri. IP ini dikenal dengan baik, dan banyak layanan eksternal baik memblokirnya atau membatasi jumlah permintaan. Berikut adalah situasi konkret di mana proxy sangat diperlukan:
Akses ke sumber daya yang dibatasi geo
Banyak registri npm perusahaan, repositori Maven, dan API internal hanya dapat diakses dari negara atau rentang IP tertentu. Jika runner GitHub Actions Anda berada di wilayah yang diblokir di tingkat firewall layanan target, pipeline tidak akan dapat mengunduh dependensi atau mengirim data. Proxy dengan geolokasi yang diperlukan menyelesaikan masalah ini tanpa mengubah infrastruktur.
Pembatasan laju dan pemblokiran IP
Runner cloud GitHub Actions menggunakan IP dari rentang Microsoft Azure. Banyak API publik mengetahui rentang ini dan menerapkan batasan ketat ā atau memblokir sepenuhnya. Misalnya, pengambilan data publik, permintaan ke API pihak ketiga selama pengujian, mengunduh distribusi dari CDN terbatas ā semua ini sering gagal karena IP dari runner cloud. Rotasi melalui proxy memungkinkan untuk menghindari pembatasan laju.
Pengujian integrasi dengan situs nyata
Jika pengujian integrasi Anda mengakses situs web nyata atau marketplace (Wildberries, Ozon, Avito, Amazon), situs-situs ini melihat IP yang sama dari runner setiap kali dijalankan dan dengan cepat memblokirnya. Proxy dengan rotasi IP memungkinkan pengujian berjalan stabil tanpa CAPTCHA dan pemblokiran.
Akses ke sumber daya internal perusahaan
Jaringan perusahaan sering kali tertutup dari dunia luar. Jika pipeline harus melakukan deploy ke server internal atau mengakses API tertutup, proxy (atau terowongan SOCKS5) di dalam jaringan perusahaan menjadi jembatan antara runner cloud dan infrastruktur tertutup.
Pengujian integrasi iklan dan pemasaran
Tim yang bekerja dengan Facebook Ads API, TikTok Ads API, atau Google Ads API sering kali mengotomatiskan pembuatan kampanye melalui CI/CD. Platform ini memiliki aturan ketat terkait IP: permintaan dari IP pusat data dapat diblokir atau memerlukan verifikasi tambahan. Proxy residensial dalam pipeline membuat permintaan terlihat seperti lalu lintas pengguna biasa.
Jenis proxy mana yang harus dipilih untuk pipeline
Pemilihan jenis proxy tergantung pada tugas. Untuk pipeline CI/CD, ada tiga opsi yang relevan ā masing-masing memiliki kelebihan dan batasan:
| Jenis proxy | Kecepatan | Kepercayaan situs | Terbaik untuk |
|---|---|---|---|
| Proxy pusat data | Sangat tinggi | Sedang | Mengunduh dependensi, repositori internal, API cepat tanpa pemeriksaan ketat |
| Proxy residensial | Sedang | Tinggi | Pengujian integrasi dengan situs nyata, API iklan (Facebook, TikTok), marketplace |
| Proxy seluler | Sedang | Maksimal | Pengujian API seluler, bekerja dengan platform dengan perlindungan anti-bot maksimum |
Aturan praktis:
Jika tugasnya adalah mengunduh paket atau mengakses layanan internal, gunakan proxy pusat data ā mereka cepat dan lebih murah. Jika tugasnya adalah pengujian di situs nyata atau bekerja dengan platform iklan ā gunakan proxy residensial. Protokol SOCKS5 lebih disukai daripada HTTP/HTTPS, karena lebih transparan dalam bekerja dengan port dan protokol non-standar.
Mengatur proxy di GitHub Actions
GitHub Actions adalah alat CI/CD yang paling populer saat ini. Pengaturan proxy di sini dilakukan melalui variabel lingkungan dan rahasia repositori. Mari kita bahas langkah demi langkah.
Langkah 1: Tambahkan data proxy ke rahasia repositori
Jangan pernah menuliskan login dan kata sandi proxy langsung di file YAML workflow. Gunakan Rahasia GitHub:
- Buka repositori ā Settings ā Secrets and variables ā Actions
- Klik New repository secret
- Buat rahasia
PROXY_URLdengan nilai sepertihttp://user:[email protected]:port
Langkah 2: Gunakan variabel lingkungan dalam workflow
Kebanyakan alat (curl, wget, npm, pip, Maven) secara otomatis mengambil variabel lingkungan standar HTTP_PROXY, HTTPS_PROXY, dan NO_PROXY. Contoh 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
Langkah 3: Proxy SOCKS5 di GitHub Actions
Jika Anda menggunakan SOCKS5 (direkomendasikan untuk sebagian besar tugas), variabel lingkungan standar tidak cukup ā diperlukan terowongan lokal. Gunakan utilitas proxychains atau atur 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
Mengatur proxy untuk alat tertentu
Beberapa alat mengabaikan variabel sistem dan memerlukan pengaturan terpisah:
| Alat | Cara mengatur proxy |
|---|---|
| npm / yarn | npm config set proxy http://user:pass@host:port |
| pip (Python) | pip install --proxy http://user:pass@host:port package |
| Maven | Melalui settings.xml bagian <proxies> |
| Gradle | systemProp.https.proxyHost=host di gradle.properties |
| Git | git config --global http.proxy http://user:pass@host:port |
| Docker build | --build-arg HTTP_PROXY=http://user:pass@host:port |
Mengatur proxy di GitLab CI
GitLab CI menyediakan beberapa tingkat untuk menetapkan variabel lingkungan: di tingkat proyek, grup, atau instance. Ini membuat pengelolaan proxy lebih fleksibel dibandingkan dengan GitHub Actions.
Langkah 1: Tambahkan variabel ke GitLab CI/CD Variables
- Buka proyek ā Settings ā CI/CD ā bagian Variables
- Klik Add variable
- Tambahkan variabel
PROXY_URLdengan tipe Masked (menyembunyikan nilai di log) - Nilai:
http://user:[email protected]:port
Langkah 2: Gunakan variabel di .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 hanya untuk pekerjaan tertentu
Jika proxy tidak diperlukan di semua tempat (misalnya, hanya untuk pengujian integrasi, tetapi tidak untuk build), tetapkan variabel di tingkat pekerjaan tertentu, bukan secara global:
integration_tests:
stage: test
variables:
HTTP_PROXY: $PROXY_URL
HTTPS_PROXY: $PROXY_URL
script:
- pytest tests/integration/
build:
stage: build
# Di sini proxy tidak ditetapkan ā koneksi langsung
script:
- npm ci && npm run build
GitLab Runner yang di-host sendiri: mengatur proxy di tingkat runner
Jika Anda menggunakan GitLab Runner sendiri, Anda dapat menetapkan proxy secara global dalam konfigurasi runner. Buka file /etc/gitlab-runner/config.toml dan tambahkan di bagian [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"
]
Ini nyaman ketika semua pipeline di runner ini harus menggunakan proxy ā tidak perlu menuliskannya di setiap .gitlab-ci.yml.
Mengatur proxy di Jenkins
Jenkins adalah yang paling fleksibel dari ketiga alat, tetapi juga yang paling sulit untuk diatur. Proxy di sini dapat ditetapkan di beberapa tingkat: secara global untuk seluruh Jenkins, untuk Pipeline tertentu, atau untuk langkah tertentu.
Metode 1: Pengaturan proxy global di Jenkins
- Buka Manage Jenkins ā System
- Cari bagian HTTP Proxy Configuration
- Isi kolom: Server, Port, Username, Password
- Di kolom No Proxy Host sebutkan alamat internal dengan koma
- Klik Test URL untuk memeriksa dan simpan
Pengaturan ini mempengaruhi pengunduhan plugin dan pembaruan Jenkins itu sendiri, tetapi tidak secara otomatis diteruskan ke lingkungan eksekusi pipeline. Untuk pipeline, konfigurasi terpisah diperlukan.
Metode 2: Proxy dalam Declarative Pipeline melalui 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}"
'''
}
}
}
}
Langkah 3: Tambahkan kredensial proxy di Jenkins Credentials
- Buka Manage Jenkins ā Credentials ā System ā Global credentials
- Klik Add Credentials
- Tipe: Secret text
- ID:
proxy-url-credential - Secret:
http://user:[email protected]:port
Metode 3: Proxy melalui parameter JVM untuk proyek Java
Jika pipeline Anda membangun proyek Java (Maven, Gradle), variabel lingkungan sistem mungkin tidak berfungsi ā JVM menggunakan properti sistemnya sendiri. Tambahkan mereka di 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 di dalam kontainer Docker dalam pipeline
Sebagian besar pipeline CI/CD modern menjalankan langkah-langkah di dalam kontainer Docker. Mengalihkan proxy ke dalam kontainer adalah tugas terpisah yang dapat diselesaikan dengan beberapa cara.
Mengalihkan proxy melalui --build-arg saat membangun image
Jika proxy hanya diperlukan selama proses pembuatan image Docker (misalnya, untuk menginstal paket di dalam Dockerfile), gunakan argumen build:
# Di .github/workflows/build.yml atau .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 .
# Di 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
ā ļø Penting: keamanan saat membangun image
Variabel yang ditetapkan melalui ARG dan ENV di Dockerfile disimpan dalam metadata image dan terlihat melalui docker inspect. Jika proxy memerlukan otentikasi, pastikan image yang dihasilkan tidak dipublikasikan ke registri publik ā jika tidak, kredensial akan tersedia untuk umum.
Pengaturan global untuk Docker daemon untuk proxy
Di runner yang di-host sendiri, Anda dapat mengatur proxy untuk seluruh Docker daemon ā maka semua kontainer secara otomatis akan mendapatkan proxy tanpa perubahan di 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"
# Terapkan perubahan:
# systemctl daemon-reload
# systemctl restart docker
Keamanan: cara menyimpan kredensial proxy
Kredensial proxy adalah rahasia yang sama seperti kunci API atau kata sandi basis data. Kebocoran mereka berarti siapa pun dapat menggunakan proxy Anda atas nama Anda. Berikut adalah aturan untuk penyimpanan yang aman:
Checklist keamanan
- ā Jangan pernah menuliskan login/kata sandi proxy langsung di file YAML pipeline
- ā Gunakan Masked variables di GitLab dan Encrypted secrets di GitHub ā mereka disembunyikan di log
- ā Di Jenkins, gunakan tipe Secret text atau Username with password di Credentials Store
- ā
Tambahkan
NO_PROXYuntuk alamat internal ā lalu lintas ke infrastruktur Anda sendiri tidak boleh melalui proxy - ā Secara teratur rotasi kata sandi proxy ā perbarui hanya di penyimpanan rahasia, tanpa mengubah kode pipeline
- ā Gunakan otentikasi IP proxy (whitelist IP runner) di tempat yang didukung ā ini lebih aman daripada kata sandi
- ā Periksa log proxy untuk aktivitas yang tidak biasa
Format URL proxy: apa yang harus dimasukkan ke mana
| Protokol | Format URL | Kapan digunakan |
|---|---|---|
| HTTP | http://user:pass@host:port |
Sebagian besar alat, npm, pip, curl |
| HTTPS | https://user:pass@host:port |
Koneksi terenkripsi dengan server proxy |
| SOCKS5 | socks5://user:pass@host:port |
Port non-standar, lalu lintas UDP, kompatibilitas maksimum |
Kesalahan umum dan cara memperbaikinya
Bahkan setelah pengaturan yang benar, masalah dapat muncul. Berikut adalah kesalahan yang paling umum dan solusinya:
Kesalahan: Proxy Authentication Required (407)
Penyebab: Login atau kata sandi yang salah, atau mereka tidak diteruskan oleh alat.
Solusi: Periksa format URL ā karakter khusus dalam kata sandi perlu di-URL-encode. Misalnya, p@ss#word ā p%40ss%23word. Juga pastikan bahwa variabel lingkungan benar-benar diteruskan ke langkah ā cetak melalui echo $HTTP_PROXY (beberapa karakter pertama) untuk memeriksa.
Kesalahan: SSL Certificate Verification Failed
Penyebab: Proxy melakukan inspeksi SSL (MITM) dan mengganti sertifikat. Klien tidak mempercayai sertifikat proxy.
Solusi: Tambahkan sertifikat root proxy ke dalam daftar yang dipercaya. Untuk curl: --cacert /path/to/proxy-ca.crt. Untuk npm: npm config set cafile /path/to/proxy-ca.crt. Atau gunakan proxy tanpa inspeksi SSL ā ini lebih disukai untuk CI/CD.
Kesalahan: Connection Timeout melalui proxy
Penyebab: Server proxy tidak dapat diakses dari IP runner, atau port diblokir oleh firewall.
Solusi: Periksa ketersediaan proxy dengan perintah nc -zv proxy.host port di langkah pipeline. Pastikan IP runner ditambahkan ke whitelist penyedia proxy (jika menggunakan otentikasi IP). Untuk runner cloud GitHub Actions, rentang IP dipublikasikan di meta.github.com.
Kesalahan: Alat mengabaikan variabel HTTP_PROXY
Penyebab: Beberapa alat (terutama yang berbasis Java) tidak membaca variabel lingkungan sistem.
Solusi: Gunakan pengaturan proxy asli untuk alat tertentu (lihat tabel di atas). Untuk Java, tambahkan properti JVM melalui JAVA_OPTS. Untuk curl, gunakan flag -x http://proxy:port secara eksplisit.
Kesalahan: Layanan internal juga melalui proxy
Penyebab: Variabel NO_PROXY tidak ditetapkan atau ditetapkan dengan salah.
Solusi: Sebutkan semua domain dan IP internal dalam NO_PROXY. Gunakan wildcard untuk domain: NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,.internal.company.com. Perhatikan: beberapa alat mendukung notasi CIDR, yang lain hanya mendukung domain yang tepat.
Kesimpulan
Mengatur proxy dalam pipeline CI/CD bukanlah tugas sekali saja, tetapi bagian dari arsitektur otomatisasi yang tepat. Kami telah membahas tiga alat utama: GitHub Actions (melalui Secrets dan variabel lingkungan), GitLab CI (melalui Variables dengan pemaskeran), dan Jenkins (melalui Credentials Store dan Declarative Pipeline). Prinsip kunci sama untuk semua: jangan pernah menyimpan kredensial dalam kode, gunakan NO_PROXY untuk alamat internal, dan pilih jenis proxy sesuai dengan tugas tertentu.
Memilih jenis proxy yang tepat sangat penting untuk stabilitas pipeline. Untuk mengunduh dependensi dan mengakses API standar, cukup gunakan proxy pusat data yang cepat. Namun, jika pipeline Anda melakukan pengujian integrasi di situs nyata, bekerja dengan platform iklan (Facebook Ads API, TikTok Ads API), atau mengakses marketplace ā gunakan proxy residensial: IP mereka dianggap sebagai lalu lintas pengguna biasa dan sangat jarang terkena pemblokiran atau pembatasan laju.
Aturan utama: uji proxy sebagai langkah terpisah di awal pipeline ā ini akan memungkinkan Anda untuk dengan cepat mendiagnosis masalah dan tidak membuang waktu untuk mencari kesalahan di akhir build yang panjang. Tambahkan langkah curl -v https://api.ipify.org segera setelah pengaturan proxy ā ini akan menunjukkan IP dari mana permintaan dikirim dan mengkonfirmasi bahwa pemrosesan proxy berfungsi dengan benar.