본문 바로가기
컴퓨터 활용(한글, 오피스 등)/기타

"jenkins failed to connect or change directory, jenkins.plugins.publish_over.BapPublisherException on: Failed to SFTP channel. Message [java.io.IOException: Pipe closed]" 오류 해결 방법은?

by 3604 2025. 10. 1.
728x90
"jenkins failed to connect or change directory, jenkins.plugins.publish_over.BapPublisherException on: Failed to SFTP channel. Message [java.io.IOException: Pipe closed]" 오류 해결 방법은?
 
 
에러 핵심
Jenkins Publish Over SSH 플러그인이
SFTP 채널을 열어야 하는 시점(connect or change directory)에
대상 서버가 세션/파이프를 먼저 닫아 버려
Pipe closed 가 떨어집니다.
원인 90 % 는 계정·권한·셸·SFTP 서브시스템 문제, 10 % 는 네트워크/버그입니다.

  1. Jenkins 쪽(발신) – 무조건 먼저
    1. credential 재확인
      • Jenkins > Manage > Manage Credentials
        Key 방식만 남기고 password/keyboard-interactive 체크 해제
      • 개인키는 OpenSSH PKCS#8 (-----BEGIN OPENSSH PRIVATE KEY-----)
        Putty(.ppk) 변환·수작업 업로드 금지
    2. Publish Over SSH > 고급
      • “Verbose output” 체크 → 콘솔에서 sftp> ... 까지 보이는지 확인
      • “Timeout(ms)” 300 000(5분) 이상으로 증가
      • “Retries” 0 으로 두어 재시도 없이 한 번만 연결
    3. Pipeline 을 쓴다면
      groovy
      sshPublisher(publishers: [sshPublisherDesc(
          configName: 'prod',
          transfers: [sshTransfer(sourceFiles: 'target/*.jar',
                                  removePrefix: 'target',
                                  remoteDirectory: '/opt/app')],
          usePromotionTimestamp: false,
          useWorkspaceInPromotion: false,
          verbose: true)])
  2. 대상 서버(수신) 필수 체크
    bash
    # 1. 계정 홈 존재 & 권한
    grep jenkins /etc/passwd
    ls -ld /home/jenkins /home/jenkins/.ssh
    # 2. SFTP 서브시스템 살아 있는가
    grep -i sftp /etc/ssh/sshd_config
    #   Subsystem sftp /usr/lib/openssh/sftp-server   ← 주석 풀렸는지
    # 3. 로그인 셸이 /bin/bash (nologin, /bin/false 이면 SFTP 안 됨)
    chsh -s /bin/bash jenkins
    # 4. 홈 디렉터리 소유자/권한
    chown jenkins:jenkins /home/jenkins
    chmod 700 /home/jenkins
    chmod 600 /home/jenkins/.ssh/authorized_keys
    • /opt, /data 등 업로드 경로
      jenkins 계정이 쓰기 가능한지 반드시 확인
      (sudo -u jenkins touch /opt/app/test)
  3. 서버 방화벽/보안 모듈
    • fail2ban, denyhosts 에 IP 가 찍혀 있으면 연결 직후 끊김
    • /var/log/secure, /var/log/auth.log 마지막 줄 확인 → “Connection closed”, “Invalid user”, “Broken pipe” 등 있으면 차단 해제
  4. SFTP 서브시스템 버그 회피 (OpenSSH 8.8 p1 이상) Jenkins Publish Over SSH 1.24 이하는 rsa-sha2-512 를 못 받음
    → 대상 서버 /etc/ssh/sshd_config 에 임시로 추가
    PubkeyAcceptedAlgorithms +ssh-rsa
    HostkeyAlgorithms +ssh-rsa
    후 systemctl restart sshd
    (보안상 권장 X , 장기적으로는 Jenkins-플러그인·Java-버전 업그레이드)
  5. 네트워크/MTU/방화벽
    • Jenkins 에이전트 ↔ 대상 22 포트 단일 세션에서
      df -h 정도 출력하면 끊기면 MTU 문제일 수 있음
      → Jenkins 쪽 SSH config 에
      Host target
          IPQoS 0x00
          ServerAliveInterval 60
  6. 우회(권장) Publish Over SSH 가 예전 플러그인이라 SFTP 버그 많음
    Pipeline 에서는 sshPublisher 대신
    groovy
    sh 'scp -i ~/.ssh/id_rsa target/*.jar jenkins@target:/opt/app/'
    또는
    groovy
    sshagent(['jenkins-key']) {
        sh 'sftp -b - jenkins@target <<< "cd /opt/app\n put target/*.jar\n bye"'
    }
    로 바꾸면 99 % 해결

요약
“Pipe closed” 는 서버가 SFTP 채널을 열기 전에 세션을 끊었다는 뜻.
  1. Jenkins credential → 키 1개, verbose on
  2. 대상 계정 홈·권한·쓰기 경로·셸·Subsystem-sftp 확인
  3. 방화벽·fail2ban·OpenSSH 8.8 알고리즘 불일치 제거
  4. 여전히 실패하면 pipeline 에서 scp or sftp 직접 호출으로 우회
728x90