본문 바로가기

개발/trouble shooting

윈도우 환경에서 slack 알림 전송 시 invalid payload 에러 해결

개요


현재 진행중인 프로젝트의 배포 순서는 아래와 같습니다.

 

1. yarn version --prepatch를 실행해 프로젝트의 버전을 증가시킵니다.

2. serverless 환경에 프로젝트를 배포합니다.

3. curl 명령어를 이용해 slack 웹 훅 URL 로 프로젝트 배포 결과를 출력합니다.

 

 

 

문제 상황


1번과 2번 과정은 문제없이 진행되었지만, 3번 과정에서 Slack에 배포 결과가 전송되지 않는 문제가 발생했습니다.

 

특이하게도, 팀원분의 PC에서 배포할 때는 알림이 정상적으로 전송되었지만, 제 PC에서는 Invalid payload 에러가 발생하며 알림이 전송되지 않았습니다.

 

이 문제의 원인은 사용한 터미널 쉘에 있었습니다.

 

저는 Windows OS를 사용하여 PowerShell 터미널에서 스크립트를 실행했지만, 팀원분은 Mac OS에서 bash 터미널 쉘 환경에서 스크립트를 실행하셨습니다.

 

Bash와 PowerShell은 각각 문자열 처리 방식이 달랐고, 스크립트는 Bash 기반으로 작성되었기 때문에 문자열을 처리하는 과정에서 문제가 발생한 것이었습니다.

 

 

 

 

powershell, bash 문자열 처리 방식 차이점


Slack 알림 Script

 "curl -X POST -H 'Content-type: application/json' --data \"{\\\"text\\\":' \\`${npm_package_version}\\` 배포가 완료됐습니다\\'}\" [slack 웹훅 url]"

 

알림 전송이 안되게 만든 문자열

\\`${npm_package_version}\\``

 

전송이 안된 이유는 두 가지 입니다.

 

1. npm_package_version 출력 방식의 차이 

  • Bash 셸 (Linux, macOS): $npm_package_version 형식을 사용합니다.
  • Windows (cmd.exe, PowerShell): %npm_package_version% 형식을 사용합니다.

Windows와 Mac 간에 npm_package_version 환경 변수를 참조하는 방식이 다르기 때문에, 서로 다른 운영체제에서 동일한 스크립트가 정상적으로 동작하지 않을 수 있습니다.

 

2. 백틱(`) 사용 방식의 차이

  • Mac에서 백틱(`)은 명령어 치환을 의미합니다.
    • 따라서 백틱을 사용할 때 \\와 같이 escape 문자를 함께 붙여 사용해야합니다.
  • Windows에서 백틱(`)은 escape 문자를 의미합니다.
    • 따라서 백틱(`)을 이스케이프하면, PowerShell은 이를 정상적인 JSON 문자열로 인식하지 않고, 특수 문자로 인식하여 오류가 발생하거나 잘못된 요청을 생성합니다.

 

이 두가지 이유로 인해 Windows PowerShell에서 알림 전송이 안된 것입니다.

 

 

 

 

문제 해결


아래의 세가지 방식으로 문제를 해결할 수 있습니다.

 

1. script 변경

2. 알림 전송 객체 사용

3. WSL 사용

 

각 방식마다 장단점이 있어 하나씩 설명해드리겠습니다.

 

 

 

 

해결방법(1) - script 변경


윈도우 환경에서 실행할 때 script를 변경한 후 실행하는 방식이 있습니다.

 

기존 $npm_package_version 명령어를 %npm_package_version%으로 변경하고, 백틱(`)을 escape 하지 않으면 정상적으로 알림이 전송됩니다.

 

 "curl -X POST -H 'Content-type: application/json' --data \"{\\\"text\\\":' `%npm_package_version%` 배포가 완료됐습니다'}\" [slack 웹훅 url]"

 

 

 

 

해결방법(2) - 알림 전송 객체 사용


첫 번째 방법은 OS가 다를 경우, 매번 코드를 변경해야하는 불편함이 있습니다.

 

이를 해결하기 위해 두 번째 방법은 curl이 아닌 axios로 알림을 전송하는 것 입니다.

 

아래와 같이 알림을 전송하는 객체를 만들고

 

 

script문에서 해당 객체를 호출하는 방식으로 동작합니다,

 

 

이렇게되면 OS별로 코드를 변경하지 않아도 되어 관리 포인트를 줄일 수 있습니다.

 

 

 

 

해결방법(3) - WSL 사용


WSL(Windows Subsystem for Linux)은 Windows 운영 체제에서 Linux 배포판을 네이티브로 실행할 수 있게 해주는 호환 계층입니다.

 

이를 통해 Windows 사용자들이 가상 머신(VM)이나 듀얼 부팅 없이도 Linux 환경을 Windows 내에서 직접 사용할 수 있습니다.

 

그러므로, 터미널 쉘을 powershell이 아닌 WSL을 이용하면 bash 문자열 처리가 가능해집니다.