πŸ”” 4. Google Chat을 μ΄μš©ν•΄ 배포 μ•Œλ¦Ό λ°›κΈ°: μ‰˜ 슀크립트둜 κ°„λ‹¨ν•˜κ²Œ μ„€μ •ν•˜λŠ” 방법

@Hyunjoo Β· March 23, 2023 Β· 11 min read

μ—¬λŸ¬λΆ„μ΄ μž‘μ—…ν•œ ν”„λ‘œμ νŠΈλ₯Ό λ°°ν¬ν•˜λŠ” κ³Όμ •μ—μ„œ λ‹€λ₯Έ νŒ€μ›λ“€μ—κ²Œ μ•Œλ¦¬κ³  μ‹Άλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”? λ‹€μ–‘ν•œ λ©”μ‹œμ§€λ₯Ό ν†΅ν•˜μ—¬ μ•Œλ¦Όμ„ 보낼 μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.
μ œκ°€ λ‹€λ‹ˆλŠ” νšŒμ‚¬κ°€ Slack(μŠ¬λž™)을 μ΄μš©ν•˜λ‹€κ°€ μ΄μ œλŠ” Google Chat(ꡬ글 μ±—)을 μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜λŠ” κ³Όμ •μ—μ„œ μ•Œκ²Œλœ μ‰˜ 슀크립트λ₯Ό μ΄μš©ν•΄ 배포 μ•Œλ¦Όμ„ λ³΄λ‚΄λŠ” 방법을 μ†Œκ°œν•˜κ² μŠ΅λ‹ˆλ‹€.

1. Google Chat Webhook URL μ„€μ •ν•˜κΈ°

Google Chatμ—μ„œ μ•Œλ¦Όμ„ λ°›μœΌλ €λ©΄ λ¨Όμ € webhook URL을 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. Webhook URL은 Google Chatμ—μ„œ μ œκ³΅ν•˜λŠ” κ³ μœ ν•œ μ£Όμ†Œλ‘œ, 이 μ£Όμ†Œλ‘œ λ©”μ‹œμ§€λ₯Ό 보내면 Google Chat에 μ•Œλ¦Όμ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. Google Chatμ—μ„œ μƒˆλ‘œμš΄ webhook URL을 μƒμ„±ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. Google Chat의 λŒ€ν™”λ°©μ— λ“€μ–΄κ°‘λ‹ˆλ‹€.
  2. μ±„νŒ…λ°© 쒌츑 상단에 μžˆλŠ” μ„€μ •μ—μ„œ β€œμ•± 및 톡합”을 μ„ νƒν•©λ‹ˆλ‹€. sc001
  3. νŒμ—…μ°½μ΄ λ‚˜μ˜€λ©΄ "μ›Ήν›… μΆ”κ°€"λ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€. sc002
  4. μ±„νŒ…λ°©μ— λ‚˜μ˜€κ²Œ 될 μ›Ήν›… 이름과 μ•„μ΄μ½˜μ„ μ„€μ •ν•œ ν›„ "μ €μž₯"을 ν΄λ¦­ν•©λ‹ˆλ‹€. μ €λŠ” TESTλΌλŠ” 이름을 μ‚¬μš©ν•΄μ„œ μ‚¬μš©ν•  μ˜ˆμ •μž…λ‹ˆλ‹€. sc003
  5. μ΄λ ‡κ²Œ μƒμ„±λœ webhook URL을 λ³΅μ‚¬ν•©λ‹ˆλ‹€. sc004

    μ£Όμ†ŒλŠ” https://chat.googleapis.com/v1/spaces/μŠ€νŽ˜μ΄μŠ€μ΄λ¦„/messages?key=yyyyy&token=zzzzz 와 μœ μ‚¬ν•œ ν˜•μ‹μ„ κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. μ›Ήν›…μ˜ 이름, μ•„μ΄μ½˜μ„ μˆ˜μ •ν•˜κ±°λ‚˜ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    ν™”λ©΄μ˜ μ£Όμ†Œμ™€ μ—¬λŸ¬λΆ„μ˜ μ£Όμ†Œκ°€ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

  6. webhook을 μƒμ„±ν•˜λ©΄ μ±„νŒ…λ°©μ— μ•Œλ¦Όμ΄ κ°€κ²Œ λ©λ‹ˆλ‹€. sc006

