Lấy IP runner trong CI/CD GitHub Actions bằng ip.tnd.vn

Chia sẻ bài viết

Mục lục
Lấy IP runner trong CI/CD GitHub Actions bằng ip.tnd.vn
Lấy IP runner trong CI/CD GitHub Actions bằng ip.tnd.vn
Runner CI đổi IP mỗi lần chạy - lấy đúng IP để whitelist động khi deploy.

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 whitelist

Lư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.

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 IPv4

Tham 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 Facebook

Hạ 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.