GitHub Actions을 빌드 및 릴리스 파이프라인으로 사용하고 팀이 Slack을 사용한다면, Slack을 벗어나지 않고도 작업을 수행할 수 있다는 것을 알고 계셨나요? Slack 봇을 생성하여 Slack에서 직접 GitHub Actions 워크플로우를 자동으로 호출하세요!
이 자습서에서는 Hubot이라는 봇 빌딩 도구를 사용하여 새로운 Slack 챗봇을 설정하고, 서버로 코드를 배포하기 위해 GitHub Actions 워크플로우를 자동으로 시작하는 방법을 배우게 됩니다.
자세히 알아보겠습니다!
전제 조건
이 자습서는 실습을 통해 진행될 예정입니다. 따라하기를 원하신다면 다음 사항을 준비해주세요:
- A Slack Workspace
- A GitHub account and a GitHub personal token
- A Linux server to deploy code to – This tutorial will use Ubuntu 19.
- A local Linux machine – This tutorial will use Ubuntu so that all local commands will be Linux. If you’re running another operating system, the commands may be slightly different.
- 코드를 배포할 서버에 연결하는 SSH 자격 증명.
- A code editor of your choice that understands YAML like Visual Studio Code.
프로젝트 및 GitHub Actions 워크플로우 생성
Slack에서 빠르게 GitHub Actions 워크플로우를 호출하려면 먼저 워크플로우를 생성해야 합니다.
워크플로우를 생성하기 위해 작업할 모든 파일을 포함하는 프로젝트 폴더를 생성해봅시다.
1. 좋아하는 터미널 응용 프로그램을 엽니다.
2. 아래 명령어 시리즈를 실행하여 Hubot이라는 프로젝트 폴더를 생성하고 해당 폴더로 이동합니다.
3. 다음으로, npm init
을 실행하여 Node.JS package.json 파일을 생성합니다. npm init
을 실행하면 프로젝트에 대한 다양한 정보와 종속적인 NPM 패키지에 대한 정보가 포함된 표준 Node.JS 프로젝트가 생성됩니다.
4. 이제 workflows 디렉토리와 deploy.yml
워크플로우 파일을 생성합니다. 워크플로우 파일은 GitHub Actions가 따를 일련의 단계들을 정의한 것입니다.
5. 다음으로, 워크플로우가 읽을 각각의 GitHub 비밀을 정의하세요. 생성하려는 워크플로우는 이러한 비밀을 참조할 것입니다. 서버 주소, 사용자 이름, 비밀번호 및 SSH에 대한 서버 포트가 필요하기 때문에 GitHub 비밀을 생성해야 합니다.
다음 URL을 방문하세요: https://github.com/yourusername/yourrepository/settings/secrets/actions 여기에서 GitHub 비밀을 추가하세요. yourusername을 GitHub 사용자 이름으로, yourrepository을 GitHub 저장소 이름으로 바꿔주세요.
아래에 표시된 대로 새 저장소 비밀 버튼을 클릭하여 추가할 비밀에 대한 정보를 입력하세요.

6. 이제 비밀의 이름과 값 필드를 채우고, 비밀을 저장하기 위해 “비밀 추가”를 클릭하세요. 페이지가 GitHub 비밀 페이지로 리디렉션되며, 모든 비밀을 확인할 수 있습니다. 추가 비밀을 생성하려면 이전에 수행한 것과 동일한 방법으로 “새 저장소 비밀” 버튼을 클릭하세요.
주어진 변수에 대한 비밀을 정확히 동일한 이름으로 저장해야 하므로, HOST, USERNAME, PASSWORD 및 PORT와 같은 변수에 대한 비밀을 저장하세요.