2. μ‰˜ 슀크립트 μž‘μ„±ν•˜κΈ°

  • λ³΅μ‚¬ν•œ webhook URL을 μ‚¬μš©ν•˜μ—¬ μ‰˜ 슀크립트λ₯Ό μž‘μ„±ν•΄ λ΄…μ‹œλ‹€. μ‰˜ μŠ€ν¬λ¦½νŠΈλŠ” κ°„λ‹¨ν•œ μ‰˜ λͺ…λ Ήμ–΄λ₯Ό 톡해 운영 μ²΄μ œμ— λͺ…령을 λ‚΄λ¦¬λŠ” μŠ€ν¬λ¦½νŠΈμž…λ‹ˆλ‹€.
    μΆ”κ°€μ μœΌλ‘œ μ‚¬μš©μžμ˜ 이름을 λ„£λŠ” κΈ°λŠ₯κΉŒμ§€ μΆ”κ°€ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

    #!/bin/bash
    
    # μ‚¬μš©μž 이름을 κ°€μ Έμ˜΅λ‹ˆλ‹€.
    NAME="홍길동"
    
    # Google Chat webhook URL μ„€μ •
    GOOGLE_CHAT_WEBHOOK_URL="λ³΅μ‚¬ν•œ webhook URL"
    
    # ν”„λ‘œμ νŠΈ 이름을 λ³€μˆ˜λ‘œ μ„€μ •ν•©λ‹ˆλ‹€.
    PROJECT="ν”„λ‘œμ νŠΈμ΄λ¦„"
    
    # λ©”μ‹œμ§€ λ‚΄μš© 생성 (μ‚¬μš©μž 이름 포함)
    # λ‚˜μ€‘μ— λ‚΄μš©μ„ λ³€κ²½ν•˜μ…”λ„ λ©λ‹ˆλ‹€.
    MESSAGE="${NAME}λ‹˜κ»˜μ„œ ${PROJECT}의 배포λ₯Ό μ‹œμ „ν•˜μ˜€μŠ΅λ‹ˆλ‹€."
    
    # λ©”μ‹œμ§€μ˜ JSON 포맷 생성
    # ν˜Ήμ‹œλ‚˜ 적용이 λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ κ°€μž₯ λ°”κΉ₯의 μŒλ”°μ˜΄ν‘œ("")λ₯Ό ν™‘λ”°μ˜΄ν‘œ('')둜 λ³€κ²½ν•˜μ„Έμš”. 
    json_message="{"text": "'"${MESSAGE}"'"}"
    
    
    # λ©”μ‹œμ§€λ₯Ό Google Chat으둜 전솑
    curl -X POST \
         -H 'Content-Type: application/json' \
         -d "$json_message" \
         "$GOOGLE_CHAT_WEBHOOK_URL"

    이 μŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒκ³Ό 같은 과정을 κ±°μΉ©λ‹ˆλ‹€.

    • μ‚¬μš©μž 이름을 λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€.
    • μ•žμ„œ μ„€μ •ν•œ Google Chat webhook URL을 λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€.
    • ν”„λ‘œμ νŠΈ 이름을 λ³€μˆ˜λ‘œ μ„€μ •ν•©λ‹ˆλ‹€.
    • λ©”μ‹œμ§€ λ‚΄μš©μ„ μƒμ„±ν•©λ‹ˆλ‹€. μ—¬λŸ¬λΆ„μ΄ μ›ν•˜μ‹œλŠ” 문ꡬλ₯Ό μ μ–΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.
    • 이λ₯Ό JSON 포맷으둜 λ³€ν™˜ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μ‚¬μš©μž 이름과 ν•¨κ»˜ 배포 μ•Œλ¦Ό λ©”μ‹œμ§€λ₯Ό κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • curl λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ©”μ‹œμ§€λ₯Ό Google Chat webhook URL둜 μ „μ†‘ν•©λ‹ˆλ‹€. κΈ€ λ§ˆμ§€λ§‰μ— μΆ”κ°€ μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
    • λͺ¨λ“  과정이 λλ‚˜λ©΄ 터미널에 μ‹€ν–‰ κ²°κ³Όκ°€ λ‚˜μ˜΅λ‹ˆλ‹€.

