

GitHub Actions runner dùng IP chia sẻ và đổi liên tục giữa các lần chạy. Khi pipeline cần SSH vào server, kết nối database, hay gọi API có whitelist IP, bạn phải biết IP runner ngay trong job để mở cổng tạm rồi đóng lại. ip.tnd.vn làm việc đó gọn trong một dòng. Bài này hướng dẫn pattern whitelist động an toàn cho CI/CD.
Lấy IP runner trong một step
- name: Lay IP runner
id: ip
run: echo "addr=$(curl -s https://ip.tnd.vn)" >> "$GITHUB_OUTPUT"
- name: Dung IP o step sau
run: echo "Runner IP la ${{ steps.ip.outputs.addr }}"Output addr giờ chứa IP runner, dùng lại được ở mọi step phía sau trong job.
Pattern: mở whitelist trước, đóng sau khi deploy
Đây là cách an toàn để deploy qua firewall có whitelist. Mở cổng cho IP runner ngay đầu job, deploy, rồi luôn đóng lại ở cuối kể cả khi lỗi:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lay IP runner
id: ip
run: echo "addr=$(curl -s https://ip.tnd.vn)" >> "$GITHUB_OUTPUT"
- name: Mo firewall cho IP runner (Cloudflare API)
run: |
curl -s -X POST \
"https://api.cloudflare.com/client/v4/zones/$ZONE/firewall/access_rules/rules" \
-H "Authorization: Bearer ${{ secrets.CF_TOKEN }}" \
-H "Content-Type: application/json" \
--data "{\"mode\":\"whitelist\",\"configuration\":{\"target\":\"ip\",\"value\":\"${{ steps.ip.outputs.addr }}\"}}"
- name: Deploy qua SSH
run: |
ssh -o StrictHostKeyChecking=no user@server "cd /app && git pull && ./deploy.sh"
- name: Dong firewall (luon chay)
if: always()
run: echo "Thu hoi rule whitelist cho ${{ steps.ip.outputs.addr }}"Điểm mấu chốt là if: always() ở step đóng, để cổng không bị bỏ ngỏ khi deploy fail.
Whitelist tạm trên UFW của server đích
- name: Mo SSH cho runner
run: |
RUNNER_IP="${{ steps.ip.outputs.addr }}"
ssh admin@server "sudo ufw allow from $RUNNER_IP to any port 22"
# ... deploy ...
- name: Dong SSH cho runner
if: always()
run: |
RUNNER_IP="${{ steps.ip.outputs.addr }}"
ssh admin@server "sudo ufw delete allow from $RUNNER_IP to any port 22"Dùng trong GitLab CI
deploy:
script:
- export RUNNER_IP=$(curl -s https://ip.tnd.vn)
- echo "Runner IP: $RUNNER_IP"
- # mo whitelist, deploy, dong whitelistLưu ý bảo mật
- Luôn đóng rule whitelist sau khi xong, dùng if: always() để không sót khi job fail.
- Để token/khóa SSH trong GitHub Secrets, không bao giờ hardcode vào YAML.
- Đặt curl -s --max-time 5 để step lấy IP không treo pipeline khi mạng lỗi.
- Với self-hosted runner có IP tĩnh, bạn whitelist một lần là xong, không cần pattern động này.
Loạt bài hướng dẫn ip.tnd.vn
Server đích cho pipeline CI/CD của bạn
Cloud VPS TND có IP tĩnh sạch, SSD NVMe, đặt tại Việt Nam, hợp làm server deploy hoặc self-hosted runner cho GitHub Actions. Từ 199k/tháng, dựng trong vài phút và whitelist IP bằng ip.tnd.vn.
Xem Cloud VPS Xem Proxy IPv4Tham gia nhóm Vibe Coder Việt Nam
Bạn đang code cùng Claude, Codex, Gemini, Cursor hay Windsurf? Vào nhóm Facebook để trao đổi tip, debug giúp nhau, chia sẻ workflow vibe coding, và update tool mới mỗi tuần. Cộng đồng dev tự host stack đang grow nhanh tại Việt Nam.
Join nhóm trên FacebookHạ tầng cho dev: truy vấn SQL, PHP dựng trang, build Next.js hay đóng gói app iOS và Android đều nghẽn ở tốc độ đọc ghi ổ đĩa và xung nhịp CPU. VPS NVMe Enterprise RAID 10, IOPS đọc ghi cao dùng ổ Enterprise U.2 NVMe chạy RAID 10, IOPS đọc ghi gấp 5 đến 7 lần SATA SSD, backup hàng tuần, bàn giao trong 5 phút.



