Ssoon
2주 : GitHub Actions CI/CD : 1 본문
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 시스템을 도입하면, 배포 자동화와 일관성을 보장하고, 문제를 사전에 예방할 수 있습니다. 자동화된 배포 시스템을 통해 배포 과정에서 발생할 수 있는 오류를 줄이고, 개발자들이 보다 효율적으로 작업할 수 있는 환경을 만들 수 있습니다.
'CICD 맛보기' 카테고리의 다른 글
3주차 - Jenkins CI/ArgoCD + K8S : 실습환경 (0) | 2024.12.16 |
---|---|
2주 : GitHub Actions CI/CD : 2 (1) | 2024.12.12 |
1주 : Jenkins CI/CD + Docker : 4 (2) | 2024.12.05 |
1주 : Jenkins CI/CD + Docker : 3 (0) | 2024.12.04 |
1주 : Jenkins CI/CD + Docker : 2 (0) | 2024.12.03 |
Comments