3. μ‰˜ 슀크립트 μ‹€ν–‰ν•˜κΈ°

  • 슀크립트λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” νŒŒμΌμ— μ‹€ν–‰ κΆŒν•œμ„ λΆ€μ—¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν„°λ―Έλ„μ—μ„œ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ 슀크립트 νŒŒμΌμ— μ‹€ν–‰ κΆŒν•œμ„ λΆ€μ—¬ν•©λ‹ˆλ‹€.

    # ν•΄λ‹Ή Bash μŠ€ν¬λ¦½νŠΈκ°€ μžˆλŠ” 폴더
    
    chmod +x deploy_notification.sh

    μ‹€ν–‰κΆŒν•œμ΄ 없이도 싀행이 κ°€λŠ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 이제 슀크립트λ₯Ό μ‹€ν–‰ν•  μ€€λΉ„κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν„°λ―Έλ„μ—μ„œ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ 슀크립트λ₯Ό μ‹€ν–‰ν•΄ λ³΄μ„Έμš”.

    # ν•΄λ‹Ή Bash μŠ€ν¬λ¦½νŠΈκ°€ μžˆλŠ” 폴더
    
    ./deploy_notification.sh
  • μŠ€ν¬λ¦½νŠΈκ°€ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ©΄ Google Chat의 λŒ€ν™”λ°©μ— 배포 μ•Œλ¦Όμ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. sc005

    μ—¬λŸ¬λΆ„μ΄ μ •ν•˜μ‹  μ›Ήν›…μ˜ 이름과 NAME, PROJECT, MESSAGE에 따라 λ‹€λ₯΄κ²Œ ν‘œμ‹œλ  수 μžˆμŠ΅λ‹ˆλ‹€.

이 방법을 μ‚¬μš©ν•˜λ©΄ νŒ€μ›λ“€μ—κ²Œ ν”„λ‘œμ νŠΈμ˜ 배포 상황을 μ‰½κ²Œ κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ›ν•˜λŠ” κ²½μš°μ—λŠ” 슀크립트λ₯Ό μˆ˜μ •ν•˜μ—¬ 보닀 λ‹€μ–‘ν•œ 정보λ₯Ό μ•Œλ¦ΌμœΌλ‘œ 전솑할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이제 μ—¬λŸ¬λΆ„λ„ Google Chat을 ν™œμš©ν•˜μ—¬ ν”„λ‘œμ νŠΈμ˜ μ†Œν†΅μ„ ν•œμΈ΅ 더 κ°•ν™”ν•΄ λ³΄μ„Έμš”!

μΆ”κ°€ 팁: μ‰˜ 슀크립트λ₯Ό ν™•μž₯ν•˜μ—¬ 더 λ§Žμ€ 정보 μ „λ‹¬ν•˜κΈ°

이제 기본적인 배포 μ•Œλ¦Όμ„ μ „μ†‘ν•˜λŠ” 방법을 λ°°μ› μœΌλ‹ˆ, 슀크립트λ₯Ό ν™•μž₯ν•˜μ—¬ 더 λ§Žμ€ 정보λ₯Ό μ•Œλ¦ΌμœΌλ‘œ μ „λ‹¬ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

  • 배포 λ‚ μ§œμ™€ μ‹œκ°„ μΆ”κ°€ν•˜κΈ°

    배포 λ‚ μ§œμ™€ μ‹œκ°„μ„ μ•Œλ¦Όμ— μΆ”κ°€ν•˜λ €λ©΄, μŠ€ν¬λ¦½νŠΈμ— λ‹€μŒ μ½”λ“œλ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.

    # ν˜„μž¬ λ‚ μ§œμ™€ μ‹œκ°„μ„ κ°€μ Έμ˜΅λ‹ˆλ‹€.
    CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
    
    # λ©”μ‹œμ§€ λ‚΄μš©μ— λ‚ μ§œμ™€ μ‹œκ°„μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.
    MESSAGE="${NAME}λ‹˜κ»˜μ„œ ${PROJECT}의 배포λ₯Ό μ‹œμ „ν•˜μ˜€μŠ΅λ‹ˆλ‹€. (배포 μ‹œκ°„: ${CURRENT_TIME})"
  • λ©”μ‹œμ§€ ν˜•μ‹ μΆ”κ°€ν•˜κΈ°

    Google Chat은 λ‹¨μˆœν•œ ν…μŠ€νŠΈ 뿐만 μ•„λ‹ˆλΌ λ³Όλ“œμ²΄, 이타릭체, 링크, 블둝 인용 λ“± λ‹€μ–‘ν•œ ν˜•μ‹μ˜ λ©”μ‹œμ§€λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. λ‹€μŒμ€ λ³Όλ“œμ²΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ©”μ‹œμ§€ ν˜•μ‹μ„ λ³€κ²½ν•œ μ˜ˆμž…λ‹ˆλ‹€.

    # λ©”μ‹œμ§€ λ‚΄μš©μ— λ‚ μ§œμ™€ μ‹œκ°„μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.(λ³Όλ“œμ²΄ μ‚¬μš©)
    MESSAGE="${NAME}λ‹˜κ»˜μ„œ *${PROJECT}*의 배포λ₯Ό μ‹œμ „ν•˜μ˜€μŠ΅λ‹ˆλ‹€. (배포 μ‹œκ°„: ${CURRENT_TIME})"

