[GitHub] 나 매일 잔디 심고 싶다 (a.k.a 잔디봇)
1. 깃꾸 (깃허브 꾸미기)
GitHub에 매일매일 커밋을 해서 나만의 운동장을 만들고 싶다.
이제 잔디 2번 심은 내 운동장이다.
GitHub에 매일매일 1day 1commit을 하려고 하는데 쉬는 날도 있고 매일 올리기 힘들거란 생각이 든다.
어떻게 내 깃허브 커밋 창을 편하게 관리할 수 있을까?
2. GitHub Actions 활용하기
잔디를 심는 여러 방법이 있긴 하지만 나는 GitHub Actions를 활용해서 자동으로 실행하게 설정하려고 한다.
먼저 GitHub Repository의 설정부터 변경하여야 한다.
a. Setting/Actions/General 설정 변경
Setting/Actions/General에서 Workflow permissions를 read and write permissions로 체크한다.
두 번째는 script에 사용할 암호화할 변수 설정하는 부분인데 필요할 경우 추가해주면 된다.
나는 USER_EMAIL을 암호화하기 위해서 New repository secret을 추가하였다.
b. Actions 추가하기
Actions/New workflow으로 새 workflow를 추가해보자.
Simple workflow를 눌러서 .github/workflows/blank.yml 생성한다.
저는 auto-commit.yml로 이름을 정했다.
c. 코드
디테일한 설정은 사용하고 싶은 대로 바꾸시기 바란다.
저는 매일 오후 11시 30분까지 커밋을 하였으면 잔디봇이 일하지 않고 커밋하지 않았으면 잔디봇이 잔디를 심도록 하였다.
코드 옆 주석으로 내용 설명을 작성해놓았으니 참고하기 바란다.
혹시 코드가 안 돌아가거나 에러 발생 시 댓글 달아주시면 답변 드리도록 하겠습니다.
주석은 미래의 나를 위한 것이기도 하다.
name: Daily Auto Commit
on:
workflow_dispatch: # 수동 테스트 설정용
schedule:
- cron: '30 14 * * *' # 매일 14:30 UTC에 실행 = 한국 시간 23:30
jobs:
auto-commit:
runs-on: ubuntu-latest
steps: # 각 step 별로 진행됨
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: 오늘 커밋 여부 확인 # 오늘 날짜에 commit이 없으면(author 설정)
id: check_commit # 나중에 return 여부 확인을 위해서 id 부여
run: |
DATE=$(TZ=Asia/Seoul date '+%Y-%m-%d')
echo "오늘 날짜: $DATE"
if git log --since="$DATE 00:00 +0900" --author="$GITHUB_ACTOR" --oneline | grep .; then
echo "오늘 이미 커밋이 있습니다. 워크플로를 종료합니다."
echo "::set-output name=should_run::false"
else
echo "오늘 커밋이 없습니다. 자동 커밋을 진행합니다."
echo "::set-output name=should_run::true"
fi
- name: 파일 업데이트
if: steps.check_commit.outputs.should_run == 'true'
run: |
DATE=$(TZ=Asia/Seoul date '+%Y%m%d')
echo "DATE=${DATE}" >> $GITHUB_ENV # DATE 변수를 환경 변수로 설정
echo "🌿오늘은 bot이 잔디 심어요🌿" > "[${DATE}]"
- name: 변경 사항 커밋
if: steps.check_commit.outputs.should_run == 'true'
run: |
echo "사용 중인 DATE 변수: ${DATE}"
git config --global user.name "$GITHUB_ACTOR"
git config --global user.email "${{ secrets.USER_EMAIL }}"
ls -l # 현재 디렉토리의 파일 목록 확인
git add "[${DATE}]"
git commit -m "자동 커밋: ${DATE}"
- name: 변경 사항 푸시
if: steps.check_commit.outputs.should_run == 'true'
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
3. 결과
수동으로 workflow 실행이 가능하게 코드를 작성했기 때문에 수동으로 실행시켜보았다.
오늘은 이미 커밋을 한 상황이라 오늘 커밋 여부에서 건너뛰고 체크아웃 후 complete job을 하는 것을 확인할 수 있다.
나중에 자동 커밋된 결과는 하루 커밋을 쉰다면(아마도 토요일) 결과를 추가해야겠다.
3. TODO
찾아보니 github actions cron이 잘 작동하지 않는 경우가 많다고 한다.
내 잔디봇도 일하지 않는 것을 확인했다..!
일단은 일시적 오류일 수 있으니 조금 더 확인하고 최악의 경우 내가 수동 잔디봇이 되버려..🌿
시간을 두고 확인한 결과 오후 9시로 설정해두었지만 오후 9시와 10시에 실행이 되고 있긴 하다.
다만 간헐적으로 실행될 확률도 높아서 완전히 action을 믿긴 힘들거 같다.
4. MORE
Actions를 살펴보니 2가지 Warnings가 발생하였고 실제로 동작에도 문제가 발생하여 코드를 수정하게 되었다.
set-output command가 deprecated되었고 사용이 곧 불가해진다는 warning이어서 해당 부분을 ${GITHUB_OUTPUT}으로 대체하였다.
name: Daily Auto Commit
on:
workflow_dispatch:
schedule:
- cron: '0 12 * * *'
jobs:
auto-commit:
runs-on: ubuntu-latest
steps:
- name: 저장소 체크아웃
uses: actions/checkout@v3
- name: 오늘 커밋 여부 확인
id: check_commit
run: |
DATE=$(TZ=Asia/Seoul date '+%Y-%m-%d')
echo "오늘 날짜: $DATE"
if git log --since="$DATE 00:00 +0900" --author="$GITHUB_ACTOR" --oneline | grep .; then
echo "오늘 이미 커밋이 있습니다. 워크플로를 종료합니다."
echo "should_run=false" >> $GITHUB_OUTPUT
else
echo "오늘 커밋이 없습니다. 자동 커밋을 진행합니다."
echo "should_run=true" >> $GITHUB_OUTPUT
fi
- name: 파일 업데이트
if: steps.check_commit.outputs.should_run == 'true'
run: |
DATE=$(TZ=Asia/Seoul date '+%Y%m%d')
echo "DATE=${DATE}" >> $GITHUB_ENV # DATE 변수를 환경 변수로 설정
echo "🌿오늘은 bot이 잔디 심어요🌿" > "[${DATE}]"
- name: 변경 사항 커밋
if: steps.check_commit.outputs.should_run == 'true'
run: |
echo "사용 중인 DATE 변수: ${DATE}"
git config --global user.name "$GITHUB_ACTOR"
git config --global user.email "${{ secrets.USER_EMAIL }}"
ls -l # 현재 디렉토리의 파일 목록 확인
git add "[${DATE}]"
git commit -m "자동 커밋: ${DATE}"
- name: 자격 증명 설정
if: steps.check_commit.outputs.should_run == 'true'
run: |
git config --global user.name "$GITHUB_ACTOR"
git config --global user.email "${{ secrets.USER_EMAIL }}"
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
- name: 변경 사항 푸시
if: steps.check_commit.outputs.should_run == 'true'
run: |
git push