Ssoon

2주 : GitHub Actions CI/CD : 1 본문

CICD 맛보기

2주 : GitHub Actions CI/CD : 1

구구달스 2024. 12. 11. 23:15
CloudNet@ 가시다님이 진행하는 CI/CD 맛보기 스터디

수동으로 코드 수정 후 배포

🧿 실습환경

  • EC2(Ubuntu) 1대 
  • 현재 시스템에 설치된 Python 3의 버전을 확인합니다.
ubuntu@MyServer:~$ python3 -V
Python 3.10.12

  • 간단한 HTTP 서버를 Python으로 작성하는 프로그램입니다
ubuntu@MyServer:~$ cat > server.py <<EOF
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from datetime import datetime

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        now = datetime.now()
        response_string = now.strftime("The time is %-I:%M:%S %p, CloudNeta Study.\n")
        self.wfile.write(bytes(response_string, "utf-8"))

def startServer():
    try:
        server = ThreadingHTTPServer(('', 80), RequestHandler)
        print("Listening on " + ":".join(map(str, server.server_address)))
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()

if __name__== "__main__":
    startServer()
EOF

  • Python 서버는 정상적으로 80번 포트에서 동작 중이며, 브라우저나 curl로 접근하면 현재 시간과 메시지를 반환합니다.
  • sudo ss -tnlp를 통해 Python 서버가 포트를 점유하고 요청을 받을 준비가 된 것을 확인할 수 있습니다.
ubuntu@MyServer:~$ curl localhost
The time is 7:59:21 PM, CloudNeta Study.

ubuntu@MyServer:~$ sudo python3 server.py
Listening on 0.0.0.0:80
127.0.0.1 - - [11/Dec/2024 19:59:21] "GET / HTTP/1.1" 200 -

ubuntu@MyServer:~$ sudo ss -tnlp
State      Recv-Q      Send-Q           Local Address:Port           Peer Address:Port     Process
LISTEN     0           128                    0.0.0.0:22                  0.0.0.0:*         users:(("sshd",pid=709,fd=3))
LISTEN     0           5                      0.0.0.0:80                  0.0.0.0:*         users:(("python3",pid=2086,fd=3))
LISTEN     0           4096             127.0.0.53%lo:53                  0.0.0.0:*         users:(("systemd-resolve",pid=351,fd=14))
LISTEN     0           128                       [::]:22                     [::]:*         users:(("sshd",pid=709,fd=4))

🧿 Github 토큰 발급


  • GitHub에서 select scope는 애플리케이션이나 액세스 토큰을 생성할 때 권한 범위(Scope) 를 설정하는 과정입니다.이를 통해 어떤 리소스와 작업에 대해 접근을 허용할지 세부적으로 제어할 수 있습니다.

repo 스코프 (리포지토리 관련 권한)

  • repo 스코프는 프라이빗 리포지토리와 퍼블릭 리포지토리에 대한 읽기/쓰기/삭제 권한을 제공합니다.

workflow 스코프 (GitHub Actions 관련 권한)

  • workflow 스코프는 GitHub Actions 워크플로우 파일과 실행 권한을 관리합니다.

  • Personal Access Token (PAT) 은 GitHub에서 비밀번호 대신 사용할 수 있는 비밀 키입니다.
    • GitHub API 또는 Git을 사용할 때 인증 수단으로 사용되며, 비밀번호보다 안전하고 세부적으로 권한을 제어할 수 있습니다.

  • Private Repo 를 생성합니다.

 


  • EC2(Ubuntu) 에서 Git 작업을 합니다.
  • GitHub에서 kschoi728-naver 계정의 cicd-2w 리포지토리를 로컬 컴퓨터로 복제(clone)합니다.
  • 이 명령으로 해당 리포지토리의 모든 파일과 버전 기록을 다운로드합니다.
ubuntu@MyServer:~$ git clone https://github.com/kschoi728-naver/cicd-2w.git
Cloning into 'cicd-2w'...
Username for 'https://github.com': kschoi728-naver
Password for 'https://kschoi728-naver@github.com': ghp_r9RFYW3p8j2NVL9aEu2dYEbUovall82_____
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (4/4), done.
  • 클론한 리포지토리(cicd-2w/)에 기존 서버 스크립트 파일인 server.py를 복사한 후 해당 디렉토리로 이동합니다.
ubuntu@MyServer:~$ tree cicd-2w/
cicd-2w/
└── README.md

0 directories, 1 file

ubuntu@MyServer:~$ cp server.py cicd-2w/

ubuntu@MyServer:~$ cd cicd-2w/

  • Git 상태 확인: git status로 현재 상태를 확인했으며, server.py가 추적되지 않은 파일임을 확인.
  • 파일 추가: git add . 명령어로 추적되지 않은 모든 파일을 Git 스테이징 영역에 추가.
  • 사용자 정보 설정: Git 커밋에서 사용할 사용자 이메일과 이름을 설정.
  • 커밋: git commit -m "first commit" 명령어로 스테이징된 변경 사항을 커밋.
  • 푸시: git push origin main 명령어로 변경 내용을 원격 저장소에 업로드.
ubuntu@MyServer:~/cicd-2w$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        server.py

nothing added to commit but untracked files present (use "git add" to track)

ubuntu@MyServer:~/cicd-2w$ git add .

ubuntu@MyServer:~/cicd-2w$ git config --global user.email "kschoi728@naver.com"
ubuntu@MyServer:~/cicd-2w$ git config --global user.name "kschoi728-naver"