μΆ”κ°€ μ„€λͺ… : curl

curl은 μ»€λ§¨λ“œλΌμΈμ—μ„œ μ‚¬μš©ν•˜λŠ” 데이터 전솑 λ„κ΅¬λ‘œ, URL을 μ΄μš©ν•΄ λ‹€μ–‘ν•œ ν”„λ‘œν† μ½œ(HTTP, HTTPS, FTP, SMTP λ“±)을 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 주고받을 수 μžˆμŠ΅λ‹ˆλ‹€. 주둜 μ›Ή API와 μƒν˜Έμž‘μš©ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

μŠ€ν¬λ¦½νŠΈμ—μ„œ μ‚¬μš©λœ curl λͺ…λ Ήμ–΄λ₯Ό 뢄석해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

curl -X POST \
     -H 'Content-Type: application/json' \
     -d "$json_message" \
     "$GOOGLE_CHAT_WEBHOOK_URL"

μœ„μ˜ curl λͺ…λ Ήμ–΄λŠ” λ‹€μŒκ³Ό 같은 μ˜΅μ…˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

  • -X POST: -X μ˜΅μ…˜μ€ μ‚¬μš©ν•  HTTP λ©”μ„œλ“œλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” POST λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ -X POSTλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • -H 'Content-Type: application/json': -H μ˜΅μ…˜μ€ HTTP 헀더λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” JSON ν˜•μ‹μ˜ 데이터λ₯Ό λ³΄λ‚΄λ―€λ‘œ Content-Type: application/json으둜 μ„€μ •ν•©λ‹ˆλ‹€.
  • -d "$json_message": -d μ˜΅μ…˜μ€ POST μš”μ²­ μ‹œ 보낼 데이터λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” JSON ν˜•μ‹μ˜ λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•˜λ―€λ‘œ, μ•žμ„œ μƒμ„±ν•œ json_message λ³€μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • "$GOOGLE_CHAT_WEBHOOK_URL": λ§ˆμ§€λ§‰μœΌλ‘œ, μš”μ²­μ„ 보낼 URL을 지정해야 ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” Google Chat의 webhook URL을 μ‚¬μš©ν•˜λ―€λ‘œ, μ•žμ„œ μ„€μ •ν•œ GOOGLE_CHAT_WEBHOOK_URL λ³€μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ κ΅¬μ„±λœ curl λͺ…λ Ήμ–΄κ°€ 싀행이 μ™„λ£Œκ°€ 되면 μ‹€ν–‰ κ²°κ³Όλ₯Ό 터미널에 좜λ ₯ν•©λ‹ˆλ‹€. λͺ‡μ‹­μ€„μ˜ κ²°κ³Όκ°€ 좜λ ₯λ˜λŠ”λ° 좜λ ₯ν•˜μ§€ μ•Šλ„λ‘ μ„€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

curl -s -o /dev/null -X POST \
     -H 'Content-Type: application/json' \
     -d "$json_message" \
     "$GOOGLE_CHAT_WEBHOOK_URL"

μœ„μ— curl λͺ…λ Ήμ–΄λŠ” λ‹€μŒκ³Ό 같은 μ˜΅μ…˜μ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • -s: μ‹€ν–‰ κ²°κ³Όλ₯Ό 터미널에 좜λ ₯ν•˜μ§€ μ•Šλ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€. 이 μ˜΅μ…˜μ€ "silent"의 μ•½μžλ‘œ, curl λͺ…λ Ήμ–΄μ˜ μ‹€ν–‰ κ³Όμ • 쀑 진행 μƒν™©μ΄λ‚˜ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 터미널에 좜λ ₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • -o /dev/null: μ‹€ν–‰ κ²°κ³Όλ₯Ό /dev/null νŒŒμΌμ— μ €μž₯ν•˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€. /dev/null은 UNIX 및 Linux μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©λ˜λŠ” κ°€μƒμ˜ 파일둜, 이 파일둜 보내진 λ°μ΄ν„°λŠ” λͺ¨λ‘ λ¬΄μ‹œλ©λ‹ˆλ‹€. 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨, μ‹€ν–‰ κ²°κ³Όλ₯Ό 파일둜 μ €μž₯ν•˜λ©΄μ„œ ν„°λ―Έλ„μ—λŠ” 좜λ ₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
@Hyunjoo
Hello :) I'm Lanky.