Ssoon
2주 : GitHub Actions CI/CD : 2 본문
CloudNet@ 가시다님이 진행하는 CI/CD 맛보기 스터디
✅ GitHub Actions
GitHub Actions는 GitHub에서 제공하는 자동화 도구로, 소프트웨어 개발과 관련된 반복적인 작업을 자동화할 수 있습니다. 코드 변경이 있을 때마다 테스트를 실행하거나, 코드를 빌드하여 배포하는 등의 작업을 설정할 수 있습니다.
- Workflow (워크플로):
- Workflow는 자동화된 작업의 집합입니다. 예를 들어, "코드가 푸시될 때마다 테스트를 실행하고 배포하는" 작업을 하나의 워크플로로 설정할 수 있습니다.
- 워크플로는 .github/workflows 폴더에 YAML 파일로 저장됩니다.
- Event (이벤트):
- Event는 워크플로를 트리거하는 조건입니다. 예를 들어, push 이벤트는 코드가 GitHub에 푸시될 때 워크플로가 실행되도록 합니다.
- 워크플로는 다양한 이벤트에 반응할 수 있습니다. 예를 들어, pull_request (PR 요청), issues (이슈 작성), workflow_dispatch (수동 실행) 등이 있습니다.
- Job (잡):
- Job은 워크플로 내에서 실행되는 작업입니다. 예를 들어, "테스트 실행", "코드 빌드", "배포" 등 각 작업은 하나의 Job으로 정의됩니다.
- 여러 작업은 병렬로 실행할 수도 있고, 순차적으로 실행할 수도 있습니다.
- Steps (스텝):
- 각 Job은 여러 개의 Step으로 구성됩니다. Step은 실제로 실행되는 명령어입니다.
- 예를 들어, "코드 체크아웃", "의존성 설치", "테스트 실행" 등의 작업이 Step입니다.
- Actions (액션):
- Actions는 GitHub Actions에서 재사용 가능한 작업 단위입니다. 예를 들어, actions/checkout은 GitHub 리포지토리의 코드를 체크아웃하는 액션입니다.
- 사용자는 GitHub Marketplace에서 다양한 액션을 찾아서 사용할 수 있습니다.
- Runner:
- Runner는 GitHub Actions 워크플로를 실행하는 환경입니다. GitHub는 GitHub-hosted runner(GitHub에서 관리하는 실행 환경)를 제공하며, 사용자는 self-hosted runner(자체 서버)를 설정할 수도 있습니다.
🧿 GitHub Actions 워크플로 YAML 파일의 주요 구성 요소
- name (옵션):
- 워크플로의 이름을 설정합니다. 이 이름은 GitHub Actions UI에 표시됩니다.
- on (필수):
- 워크플로를 실행할 이벤트를 정의합니다. GitHub에서 특정 작업이 발생할 때마다 이 워크플로가 실행됩니다.
- push: 코드를 푸시할 때
- pull_request: 풀 리퀘스트가 생성될 때
- workflow_dispatch: 수동으로 워크플로를 실행할 때
- schedule: 특정 시간에 주기적으로 실행할 때
- 워크플로를 실행할 이벤트를 정의합니다. GitHub에서 특정 작업이 발생할 때마다 이 워크플로가 실행됩니다.
- jobs (필수):
- jobs는 워크플로 내에서 실행되는 여러 작업을 정의합니다. 각 작업은 독립적으로 실행되며, 병렬 또는 순차적으로 실행할 수 있습니다.
- 하나의 워크플로에 여러 개의 잡을 정의할 수 있습니다. 각 job은 runs-on을 통해 어떤 환경에서 실행될지 설정할 수 있습니다.
- runs-on (필수):
- 작업이 실행될 환경을 정의합니다. GitHub에서 제공하는 호스팅된 실행 환경을 사용할 수 있습니다.
- steps (필수):
- steps는 job 내에서 실행될 개별 작업을 정의합니다. 각 스텝은 명령어를 실행하는 하나의 단위입니다.
- 각 스텝은 name (스텝 이름), run (실행할 명령어), 또는 uses (다른 GitHub 액션을 사용) 등을 포함할 수 있습니다.
✅ GitHub Actions 으로 CI/CD 자동화 작업 실행
🧿 GitHub Actions Secrets
- GitHub의 Actions Secrets는 워크플로우에서 사용되는 민감한 정보를 안전하게 저장하고 관리하는 기능입니다.
- 워크플로우 파일에서 ${{ secrets.SECRET_NAME }} 형식으로 쉽게 참조할 수 있습니다.
- SSH_PRIVATE_KEY (EC2 pem키) secrets 를 생성합니다.
- EC2_PIP (EC2 퍼블릭IP) secrets 를 생성합니다.
- Repository secrets : 특정 리포지토리에서만 사용 가능
- .github/workflows/ 디렉토리는 GitHub Actions 워크플로우 파일들을 저장하는 표준 위치입니다.
- .github/workflows/deploy.yaml 파일은 GitHub Actions의 핵심 설정 파일로, CI/CD(지속적 통합/지속적 배포) 프로세스를 정의하는 파일입니다. 이 파일은 YAML 형식으로 작성되며, 자동화하고 싶은 워크플로우의 모든 단계를 상세하게 설명합니다.
ubuntu@MyServer:~/cicd-2w$ mkdir -p .github/workflows/
ubuntu@MyServer:~/cicd-2w$ touch .github/workflows/deploy.yaml
ubuntu@MyServer:~/cicd-2w$ ls -al
total 32
drwxrwxr-x 4 ubuntu ubuntu 4096 Dec 11 21:09 .
drwxr-x--- 5 ubuntu ubuntu 4096 Dec 11 20:55 ..
drwxrwxr-x 8 ubuntu ubuntu 4096 Dec 11 20:54 .git
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec 11 21:09 .github
-rw-rw-r-- 1 ubuntu ubuntu 3139 Dec 11 20:31 .gitignore
-rw-rw-r-- 1 ubuntu ubuntu 9 Dec 11 20:31 README.md
-rw-rw-r-- 1 ubuntu ubuntu 339 Dec 11 21:09 server.log
-rw-rw-r-- 1 ubuntu ubuntu 750 Dec 11 20:51 server.py
🧿 .github/workflows/deploy.yaml
- 이름: CICD1
- 트리거 조건:
- workflow_dispatch: 수동으로 워크플로우 실행 가능
- push: main 브랜치에 push될 때 자동 실행
- 실행 환경
- runs-on: ubuntu-latest: 우분투 최신 버전 환경에서 실행
1단계: SSH 개인 키 설정
- SSH 접속을 위한 개인 키를 안전하게 생성
- 키의 권한을 600(소유자만 읽기/쓰기 가능)으로 설정
2단 계: SSH 호스트 키 체크 비활성화
- 처음 연결하는 호스트에 대한 보안 체크를 해제
- 자동화 스크립트에서 호스트 키 확인 생략
3단계: Git Pull
- EC2 서버의 IP 주소를 환경 변수로 설정
- SSH로 서버 접속
- /home/ubuntu/cicd-2w 디렉토리로 이동
- main 브랜치에서 최신 코드 pull
- 실패 시 스크립트 중단
4단계: 서비스 실행
- 80번 포트에서 실행 중인 프로세스 강제 종료
- nohup을 사용해 서버 스크립트 백그라운드 실행
- 로그는 server.log에 저장
- sudo -E로 환경 변수 유지
name: CICD1
on:
workflow_dispatch:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Configure the SSH Private Key Secret
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
- name: Set Strict Host Key Checking
run: echo "StrictHostKeyChecking=no" > ~/.ssh/config
- name: Git Pull
run: |
export MY_HOST="${{ secrets.EC2_PIP }}"
ssh ubuntu@$MY_HOST << EOF
cd /home/ubuntu/cicd-2w || exit 1
git pull origin main || exit 1
EOF
- name: Run service
run: |
export MY_HOST="${{ secrets.EC2_PIP }}"
ssh ubuntu@$MY_HOST sudo fuser -k -n tcp 80 || true
ssh ubuntu@$MY_HOST "nohup sudo -E python3 /home/ubuntu/cicd-2w/server.py > /home/ubuntu/cicd-2w/server.log 2>&1 &"
- server.py 파일 내의 모든 "CICD" 텍스트를 "CICD 2w" 로 대체합니다.
- Git을 사용하여 변경된 모든 파일을 스테이징하고, 커밋하며, 원격 저장소의 main 브랜치로 푸시합니다.
ubuntu@MyServer:~/cicd-2w$ sed -i -e "s/CICD/CICD 2w/g" server.py
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "add workflow" && git push origin main
[main 82eb684] add workflow
2 files changed, 34 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/deploy.yaml
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 892 bytes | 892.00 KiB/s, done.
Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/kschoi728-naver/cicd-2w.git
5d2542c..82eb684 main -> main
- Github 에서 변경사항을 확인합니다.
- Github Actions 에 workflow 를 확인합니다.
- 현재 실행 중인 server.py 프로세스 확인합니다.
- 서버가 정상적으로 실행 중이며 서버 로그을 확인합니다.
ubuntu@MyServer:~/cicd-2w$ grep -i cicd server.py
response_string = now.strftime("The time is %-I:%M:%S %p, CICD 2w Study.\n")
ubuntu@MyServer:~/cicd-2w$ sudo ps -ef |grep server.py
root 3202 1 0 21:16 ? 00:00:00 sudo -E python3 /home/ubuntu/cicd-2w/server.py
root 3203 3202 0 21:16 ? 00:00:00 python3 /home/ubuntu/cicd-2w/server.py
ubuntu 3270 2771 0 21:18 pts/3 00:00:00 grep --color=auto server.py
ubuntu@MyServer:~/cicd-2w$ curl localhost
The time is 9:18:56 PM, CICD 2w Study.
ubuntu@MyServer:~/cicd-2w$ tail /home/ubuntu/cicd-2w/server.log
127.0.0.1 - - [11/Dec/2024 21:18:56] "GET / HTTP/1.1" 200 -
- server.py 파일의 모든 "CICD 2w" 텍스트를 "CICD1 End"로 변경합니다.
ubuntu@MyServer:~/cicd-2w$ sed -i -e "s/CICD 2w/CICD1 End/g" server.py
ubuntu@MyServer:~/cicd-2w$ grep -i cicd server.py
response_string = now.strftime("The time is %-I:%M:%S %p, CICD1 End Study.\n")
🧿 .github/workflows/deploy.yaml
name: CICD1 End
on:
workflow_dispatch:
push:
branches:
- main
jobs:
deployfinal:
runs-on: ubuntu-latest
steps:
- name: Configure the SSH Private Key Secret
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
- name: Set Strict Host Key Checking
run: echo "StrictHostKeyChecking=no" > ~/.ssh/config
- name: Git Pull
run: |
export MY_HOST="${{ secrets.EC2_PIP }}"
ssh ubuntu@$MY_HOST << EOF
cd /home/ubuntu/cicd-2w || exit 1
git pull origin main || exit 1
EOF
- name: Run service
run: |
export MY_HOST="${{ secrets.EC2_PIP }}"
ssh ubuntu@$MY_HOST sudo fuser -k -n tcp 80 || true
ssh ubuntu@$MY_HOST "nohup sudo -E python3 /home/ubuntu/cicd-2w/server.py > /home/ubuntu/cicd-2w/server.log 2>&1 &"
- Git을 사용하여 변경된 모든 파일을 스테이징하고, 커밋하며, 원격 저장소의 main 브랜치로 푸시합니다.
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "edit workflow" && git push origin main
[main dd40f4d] edit workflow
2 files changed, 3 insertions(+), 3 deletions(-)
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 536 bytes | 536.00 KiB/s, done.
Total 6 (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
82eb684..dd40f4d main -> main
- 현재 실행 중인 server.py 프로세스 확인합니다.
- 서버가 정상적으로 실행 중이며 서버 로그을 확인합니다.
ubuntu@MyServer:~/cicd-2w$ sudo ps -ef |grep server.py
root 3751 1 0 21:57 ? 00:00:00 sudo -E python3 /home/ubuntu/cicd-2w/server.py
root 3752 3751 0 21:57 ? 00:00:00 python3 /home/ubuntu/cicd-2w/server.py
ubuntu 3781 2771 0 21:58 pts/3 00:00:00 grep --color=auto server.py
ubuntu@MyServer:~/cicd-2w$ curl localhost
The time is 9:58:33 PM, CICD1 End Study.
ubuntu@MyServer:~/cicd-2w$ tail /home/ubuntu/cicd-2w/server.log
127.0.0.1 - - [11/Dec/2024 21:58:33] "GET / HTTP/1.1" 200 -
✅ GitHub Actions 에서 ‘코드 - 빌드 - 테스트’ 후 대상 서버에 전달 후 실행
🧿 GitHub Actions 파이썬 버전 확인
- 워크플로우 이름: CICD2
- 트리거 조건 (on):
- workflow_dispatch: 사용자가 GitHub Actions 페이지에서 수동으로 실행할 수 있음.
- push: main 브랜치에 코드가 푸시될 때 자동으로 실행됨.
- 작업 이름: deployfinal
- 작업(Job)은 서버나 환경에서 실행할 단위입니다.
- 작업 환경:
- runs-on: ubuntu-latest : 최신 우분투 환경에서 실행됩니다.
- 스텝 구성: 작업은 여러 **스텝(steps)**으로 구성되며, 각 스텝은 명령어를 실행하거나 특정 작업을 수행합니다.
- python -V 및 python3 -V:
- Python과 Python3의 버전을 출력합니다.
- 해당 명령어가 실패해도 워크플로우가 멈추지 않도록 || true를 사용합니다.
- which python 및 which python3:
- python과 python3 명령어가 설치된 위치를 출력합니다.
- 위치를 확인하여 Python이 제대로 설정되어 있는지 점검합니다.
- env:
- 현재 실행 환경의 모든 환경 변수를 출력합니다.
- 디버깅이나 환경 설정 확인에 유용합니다.
name: CICD2
on:
workflow_dispatch:
push:
branches:
- main
jobs:
deployfinal:
runs-on: ubuntu-latest
steps:
- name: Test
run: |
python -V || true
python3 -V || true
which python || true
which python3 || true
env
- Git을 사용하여 변경된 모든 파일을 스테이징하고, 커밋하며, 원격 저장소의 main 브랜치로 푸시합니다.
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "echo env" && git push origin main
[main c024710] echo env
1 file changed, 18 insertions(+), 33 deletions(-)
rewrite .github/workflows/deploy.yaml (85%)
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 580 bytes | 580.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/kschoi728-naver/cicd-2w.git
dd40f4d..c024710 main -> main
- Github Actions 에 workflow 를 확인합니다.
🧿 GitHub Actions에서 .gitignore 제외된 민감 파일 내용을 을 안전하게 가져와서 사용하기
- .env 파일은 민감한 정보를 담고 있으며 .gitignore 설정으로 Git에 추가되지 않음.
- Git은 민감한 정보가 푸시되지 않도록 안전 장치를 제공.
- .env 파일은 삭제하여 보안을 유지.
ubuntu@MyServer:~/cicd-2w$ cat > .env <<EOF
ACCESSKEY : 1234
SECRETKEY : 5678
EOF
ubuntu@MyServer:~/cicd-2w$ git add .env
The following paths are ignored by one of your .gitignore files:
.env
hint: Use -f if you really want to add them.
hint: Turn this message off by running
hint: "git config advice.addIgnoredFile false"
ubuntu@MyServer:~/cicd-2w$ rm -f .env
- MYKEYS secrets 를 생성합니다.
🧿 .github/workflows/deploy.yaml
- GitHub Repository Checkout
- 사용: actions/checkout@v4
- 기능: GitHub 저장소의 소스 코드를 가져와 워크플로 환경에서 사용할 수 있도록 함.
- SSH를 이용한 원격 명령 실행
- 사용: appleboy/ssh-action@v1.2.0
- 환경 변수:
- AWS_KEYS: GitHub Secrets에 저장된 값(MYKEYS)을 AWS_KEYS라는 이름의 환경 변수로 전달.
- 작업:
- 원격 서버에 SSH 접속.
- /home/ubuntu/cicd-2w 디렉토리로 이동.
- 전달받은 AWS_KEYS 값을 .env 파일에 저장
name: CICD2
on:
workflow_dispatch:
push:
branches:
- main
jobs:
ssh-deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository Checkout
uses: actions/checkout@v4
- name: executing remote ssh commands
uses: appleboy/ssh-action@v1.2.0
env:
AWS_KEYS: ${{ secrets.MYKEYS }}
with:
host: ${{ secrets.EC2_PIP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: AWS_KEYS
script_stop: true
script: |
cd /home/ubuntu/cicd-2w
echo "$AWS_KEYS" > .env
- Git을 사용하여 변경된 모든 파일을 스테이징하고, 커밋하며, 원격 저장소의 main 브랜치로 푸시합니다.
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "ssh action test" && git push origin main
[main 3cc8502] ssh action test
1 file changed, 27 insertions(+), 18 deletions(-)
rewrite .github/workflows/deploy.yaml (60%)
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 759 bytes | 759.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/kschoi728-naver/cicd-2w.git
c024710..3cc8502 main -> main
- Github Actions 에 workflow 를 확인합니다.
- ~/cicd-2w 디렉토리의 파일 및 디렉토리 내용을 확인합니다.
- env 파일의 내용도 확인합니다.
ubuntu@MyServer:~/cicd-2w$ ls -al ~/cicd-2w/
total 36
drwxrwxr-x 4 ubuntu ubuntu 4096 Dec 11 22:18 .
drwxr-x--- 6 ubuntu ubuntu 4096 Dec 11 22:18 ..
-rw-rw-r-- 1 ubuntu ubuntu 42 Dec 11 22:18 .env
drwxrwxr-x 8 ubuntu ubuntu 4096 Dec 11 22:18 .git
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec 11 21:09 .github
-rw-rw-r-- 1 ubuntu ubuntu 3139 Dec 11 20:31 .gitignore
-rw-rw-r-- 1 ubuntu ubuntu 9 Dec 11 20:31 README.md
-rw-rw-r-- 1 ubuntu ubuntu 576 Dec 11 22:05 server.log
-rw-rw-r-- 1 ubuntu ubuntu 755 Dec 11 21:56 server.py
ubuntu@MyServer:~/cicd-2w$ cat ~/cicd-2w/.env
ACCESSKEY : asdf1234
SECRETKEY : qwer1234
- Github 에서 변경사항을 확인합니다.
- MYKEYS secrets 내용를 변경합니다.
🧿 .github/workflows/deploy.yaml
- GitHub Repository Checkout
- 사용: actions/checkout@v4
- 기능: GitHub 저장소의 소스 코드를 체크아웃하여 워크플로 환경에 가져옵니다.
- SSH를 이용한 원격 명령 실행
- 사용: appleboy/ssh-action@v1.2.0
- 환경 변수:
- AWS_KEYS: GitHub Secrets로 저장된 키 정보를 환경 변수로 전달.
- 작업:
- 원격 서버에 SSH 접속.
- /home/ubuntu/cicd-2w 디렉토리로 이동.
- AWS_KEYS 값을 .env 파일로 생성.
- 포트 80에서 실행 중인 프로세스를 종료(fuser -k -n tcp 80).
- SCP를 이용한 파일 전송
- 사용: appleboy/scp-action@v0.1.7
- 작업:
- 로컬의 server.py 파일을 원격 서버의 /home/ubuntu/cicd-2w 디렉토리로 복사.
name: CICD2
on:
workflow_dispatch:
push:
branches:
- main
jobs:
scp-ssh-deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository Checkout
uses: actions/checkout@v4
- name: executing remote ssh commands
uses: appleboy/ssh-action@v1.2.0
env:
AWS_KEYS: ${{ secrets.MYKEYS }}
with:
host: ${{ secrets.EC2_PIP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: AWS_KEYS
script_stop: true
script: |
cd /home/ubuntu/cicd-2w
echo "$AWS_KEYS" > .env
sudo fuser -k -n tcp 80 || true
- name: copy file via ssh
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_PIP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: server.py
target: /home/ubuntu/cicd-2w
- Git을 사용하여 변경된 모든 파일을 스테이징하고, 커밋하며, 원격 저장소의 main 브랜치로 푸시합니다.
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "using scp ssh action" && git push origin main
[main 233b6ea] using scp ssh action
2 files changed, 13 insertions(+), 3 deletions(-)
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 2 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 656 bytes | 656.00 KiB/s, done.
Total 6 (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
3cc8502..233b6ea main -> main
- Github Actions 에 workflow 를 확인합니다.
- ~/cicd-2w 디렉토리의 파일 및 디렉토리 내용을 확인합니다.
- env 파일의 내용도 확인합니다.
ubuntu@MyServer:~/cicd-2w$ ls -al ~/cicd-2w/
total 36
drwxrwxr-x 4 ubuntu ubuntu 4096 Dec 11 22:27 .
drwxr-x--- 6 ubuntu ubuntu 4096 Dec 11 22:27 ..
-rw-rw-r-- 1 ubuntu ubuntu 48 Dec 11 22:27 .env
drwxrwxr-x 8 ubuntu ubuntu 4096 Dec 11 22:27 .git
drwxrwxr-x 3 ubuntu ubuntu 4096 Dec 11 21:09 .github
-rw-rw-r-- 1 ubuntu ubuntu 3139 Dec 11 20:31 .gitignore
-rw-rw-r-- 1 ubuntu ubuntu 9 Dec 11 20:31 README.md
-rw-rw-r-- 1 ubuntu ubuntu 576 Dec 11 22:05 server.log
-rw-r--r-- 1 ubuntu ubuntu 748 Dec 11 22:27 server.py
ubuntu@MyServer:~/cicd-2w$ cat ~/cicd-2w/server.py | grep SCP
response_string = now.strftime("The time is %-I:%M:%S %p, SCP Test.\n")
ubuntu@MyServer:~/cicd-2w$ cat ~/cicd-2w/.env
ACCESSKEY : asdf1234end
SECRETKEY : qwer1234end
🧿 github action 에서 코드 가져오고 변경된 py 파일을 전송 후 기존 서비스 중지 후 재기동
- server.py 파일의 모든 "CICD2 END" 텍스트를 "SCP Test"로 변경합니다.
ubuntu@MyServer:~/cicd-2w$ sed -i -e "s/SCP Test/CICD2 END/g" server.py
ubuntu@MyServer:~/cicd-2w$ cat ~/cicd-2w/server.py | grep CICD
response_string = now.strftime("The time is %-I:%M:%S %p, CICD2 END.\n")
🧿 .github/workflows/deploy.yaml
- GitHub 저장소 체크아웃
- 사용: actions/checkout@v4
- 기능: GitHub 저장소의 소스 코드를 Actions 실행 환경으로 가져옴.
- 파일 복사
- 사용: appleboy/scp-action@v0.1.7
- 목적:
- 로컬의 server.py 파일을 원격 서버(/home/ubuntu)에 복사.
- 세부 사항:
- 호스트: 원격 서버 주소(secrets.EC2_PIP).
- 계정: ubuntu.
- SSH 키: secrets.SSH_PRIVATE_KEY.
- 원격 명령 실행
- 사용: appleboy/ssh-action@v1.2.0.
- 환경 변수: GitHub Secrets에서 전달된 MYKEYS 값이 AWS_KEYS 환경 변수로 설정.
- /home/ubuntu/cicd-2w 디렉토리로 이동
- 기존의 server.py 제거 후 새로 복사한 파일 적용
- 80번 포트를 사용하는 프로세스 종료
- 서비스 재시작
- 테스트 로그 생성
name: CICD2
on:
workflow_dispatch:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Github Repository Checkout
uses: actions/checkout@v4
- name: copy file via ssh
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_PIP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: server.py
target: /home/ubuntu
- name: executing remote ssh commands
uses: appleboy/ssh-action@v1.2.0
env:
AWS_KEYS: ${{ secrets.MYKEYS }}
with:
host: ${{ secrets.EC2_PIP }}
username: ubuntu
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: AWS_KEYS
script_stop: true
script: |
cd /home/ubuntu/cicd-2w
echo "$AWS_KEYS" > .env
sudo fuser -k -n tcp 80 || true
rm server.py
cp /home/ubuntu/server.py ./
nohup sudo -E python3 /home/ubuntu/cicd-2w/server.py > /home/ubuntu/cicd-2w/server.log 2>&1 &
echo "test" >> /home/ubuntu/text.txt
- Git을 사용하여 변경된 모든 파일을 스테이징하고, 커밋하며, 원격 저장소의 main 브랜치로 푸시합니다.
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "Deploy CICD2 Final" && git push origin main
[main c6c85e7] Deploy CICD2 Final
1 file changed, 1 insertion(+), 1 deletion(-)
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), 304 bytes | 101.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
233b6ea..c6c85e7 main -> main
- Github Actions 에 workflow 를 확인합니다.
- web 접속을 확인합니다.
- /home/ubuntu/text.txt 파일의 내용을 확인합니다. : text.txt 파일에 test라는 문자열을 추가
ubuntu@MyServer:~/cicd-2w$ cat /home/ubuntu/text.txt
test
- Github Actions 에 workflow 를 한번 더 실행합니다.
- 파일이 누적적으로 업데이트되며, 워크플로가 매번 실행될 때마다 test가 추가됩니다.
ubuntu@MyServer:~/cicd-2w$ cat /home/ubuntu/text.txt
test
test
✅ GitHub Actions with Ansible
🧿 .github/workflows/deploy.yaml
- Github Repository Checkout
- GitHub 리포지토리에서 코드 파일을 체크아웃합니다.
- actions/checkout@v4를 사용하여 리포지토리의 최신 상태를 워크플로 실행 환경에 가져옵니다.
- Setup Python 3
- Python 3.8 버전을 환경에 설치합니다.
- actions/setup-python@v5를 사용하여 Python 환경을 설정합니다.
- Upgrade Pip & Install Ansible
- Python의 패키지 관리자인 pip을 최신 버전으로 업데이트하고, 그 후 Ansible을 설치합니다.
- python -m pip install --upgrade pip로 pip을 업그레이드하고, python -m pip install ansible로 Ansible을 설치합니다.
- Implement the Private SSH Key
- GitHub의 비공개 SSH 키를 사용하여 SSH 연결을 설정할 수 있도록 합니다.
- secrets.SSH_PRIVATE_KEY는 GitHub Secrets에 저장된 SSH 비공개 키입니다.
- 이 키를 ~/.ssh/id_rsa에 저장하고, 권한을 600으로 설정하여 SSH 연결을 안전하게 사용할 수 있도록 합니다.
- Ansible Inventory File for Remote Host
- Ansible 인벤토리 파일을 생성하여 원격 서버의 IP 주소를 정의합니다.
- ${{ secrets.EC2_PIP }}는 GitHub Secrets에 저장된 EC2 서버의 IP 주소로, 이를 인벤토리 파일에 추가합니다.
- Ansible Default Configuration File
- Ansible 설정 파일(ansible.cfg)을 작성하여 기본 설정을 적용합니다.
- 이 파일에서는 Python 인터프리터 경로, SSH 비공개 키 파일, 원격 사용자 이름 등을 설정합니다.
- Ping Ansible Hosts
- Ansible의 ping 모듈을 사용하여 설정한 인벤토리 파일에 포함된 모든 원격 호스트가 연결 가능한지 확인합니다.
- ansible all -m ping 명령어를 사용하여 Ansible이 원격 호스트들과 정상적으로 연결되는지 테스트합니다.
name: Run Ansible
on:
workflow_dispatch:
push:
branches:
- main
jobs:
run-playbooks:
runs-on: ubuntu-latest
steps:
- name: Github Repository Checkout
uses: actions/checkout@v4
- name: Setup Python 3
uses: actions/setup-python@v5
with:
python-version: "3.8"
- name: Upgrade Pip & Install Ansible
run: |
python -m pip install --upgrade pip
python -m pip install ansible
- name: Implement the Private SSH Key
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
- name: Ansible Inventory File for Remote host
run: |
mkdir -p ./devops/ansible/
export INVENTORY_FILE=./devops/ansible/inventory.ini
echo "[my_host_group]" > $INVENTORY_FILE
echo "${{ secrets.EC2_PIP }}" >> $INVENTORY_FILE
- name: Ansible Default Configuration File
run: |
mkdir -p ./devops/ansible/
cat <<EOF > ./devops/ansible/ansible.cfg
[defaults]
ansible_python_interpreter = '/usr/bin/python3'
ansible_ssh_private_key_file = ~/.ssh/id_rsa
remote_user = ubuntu
inventory = ./inventory.ini
host_key_checking = False
EOF
- name: Ping Ansible Hosts
working-directory: ./devops/ansible/
run: |
ansible all -m ping
# - name: Run Ansible Playbooks
# working-directory: ./devops/ansible/
# run: |
# ansible-playbook install-nginx.yaml
# - name: Deploy Python via Ansible
# working-directory: ./devops/ansible/
# run: |
# ansible-playbook deploy-python.yaml
- Git을 사용하여 변경된 모든 파일을 스테이징하고, 커밋하며, 원격 저장소의 main 브랜치로 푸시합니다.
ubuntu@MyServer:~/cicd-2w$ git add . && git commit -m "Deploy Ansible Test" && git push origin main
[main b67f6ac] Deploy Ansible Test
1 file changed, 63 insertions(+), 41 deletions(-)
rewrite .github/workflows/deploy.yaml (82%)
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 1.08 KiB | 1.08 MiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/kschoi728-naver/cicd-2w.git
7a4b50c..b67f6ac main -> main
- Github Actions 에 workflow 를 확인합니다.
'CICD 맛보기' 카테고리의 다른 글
3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI + K8S(Kind) (2) | 2024.12.16 |
---|---|
3주차 - Jenkins CI/ArgoCD + K8S : 실습환경 (0) | 2024.12.16 |
2주 : GitHub Actions CI/CD : 1 (0) | 2024.12.11 |
1주 : Jenkins CI/CD + Docker : 4 (2) | 2024.12.05 |
1주 : Jenkins CI/CD + Docker : 3 (0) | 2024.12.04 |
Comments