ubuntu@MyServer:~/cicd-2w$ git commit -m "first commit"
[main caec477] first commit
 1 file changed, 22 insertions(+)
 create mode 100644 server.py

ubuntu@MyServer:~/cicd-2w$ git push origin main
Username for 'https://github.com': kschoi728-naver
Password for 'https://kschoi728-naver@github.com':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 692 bytes | 692.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/kschoi728-naver/cicd-2w.git
   de31dd2..caec477  main -> main
  • Github 에서 확인합니다.


  • Python 서버 스크립트(server.py)를 백그라운드에서 실행하며, 터미널 종료 후에도 계속 실행합니다.
  • 표준 출력(stdout)과 표준 에러(stderr)를 server.log 파일에 기록합니다.
ubuntu@MyServer:~$ nohup sudo python3 server.py > server.log 2>&1 &
[1] 2252

ubuntu@MyServer:~$ cat server.log
nohup: ignoring input

ubuntu@MyServer:~$ curl localhost
The time is 8:41:14 PM, CloudNeta Study.
ubuntu@MyServer:~$ curl localhost
The time is 8:41:15 PM, CloudNeta Study.
ubuntu@MyServer:~$ curl localhost
The time is 8:41:16 PM, CloudNeta Study.

ubuntu@MyServer:~$ cat server.log
nohup: ignoring input
127.0.0.1 - - [11/Dec/2024 20:41:14] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [11/Dec/2024 20:41:15] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [11/Dec/2024 20:41:16] "GET / HTTP/1.1" 200 -
  • .gitignore 파일은 Git이 추적하지 않도록 설정할 파일이나 디렉토리를 지정하는 파일입니다. 즉, Git이 해당 파일을 버전 관리에서 제외하도록 설정합니다.
ubuntu@MyServer:~/cicd-2w$ grep log .gitignore
# Installer logs
pip-log.txt
*.log
  • server.py 파일 내에서 모든 "CloudNeta"를 "CICD"로 변경합니다.
ubuntu@MyServer:~/cicd-2w$ sed -i "s/CloudNeta/CICD/g" server.py
  • sudo ss -tnlp로 80번 포트를 사용하는 python3 프로세스를 찾았습니다.
  • sudo fuser -k -n tcp 80 명령어로 해당 프로세스를 종료했습니다.
  • 종료 후, 다시 ss -tnlp 명령어를 실행하여 80번 포트를 사용하는 프로세스가 없음을 확인했습니다.
ubuntu@MyServer:~/cicd-2w$ sudo ss -tnlp
State      Recv-Q      Send-Q           Local Address:Port           Peer Address:Port     Process
LISTEN     0           128                    0.0.0.0:22                  0.0.0.0:*         users:(("sshd",pid=709,fd=3))
LISTEN     0           5                      0.0.0.0:80                  0.0.0.0:*         users:(("python3",pid=2254,fd=3))
LISTEN     0           4096             127.0.0.53%lo:53                  0.0.0.0:*         users:(("systemd-resolve",pid=351,fd=14))
LISTEN     0           128                       [::]:22                     [::]:*         users:(("sshd",pid=709,fd=4))
ubuntu@MyServer:~/cicd-2w$ sudo fuser -k -n tcp 80
80/tcp:               2254
ubuntu@MyServer:~/cicd-2w$ sudo ss -tnlp
State      Recv-Q      Send-Q           Local Address:Port           Peer Address:Port     Process
LISTEN     0           128                    0.0.0.0:22                  0.0.0.0:*         users:(("sshd",pid=709,fd=3))
LISTEN     0           4096             127.0.0.53%lo:53                  0.0.0.0:*         users:(("systemd-resolve",pid=351,fd=14))
LISTEN     0           128                       [::]:22                     [::]:*         users:(("sshd",pid=709,fd=4))
  • 다시 Python 서버 스크립트(server.py)를 백그라운드에서 실행하고, 변경된 내용을 확인합니다.
ubuntu@MyServer:~/cicd-2w$ nohup sudo python3 server.py > server.log 2>&1 &
[1] 2283

ubuntu@MyServer:~/cicd-2w$ curl localhost
The time is 8:52:31 PM, CICD Study.
  • 파일을 추가하고, 커밋하고, 원격 저장소로 푸시합니다.
  • 로컬 저장소의 커밋을 원격 저장소(origin의 main 브랜치)로 푸시하여 동기화합니다.
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "version update" && git push origin main
[main 5d2542c] version update
 1 file changed, 1 insertion(+), 1 deletion(-)
 
ubuntu@MyServer:~/cicd-2w$ git push origin main
Username for 'https://github.com': kschoi728-naver
Password for 'https://kschoi728-naver@github.com':
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 286 bytes | 286.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/kschoi728-naver/cicd-2w.git
   caec477..5d2542c  main -> main

 


수동으로 코드 수정 후 배포까지 반복하는 것은 시간이 많이 소모되고, 실수나 오류를 유발할 수 있는 비효율적인 과정입니다. 이를 해결하기 위해 CI/CD 시스템을 도입하면, 배포 자동화와 일관성을 보장하고, 문제를 사전에 예방할 수 있습니다. 자동화된 배포 시스템을 통해 배포 과정에서 발생할 수 있는 오류를 줄이고, 개발자들이 보다 효율적으로 작업할 수 있는 환경을 만들 수 있습니다.

Comments