7. 마지막으로, 코드 편집기에서 ~/Hubot/.github/workflows/deploy.yml 워크플로우 파일을 열고 아래의 코드를 복사하여 붙여넣으세요. 아래 코드는 나중에 Slack을 통해 워크플로우를 트리거할 때 실행되는 워크플로우입니다.
워크플로우를 호출할 때 몇 가지 작업이 수행됩니다:
- GitHub Actions는 아래의 워크플로우 파일을 구문 분석하여
HOST
비밀값으로 정의된 대상host
에 SSH를 수행합니다. 또한,USERNAME
및PASSWORD
를 비밀값으로 정의하여 사용합니다. - 워크플로우는
$branchName
으로 지정된 특정 브랜치의 GitHub 리포지토리 내용을 다운로드하기 위해git pull origin$branchName
을 실행합니다. 배포하려는 코드가 포함된 브랜치 이름을 확인하십시오. - 이 작업을 위해 Workflow Package인 ssh-remote-commands라는 Github Marketplace의 패키지를 사용합니다. 이 패키지에는 호스트, 사용자 이름, 비밀번호, 포트 및 프로덕션에서 실행할 명령만 제공하면 되는 편리한 래퍼가 있습니다.
서버에는 GitHub 리포지토리에서 코드를 가져오기 위해 필요한 로그인 자격 증명이 있는 git이 설치되어 있는지 확인하십시오.
워크플로우 수동 실행
이제 슬랙을 통해 GitHub Actions 워크플로우를 생성했습니다. 하지만 여기서는 코드가 로컬 머신에만 있습니다. 워크플로우를 트리거하기 위해 코드를 GitHub에 푸시해야 합니다.
아래 명령어 시리즈를 실행하여 코드를 푸시하고 풀어올릴 위치를 git에 알려줍니다. 아래의 git remote add origin
명령어에서 yourusername
과 yourrepository
를 실제 GitHub 사용자 이름과 repository로 대체하세요.
먼저 코드가 작동하는지 테스트해봅시다. 인기 있는 curl 유틸리티를 사용하여 코드를 수동으로 호출하세요.
아래 명령어를 실행하여 GitHub Repository https://github.com/username/repository/dispatches URL에 POST 요청을 보내 GitHub에 앞서 생성한 deploy.yml 워크플로우 파일을 트리거하도록 알려줍니다. username을 실제 GitHub 사용자 이름으로, repository를 GitHub repository로 대체하세요.
아래 코드의 $github_personal_token
을 실제 개인 토큰으로 대체하세요.
Hubot을 사용하여 Slack 봇을 생성합니다.
GitHub Action Workflow을 수동으로 트리거할 수 있었으므로, 좋은 시작입니다. 이제 동일한 수동 단계를 Slack 봇을 통해 자동화해 보겠습니다. Slack 봇을 생성하고, 명령을 수신하면 해당 명령에 따라 GitHub Action을 트리거합니다.
Slack 봇을 생성하는 두 가지 옵션이 있습니다. 처음부터 생성하거나 사전에 구축된 Slack 워크스페이스용 Hubot 패키지를 사용할 수 있습니다. 이 튜토리얼에서는 Hubot이라는 사전에 구축된 봇 패키지를 사용합니다. Hubot은 Slack, Discord, Gitter, TeamSpeak 등과 같은 채팅 서비스와 통합되는 오픈 소스 자동화 도구입니다.
앱을 사용하지 않고 커스텀 봇을 만드는 것은 많은 시간이 걸립니다. 그 이유는 모든 설정 프로세스, 웹훅 수신 및 봇 호스팅을 직접 처리해야 하기 때문입니다. 따라서 이 튜토리얼에서는 Hubot Slack 앱을 사용하여 이러한 프로세스를 간소화할 것입니다.
Hubot 설치하기
Slack 봇을 만들기 위해 먼저 로컬 컴퓨터에 Hubot을 다운로드하고 설치해야 합니다. Hubot은 Slack과 GitHub 액션을 연결하는 커넥터 역할을 할 것입니다.
1. 터미널에서 프로젝트 디렉토리(~/Hubot
)로 이동하세요.
2. 아래의 npm install
명령어를 사용하여 yo
및 generator-hubot
패키지를 로컬 컴퓨터에 전역(-g
)으로 설치하세요. yo 패키지는 어떤 언어로든 프로젝트를 생성하여 새로운 프로젝트를 설치하는 데 도움을 줍니다(웹, 자바, 파이썬, C# 등). generator-hubot 패키지는 초기 설정과 함께 모든 종속성을 설치하기 위해 yo 패키지를 사용합니다.
설치가 완료되면, 전역으로 설치되었기 때문에 어디에서나 yo
명령을 실행할 수 있습니다.
3. 이제 다음 명령어로 기본 Hubot 보일러플레이트를 생성하세요. 보일러플레이트는 여러 곳에 포함된 코드 섹션입니다. 보일러플레이트가 없으면 항상 코드를 처음부터 작성해야 합니다.
아래 명령어는 기본 Hubot 보일러플레이트를 프로젝트 디렉토리에 생성합니다. Hubot 보일러플레이트는 Slack(--adapter=slack
)을 연결하여 봇이 Slack 채널 내의 메시지를 수신하고 응답할 수 있도록 합니다. yo hubot --adapter=slack
Slack 워크스페이스에 Hubot 추가하기
이제 로컬 머신에 Hubot이 설치되었으므로 Slack과의 통신을 구성해야 합니다.
Slack 워크스페이스에 Hubot을 설치해 보겠습니다.
1. 웹 브라우저를 열고 URL을 사용하여 Slack 관리자 설정으로 이동합니다. URL은 다음과 같습니다: https://workspacename.slack.com/admin/settings. workspacename을 실제 Slack 워크스페이스 이름으로 대체하세요.
왼쪽 패널에서 Configure apps를 클릭하여 Hubot을 마켓플레이스에서 검색할 수 있도록 합니다. Slack에는 미리 만들어진 애플리케이션을 찾을 수 있는 마켓플레이스가 있습니다.

2. 검색 창을 클릭한 다음 hubot을 입력하여 마켓플레이스에서 Hubot을 검색하고 Hubot을 선택하세요.
이제 아래에 표시된대로 Add to Slack 버튼을 클릭하여 Hubot을 Slack 워크스페이스에 추가하세요.

3. 마지막으로, 봇에 대한 일반 정보를 입력하세요. 이름(deployerhubot)과 아이콘을 입력하세요. API 토큰을 기록해두세요. 나중에 이 토큰을 사용하여 이전에 생성한 Hubot 프로젝트에서 봇을 활성화할 것입니다.

Slack와의 GitHub Actions Workflow 통합 테스트
이제 Slack 워크스페이스에 Hubot이 설치되었으므로 채널에서 메시지를 수신하고 전송하여 봇을 테스트해보겠습니다. 그러나 먼저 봇을 활성화해야 합니다.
1. 프로젝트의 루트 디렉토리에서 아래 명령을 실행하여 Slack용 봇(--adapter slack
)을 활성화합니다(./bin/hubot
). 앞서 기록한 API 토큰인 $token
을 교체해야 합니다.
2. 아래 명령을 실행하여 Slack 채널에 봇(botusername
)을 초대(/invite
)합니다. “Adding Hubot to Your Slack Workspace” 섹션의 세 번째 단계에서 등록한 봇의 이름인 botusername
을 교체해야 합니다.
이제 Slack에서 @deployerhubot ping,와 같이 봇에게 텍스트로 언급하여 통합이 작동하는지 테스트해보세요. 봇이 아래와 같이 PONG으로 응답한다면 준비가 완료된 것입니다.

봇이 응답하지 않았다면 웹 브라우저에서 GitHub 저장소로 이동하고 Actions 탭을 클릭하세요. 라운드 레드 체크 배지가 있는 작업 흐름이 실패한 것을 확인할 수 있습니다. 실패한 작업 흐름을 클릭하여 실패 원인을 확인하고 수정하세요.

아래에서는 비밀번호를 사용하여 원격 SSH 명령을 실행하는 과정에서 실패가 있었습니다. 워크플로우를 수정한 후에는 3단계로 돌아가서 봇이 PONG으로 응답하는지 확인해보세요.

슬랙에서 GitHub Actions 워크플로우 시작하기
이제 슬랙에서 GitHub Actions 워크플로우를 시작할 시간입니다!
주어진 브랜치를 지정된 서버에 배포하고, 해당 브랜치에서 코드를 가져오는 것과 같은 유연성이 필요합니다. 누군가 슬랙 채널에서 ***@*bot deploy API feature-x to production과 같이 입력하면 봇이 자동으로 응답하도록 가르치겠습니다. 나중에 환경 이름을 확인하여 사람들이 특정 환경과 브랜치만 배포할 수 있도록 할 수 있습니다.
봇의 응답을 자동화하기 위해:
1. ~/Hubot/scripts라는 디렉토리를 생성하세요. ~/Hubot/scripts 디렉토리는 GitHub 워크플로우를 트리거하는 스크립트를 저장할 위치입니다.
2. 코드 편집기에서 bot.js라는 파일을 ~/Hubot/scripts 디렉토리 안에 생성하세요. 그리고 아래의 코드를 복사하여 bot.js 파일 안에 붙여넣으세요.
아래의 코드는 봇이 슬랙 채널의 채팅 메시지를 듣고, 워크플로우를 트리거하여 슬랙 채널로 응답을 보내도록 합니다.
3. 마지막으로, 슬랙에서 @botusername deploy api staging to dev 메시지를 보내면 아래와 같은 응답이 표시됩니다.
워크플로우 파일은 코드를 특정 브랜치에 푸시하거나 태그를 생성하거나 풀 리퀘스트를 생성하거나 URL을 요청하는 등 다양한 GitHub 이벤트에서 트리거될 수 있습니다.

결론
이 자습서를 통해 코드를 사용하여 슬랙 응답을 수동으로 트리거하고 챗봇을 구축하는 GitHub 워크플로우에 대해 배웠습니다. 또한 슬랙에서 챗봇을 가지고 있다면 GitHub 액션 워크플로우를 호출하여 작업을 자동화할 수 있다는 것을 배웠습니다.
이 새로운 지식을 한 단계 업그레이드하여 리마인더 봇을 추가하거나 대화형 메시지를 만들어보시겠습니까?