본문 바로가기

Develop/Shell

Github 여러 프로젝트 자동화 스크립트

728x90

인터넷에 검색하다보면 Github 1일 1커밋을 위한 자동화 스크립트가 다수 보입니다.

그러한 자동화 스크립트를 구경하다보니 일정시간 마다 여러 프로젝트를 한번에 커밋, 푸시 해주는 자동화 스크립트가 있으면 좋겠다!

라는 생각에 몇 시간만에 만들게 되었습니다.

Github Repository 중 협업을 하지 않고 커밋 메시지가 중요하지 않은 Private Repository를 관리하게 되는 경우에

유용하게 사용할 수 있습니다.

 

자동화 스크립트를 사용하기 위해선

 

  1. git init (깃 생성)
  2. git remote (깃 원격 저장소 등록)

프로젝트 폴더마다 위의 2가지 과정이 모두 수행되어야 합니다.

 

예시) algorithm 폴더와 zero-base-java 폴더에 .git이 등록된 모습

 

이제 자동화 스크립트 적용을 시작해보겠습니다.

운영체제에 따라 내용이 달라지니 해당하는 운영체제 내용만 보시면 됩니다.

 


운영체제가 윈도우일 경우

 

윈도우 검색

먼저 윈도우 검색에서 PowerShell ISE를 검색 후 실행해주세요.

 

 

 

그런 다음 스크립트 열기에서 아래 파일을 열어주세요.

 

 

register-auto-commit.ps1
0.00MB

 

 

그 후 아래 내용을 본인 환경에 맞게 수정해주세요.

