프로그래밍 숲

crontab 이용하여 github 자동 커밋, 푸시하기 본문

나의 작은 프로젝트

crontab 이용하여 github 자동 커밋, 푸시하기

jjscript 2023. 6. 28. 09:28
728x90
반응형

crontab 이용하여 github 자동 배포하기 기능을 구축해보겠습니다. 잔디는 꾸준히 심어야 하기에 잔손실 나는 것을 방지해야하기 때문입니다. 우선 사용 가능한 linux 서버가 있다고 가정하고 시작하겠습니다. crontab을 사용하려면 항상 컴퓨터가 켜져 있어야 하기 때문에 linux 서버를 사용하는 것이 일반적입니다. 저는 AWS EC2 프리티어인 amazon linux로 진행해보도록 하겠습니다.

 

우선, ssh키를 만들어서 linux 서버에서 github에 연결하려고 합니다.

1. 리눅스에서 SSH 키 쌍 생성하기

우선 SSH 키 쌍을 생성해 보도록 하겠습니다.

ssh-keygen -t ed25519 -C "your_email@example.com"

위의 명령어를 분석해보도록 하겠습니다.

  • ssh-keygen은 SSH 프로토콜을 사용하기 위한 키 쌍을 생성하는 명령입니다. 이 명령은 두 개의 키, 즉 비밀 키와 공개 키를 생성합니다. 비밀 키는 서버에 접근하는 사용자만이 알고 있어야 하며, 공개 키는 SSH 서버에 저장됩니다. 이 두 키는 수학적으로 연관되어 있어, 비밀 키를 사용해 암호화된 메시지를 만들면 그 메시지는 공개 키를 사용해만 해독할 수 있습니다.
  • ssh-keygen 명령의 -t 옵션은 키의 유형을 지정하며, ed25519은 키의 유형을 나타냅니다. ed25519은 고성능 암호화를 제공하는 새로운 유형의 공개 키 암호화 방식입니다. 
  • -C 옵션은 생성된 키에 첨부되는 코멘트를 지정하는데, 보통 이메일 주소를 사용합니다.

ssh keygen 결과

위의 명령어를 치게 되면 다음과 같이 나오게 됩니다.

Enter file in which to save the key에서는 SSH 키를 어느 경로에 저장할지 설정합니다.

Enter passphrase (empty for no passphrase) : 비밀번호를 설정하는 건데, github에 push나 pull을 할 때 비밀번호가 필요하게 됩니다. 저는 자동 커밋을 구현하려고 하기 때문에 비밀번호를 설정하지 않고 그냥 enter를 눌렀습니다.

Enter same passphrase again: 비밀번호를 동일하게 한 번 더 눌러줍니다. 저는 마찬가지로 엔터로 넘어갔습니다.

 

그 이후에 'SHA256 ~~~' 하고 키가 나오게 되는데 이 키를 복사해서 github ssh에 추가해줍니다.

 

2. Github에서 SSH키 추가하기

github에 들어가서 우측 상단에 프로필 사진을 누르면 다음과 같은 메뉴바가 나오게 됩니다.

sidebar → settings

좌측 탭에 Access → SSH and GPG keys를 눌러줍니다.

access → ssh and gpg keys

우측 상단의 New SSH Key 버튼을 눌러줍니다.

new ssh keys

Title에는 본인이 식별할 수 있는 SSH key의 이름을 넣고 Key에는 방금 복사한 키를 붙여넣어 줍니다. 그리고 Add SSH Key 버튼을 클릭해 줍니다.

ssh keys

3. Git Clone으로 사용할 Repository 클론받기

git clone으로 사용할 repository를 클론 받아줍니다.

4.  Amazon Linux에 crontab 패키지 설치하기

다음 명령어를 사용해 cronie 패키지를 설치할 수 있습니다. (amazon linux가 아닌 다른 linux는 다른 명령어를 사용해야할 수도 있습니다!)

sudo yum install -y cronie
  • sudo는 'superuser do'의 약자로, 루트 권한을 가지고 명령을 실행하도록 해줍니다.
  • yum은 Yellowdog Updater, Modified의 약자로 Red Hat 계열의 리눅스 배포판에서 소프트웨어 패키지를 설치, 업데이트, 제거하기 위한 패키지 관리자입니다.
  • -y 옵션은 'yes'의 약자로, 설치 과정 중에 나타나는 모든 질문에 대해 'yes'로 자동 응답하겠다는 뜻입니다. 즉, 사용자의 수동 확인 없이도 패키지를 설치할 수 있도록 해줍니다.


설치가 완료되면, crond 서비스를 시작할 수 있습니다

