Ssoon

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

CICD 맛보기

2주 : GitHub Actions CI/CD : 2

구구달스 2024. 12. 12. 21:28
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: 특정 시간에 주기적으로 실행할 때
  • 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 를 확인합니다.

 

Comments