수정해야 하는 목록은 다음과 같습니다.

 

  1. (선택) $Interval: 60분이 아닌 다른 간격마다 자동 커밋, 푸시를 원하시는 경우 이 곳을 수정하시면 됩니다.
  2. (선택) $DrivePath: 메인 디스크가 C드라이브가 아닌 경우 변경해주세요.
  3. (선택) RE_INTERVAL: 자동 커밋, 푸시 간격이 60분이 아닌 다른 시간으로 고친 경우 위에서 고친 시간 간격 - 1분 만큼 빼주시면 됩니다.
  4. (필수) USER_EMAIL: 본인 깃허브 이메일로 변경해주세요.
  5. (필수) USER_NAME: 본인 깃허브 유저 네임으로 변경해주세요.
  6. (선택) HOME: 홈 디렉토리 변수를 사용할 경우 변경해주세요.
  7. (필수) WORK_DIRS: 관리할 프로젝트를 추가 및 수정해주세요. 현재는 2개만 등록되어 있는데 밑에 추가로 입력하거나 지우셔도 정상 작동합니다.
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{  
  $arguments = "& '" +$myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

$Interval = 60 # Github push 시간 간격
$DrivePath = "C:\" # 기본 디스크

$ShellPath = "Scripts\"
$FileName = "auto-commit.sh"

if ( Test-Path -Path ($DrivePath + $ShellPath) )
{
    Remove-Item -Path ($DrivePath + $ShellPath) -Recurse
}
New-Item -Path $DrivePath -Name "Scripts" -ItemType "directory"
New-Item -Path ($DrivePath + $ShellPath) -Name $FileName -ItemType "file" -Value `
@'
#!/bin/bash

RE_INTERVAL="59" # Github push 시간 간격 - 1
USER_EMAIL="20160658@gm.hannam.ac.kr" # Github e-mail
USER_NAME="edd1e-dev" # Github username
HOME="C:\Users\cudy_\Desktop" # 홈 디렉토리 주소
WORK_DIRS=(
	"$HOME/algorithm"
	"C:\Users\cudy_\Desktop\zero-base-java"
)

SINCE_AGO="$RE_INTERVAL minutes ago"

for WORK_DIR in "${WORK_DIRS[@]}"
do
        cd ${WORK_DIR}
        COMMIT=`git log --pretty=format:"%cd" --since="${SINCE_AGO}"`
        TODAY=`date "+%Y-%m-%d %I:%M %p"`
        USER=`git config --global user.email`
        MSG="Auto committed"
        
        if [ "$USER" = "" ]
        then
                git config --global user.email "$USER_EMAIL"
                git config --global user.name "$USER_NAME"
        fi

        RED="\033[0;31m"
        NC="\033[0m"
        
        if [ "$COMMIT" = "" ]
        then
                pushd ${WORK_DIR}
                # sed -i '$d' README.md
                # echo "<code>${MSG} - ${TODAY}</code><br>" >> README.md
                # git add README.md
                git add -A
                git commit -m "${MSG} - ${TODAY}"
                git push origin main
                popd
        else
                printf "${RED}COMMIT is already exist!${NC}\n"
        fi

        echo -e
done

# read -rsp $'Press enter to continue...\n'
'@

Unregister-ScheduledTask -TaskName "Auto_Commit" -confirm:$false
$ac = New-ScheduledTaskAction -Execute ($DrivePath + $ShellPath + $FileName)
$tr = New-ScheduledTaskTrigger -Once -At (Get-Date).Date -RepetitionInterval (New-TimeSpan -Minutes $Interval)
$pr = New-ScheduledTaskPrincipal  -Groupid  "INTERACTIVE" 
Register-ScheduledTask -TaskName "Auto_Commit" -Description "This is a auto-commit task. Its job is to start notepad every $Interval minutes." -Trigger $tr -Action $ac -Principal $pr

Read-Host -Prompt "Task is added successfully"

 

 

스크립트 실행

 

 

위에 설명한 내용을 수정하시고 스크립트를 실행하시면 됩니다.

 

 

스케줄링이 정상 등록된 모습입니다.

 

이제 1시간마다 자동으로 등록된 프로젝트들에 대한 커밋, 푸시가 이루어집니다.

이때 만약 새로 작성한 코드가 없을 경우 커밋도, 푸시도 이루어지지 않습니다.

 

스케줄링에서 제거하고 관련 디렉토리를 정리하는 PowerShell 스크립트는 다음과 같습니다.

등록할 때 사용했던 Powershell ISE에서 똑같이 실행하시면 스케줄러와 관련 파일들이 정리 됩니다.

 

만약 처음 자동화 스크립트를 적용할 때 C드라이브가 아닌 다른 곳을 지정했다면

$DrivePath를 수정해주세요.

 

$DrivePath = "C:\" # 기본 디스크
$ShellPath = "Scripts\"

if ( Test-Path -Path ($DrivePath + $ShellPath) )
{
    Remove-Item -Path ($DrivePath + $ShellPath) -Recurse
}

if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{  
  $arguments = "& '" +$myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

Unregister-ScheduledTask -TaskName "Auto_Commit" -confirm:$false

remove-auto-commit.ps1
0.00MB

 


운영체제가 맥일 경우

맥의 경우는 crontab을 통해 일정시간마다 bash 파일이 실행되게끔 만들면 됩니다.

 

auto-commit.sh
0.00MB

 

먼저 auto-commit.sh를 다운로드 후 아래 내용을 본인 환경에 맞게 수정해주세요.

수정해야 하는 목록은 다음과 같습니다.

 

  1. (선택) RE_INTERVAL: 60분이 아닌 다른 간격마다 자동 커밋, 푸시를 원하시는 경우 이 곳을 수정하시면 됩니다.
  2. (필수) USER_EMAIL: 본인 깃허브 이메일로 변경해주세요.
  3. (필수) USER_NAME: 본인 깃허브 유저 네임으로 변경해주세요.
  4. (선택) HOME: 홈 디렉토리 변수를 사용할 경우 변경해주세요.
  5. (필수) WORK_DIRS: 관리할 프로젝트를 추가 및 수정해주세요. 현재는 2개만 등록되어 있는데 밑에 추가로 입력하거나 지우셔도 정상 작동합니다.
#!/bin/bash

RE_INTERVAL="60" # Github push 시간 간격
USER_EMAIL="20160658@gm.hannam.ac.kr" # Github e-mail
USER_NAME="edd1e-dev" # Github username
SINCE_AGO="$RE_INTERVAL minutes ago"
HOME="C:\Users\cudy_\Desktop" # 홈 디렉토리 주소
WORK_DIRS=(
	"$HOME/algorithm"
	"$C:\Users\cudy_\Desktop\zero-base-java"
)

for WORK_DIR in "${WORK_DIRS[@]}"
do
        cd ${WORK_DIR}
        COMMIT=`git log --pretty=format:"%cd" --since="${SINCE_AGO}"`
        TODAY=`date "+%Y-%m-%d %I:%M %p"`
        USER=`git config --global user.email`
        MSG="Auto committed"
        
        if [ "$USER" = "" ]
        then
                git config --global user.email "$USER_EMAIL"
                git config --global user.name "$USER_NAME"
        fi

        RED="\033[0;31m"
        NC="\033[0m"
        
        if [ "$COMMIT" = "" ]
        then
                pushd ${WORK_DIR}
                # sed -i '$d' README.md
                # echo "<code>${MSG} - ${TODAY}</code><br>" >> README.md
                # git add README.md
                git add -A
                git commit -m "${MSG} - ${TODAY}"
                git push origin main
                popd
        else
                printf "${RED}COMMIT is already exist!${NC}\n"
        fi

        echo -e
done

# read -rsp $'Press enter to continue...\n'

 

위의 내용을 수정하고 저장한 후

 

$crontab -e

터미널에 위의 커맨드를 입력해주세요.

 

*/60 * * * * bash파일이 존재하는 경로/auto-commit.sh

위의 라인을 등록한 뒤 wq! 로 저장해주세요. 밑의 방법을 통해 간단하게 추가하실 수도 있습니다.

 

$(crontab -l 2>/dev/null; echo "*/60 * * * * bash파일이 존재하는 경로/auto-commit.sh") | crontab -

등록이 완료되면 60분 마다 등록한 폴더들이 자동적으로 commit, push 됩니다.

 

$crontab -r

crontab에 등록한 bash 파일을 삭제하고 싶을 때는 위의 커맨드를 통해서 삭제하실 수 있습니다.