sudo service crond start
  • 이 명령어는 'crond'라는 서비스를 시작하는 것을 요청하는 명령입니다. 
  • 여기서 crond는 cron daemon의 줄임말로, 백그라운드에서 실행되며 사용자가 지정한 시간에 지정한 작업을 실행하는 역할을 합니다.
  • service 명령어는 시스템 서비스를 관리하는 데 사용되며, 서비스의 시작, 중지, 재시작 등을 수행할 수 있습니다. 이 경우, service 명령어를 이용해 'crond' 서비스를 시작하도록 요청하는 것입니다.
  • 'crond'는 'cronie' 패키지의 일부로 설치되는데, 'cronie' 패키지를 설치하면 시스템에 'crond' 서비스가 추가됩니다. 따라서 sudo yum install -y cronie 명령어를 실행한 후에는 sudo service crond start 명령어를 이용해 'crond' 서비스를 시작할 수 있습니다.

5. github에 올릴 파일 작성하기

저는 ~/laboratory/laboratory 경로의 repository에서 test2.md라는 파일을 작성했습니다.

 

6. crontab script 작성하기

그리고 ~/scripts/ 경로에 git-push1.sh라는 스크립트 파일을 만들었습니다. 내용은 다음과 같습니다.

cd /home/ec2-user/laboratory/laboratory

git checkout main

git add test2.md

git commit -m "main에 commit test"

git push origin main

(crontab -l | grep -v -F "/home/ec2-user/scripts/git-push1.sh") | crontab -

내용을 살펴보면, cd 명령어로 경로를 이동하고, git 과 관련한 add, commit, push 작업을 적어줍니다. 

마지막 커맨드는 작업이 끝난 후 crontab 리스트에 올라와있는 작업을 제거하는 명령어입니다. 상세하게 분석하면 다음과 같습니다.

  • crontab -l 명령어는 현재 사용자의 crontab에 등록된 모든 작업을 리스트로 출력합니다.
  • grep -v -F "/home/ec2-user/scripts/git-push1.sh" 명령어는 입력 받은 내용 중에서 "/home/ec2-user/scripts/git-push1.sh" 문자열이 포함된 줄을 제외하고 출력합니다. 여기서 -v 옵션은 "invert"의 약자로, 패턴과 일치하는 줄이 아닌 줄을 선택하라는 뜻이고, -F 옵션은 패턴을 고정 문자열로 처리하라는 뜻입니다.
  • | 기호는 파이프라고 부르는 리다이렉션 연산자로, 앞의 명령어의 출력을 뒤의 명령어의 입력으로 전달합니다.
  • 마지막의 crontab - 명령어는 표준 입력으로 받은 내용을 새로운 crontab으로 설정하라는 뜻입니다. 여기서 - 기호는 표준 입력을 나타냅니다.

7. crontab 리스트에 추가하여 스크립트에 실행하기

crontab -e

 

Crontab은 UNIX와 UNIX-like 시스템에서 시간 기반의 작업 스케줄링을 담당하는 유틸리티입니다. 이를 통해 정해진 시간에 특정 작업을 자동으로 실행하도록 설정할 수 있습니다. 각 사용자는 자신만의 crontab 파일을 가지고 있으며, 이 파일에는 스케줄링할 작업들이 저장됩니다.

crontab -e 명령어를 실행하면, 시스템에서 기본적으로 설정된 텍스트 에디터(예: vi, nano 등)가 실행되고 사용자의 crontab 파일이 열립니다. 이 파일에서 각 줄은 하나의 크론 작업을 나타내며, 다음과 같은 형식으로 작성됩니다

*     *     *   *    *        command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of the week (0 - 6) (Sunday=0)
|     |     |   +------- month (1 - 12)
|     |     +--------- day of the month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

저는 다음과 같은 명령어로 crontab -e에 스크립트를 추가하였습니다.

20 6 * * * /bin/bash /home/ec2-user/scripts/git-push1.sh

이 명령어는 "매일 오전 6시 20분에 /home/ec2-user/scripts/git-push1.sh 스크립트를 bash 쉘을 사용하여 실행하라"는 작업을 스케줄링합니다. 여기서 /bin/bash는 bash 쉘의 경로를 가리킵니다.

 

그리고 앞의 시간은 한국 시간이 아닌 UTC 시간을 기준으로 하니 참고해 주시기 바랍니다!

github에 커밋이 잘 올라간 모습

crontab으로 실행한 파일이 자동적으로 저의 github에 잘 올라간 모습을 보실 수 있습니다.

728x90
반응형
Comments