GIST를 활용하는 도중 매번 같은 노동을 반복하는 저를 보고 너무 불쌍하게 여겨 자동화를 하려고 마음 먹었습니다.
쉘 스크립트를 사용하여 Gist를 자동으로 생성하고, 필요한 파일들을 포함시켜 푸시하는 과정을 담았습니다. 이 작은 스크립트를 통해 아주 큰 성취감을 느꼈습니다.
🚨🚨 HTTP로만 Clone이 가능해 HTTP로 깃헙 Gist와 연결하는 것을 전제로 합니다. 🚨🚨
먼저, 개발 환경에 Git과 GitHub CLI를 설치합니다.
Mac OS는 다양한 방법이 있는데 가장 많이 쓰는 brew로 설명하겠습니다.
brew install git
sudo apt update # 업데이트
sudo apt install git -y
brew install gh
공식 문서에 자세하게 명시돼 있습니다.
Mac쓰자..
type -p curl >/dev/null || sudo apt install curl -y
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh -y
GitHub CLI에 로그인하고 세팅을 끝마칩니다.
이제 쉘 스크립트를 작성하여 Gist를 생성하고 파일들을 포함시켜 푸시하는 과정을 자동화합니다.
#!/bin/bash
# 입력 인자 확인
if [ -z "$1" ]; then
echo "사용법 : $0 {DayNumber}"
exit 1
fi
DAY_NUMBER=$(printf "%02d" $1)
CURRENT_DATE=$(date +%y%m%d)
FOLDER_NAME="${CURRENT_DATE} : Day${DAY_NUMBER}"
# 중복 파일 확인
if [ -d "$FOLDER_NAME" ]; then
echo "폴더가 이미 존재합니다: $FOLDER_NAME"
echo "스크립트를 종료합니다."
exit 1
fi
# 템플릿 README.md 파일에서 내용 읽기
TEMPLATE_PATH="./README.md"
echo "리드미 템플릿 파일 찾는 중... $TEMPLATE_PATH"
ls -l $TEMPLATE_PATH
if [ ! -f "$TEMPLATE_PATH" ]; then
echo "리드미 템플릿 파일을 찾을 수 없습니다. : $TEMPLATE_PATH"
exit 1
fi
TEMPLATE_CONTENT=$(cat "$TEMPLATE_PATH")
# README.md 파일 생성 및 내용 작성
README_PATH="README.md"
echo "$TEMPLATE_CONTENT" > "$README_PATH"
# Gist 생성
GIST_DESCRIPTION="{JID를 입력해주세요} - $DAY_NUMBER"
GIST_OUTPUT=$(gh gist create "$README_PATH" -d "$GIST_DESCRIPTION")
# Gist URL 추출
GIST_URL=$(echo "$GIST_OUTPUT" | grep -o "https://gist.github.com/.*")
if [ ! -z "$GIST_URL" ]; then
echo "Gist 생성 성공 : $GIST_URL"
# Gist URL을 Chrome에서 열기
open -a "Google Chrome" "$GIST_URL"
# 현재 디렉토리의 상위 폴더로 이동
cd ..
# Gist를 같은 폴더명으로 클론
git clone "$GIST_URL" "$FOLDER_NAME"
# 클론한 폴더로 이동
cd "$FOLDER_NAME" || exit
# 추가 파일 복사
touch index.js
# 변경 사항 커밋
git add .
git commit -m "Initial commit with additional files for $FOLDER_NAME"
# 변경 사항 푸시
git push origin main
# VSCode 열기
code .
echo "$FOLDER_NAME Gist 클론 및 푸시 성공!"
else
echo "Gist URL을 찾을 수 없습니다."
fi
if [ -z "$1" ]; then
echo "사용법 : $0 {DayNumber}"
exit 1
fi
스크립트가 실행될 때 DayNumber
를 입력으로 받습니다. 입력 인자가 없으면 에러 처리로 사용법을 출력하고 종료합니다.
DAY_NUMBER=$(printf "%02d" $1)
CURRENT_DATE=$(date +%y%m%d)
FOLDER_NAME="${CURRENT_DATE} : Day${DAY_NUMBER}"
입력받은 미션 번호와 현재 날짜(date
)를 조합해 폴더 이름을 생성합니다.
if [ -d "$FOLDER_NAME" ]; then
echo "폴더가 이미 존재합니다: $FOLDER_NAME"
echo "스크립트를 종료합니다."
exit 1
fi
에러 처리 : 동일한 이름의 폴더가 이미 존재하면 안내문을 출력하고 스크립트를 종료합니다.
TEMPLATE_PATH="./README.md"
echo "리드미 템플릿 파일 찾는 중... $TEMPLATE_PATH"
ls -l $TEMPLATE_PATH
if [ ! -f "$TEMPLATE_PATH" ]; then
echo "리드미 템플릿 파일을 찾을 수 없습니다. : $TEMPLATE_PATH"
exit 1
fi
TEMPLATE_CONTENT=$(cat "$TEMPLATE_PATH")
템플릿 README.md
파일을 확인하고, 내용을 읽어옵니다.
README.md
파일 생성 및 작성README_PATH="README.md"
echo "$TEMPLATE_CONTENT" > "$README_PATH"
템플릿 파일을 그대로 사용해 README.md
파일을 생성합니다.
GIST_DESCRIPTION="{JID를 입력해주세요} $DAY_NUMBER"
GIST_OUTPUT=$(gh gist create "$README_PATH" -d "$GIST_DESCRIPTION")
GIST_URL=$(echo "$GIST_OUTPUT" | grep -o "https://gist.github.com/.*")
GitHub CLI(gh
명령어)를 사용해 Gist를 생성하고, Gist URL을 추출합니다.
{JID를 입력해주세요}
부분에 본인의 JID를 입력해주면 Gist Description을 수정을 안해도 되니 더 편합니다!
여기서 레포지토리 공개 여부 기본값은 secret
입니다.
cd ..
git clone "$GIST_URL" "$FOLDER_NAME"
cd "$FOLDER_NAME" || exit
상위 디렉토리로 이동해 Gist를 클론합니다.
touch index.js
git add .
git commit -m "Initial commit with additional files for $FOLDER_NAME"
git push origin main
필요한 파일들을 클론된 디렉토리로 복사하고, 변경 사항을 커밋해 푸시합니다.
여기서는 빈 JS 파일인 index.js
를 생성해 넣어줬습니다.
code .
VSCode로 해당 디렉토리를 엽니다.
스크립트를 실행해봅시다. 절대 경로로 해도 되고, 상대 경로로 해도 됩니다.
chmod +x /yourPath/setup-script.sh
/yourPath/setup-script.sh 6
아니면 상대경로로 해도 됩니다.
실행한 뒤 파일이 제대로 생긴 걸 볼 수 있습니다!
이제 Gist 생성을 자동화할 수 있습니다. 쉘 스크립트를 배우고 나서 이렇게 오래 걸릴지 몰랐지만 어쨌든 해냈습니다 ㅠㅠ