Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

쟝이의 세상

CI/CD 파이프라인 - 개발 워크플로우 본문

자료

CI/CD 파이프라인 - 개발 워크플로우

zyangee 2024. 11. 7. 12:11
** 순서 **
1) GitHub 레파지토리에 코드를 push 위한 작업 수행
2) GitHub 레파지토리에 코드 push
3) workflow 파일 작성
4) workflow 파일 실행 후 Docker Hub에 이미지 업로드

 

📌 GitHub에 코드 올리기

✔️ 생성한 웹 애플리케이션 코드 GitHub에 푸시하기 위한 초기 작업

$ git config --global user.name "zyangee"
$ git config --global user.email "zyangee2@gmail.com"

$ git init
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin git@github.com:zyangee/Code-repo.git

Git에서 원격 저장소 연결하는 방법은 SSH로 접근하였다.

→ 로컬 컴퓨터와 GitHub 사이에 SSH(공

개키 / 개인키 쌍)를 사용하여 인증

 

✔️ SSH 키 생성

$ ssh-keygen -t rsa -C "zyangee2@gmail.com"
$ cat ~/.ssh/id_rsa.pub
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa

 

생성한 키의 유형은 RSA 방식을 사용

→ ~/.ssh 디렉터리에 id_rsa(개인키)와 id_rsa.pub(공개키) 파일이 생성됨

$ cat ~/.ssh/id_rsa.pub

공개키의 내용을 확인하여 GitHub SSH 키 설정에 해당 내용을 복사해서 SSH 키를 생성

→ 로컬 컴퓨터에서 GitHub로 SSH 연결이 가능해짐

 

$ eval "$(ssh-agent -s)"

SSH 에이전트 실행

→ SSH 에이전트를 사용하면 SSH 키를 등록하고 자동으로 인증에 사용할 수 있어 키 입력이 반복되지 않음

$ ssh-add ~/.ssh/id_rsa

SSH 키를 에이전트에 추가

→ SSH 에이전트가 id_rsa를 관리하고, 자동으로 SSH 인증이 가능함

 

✔️ SSH 연결 확인하기

$ ssh -T git@github.com

SSH를 통해 GitHub 서버와 연결을 테스트하는 명령어

성공 결과 메시지
Hi <GitHub 사용자 이름>! You've successfully authenticated, but GitHub does not provide shell access.

 

✔️ 코드 push

$ git push -u origin main

 

📌 GitHub Actions 생성

✔️ Docker Hub에 로그인할 때 사용되는 ID/PW 생성

(Settings > Secrets and Variables > Actions)

 

✔️ workflow 생성

workflow: 자동화하는 작업 프로세스를 의미

→ 새로운 커밋이 main 브랜치에 푸시될 때마다 코드를 자동으로 실행하도록 워크 플로우를 정의

$ mkdir -p .github/workflows
$ vi .github/workflows/ci.yml

👇🏻 ci.yml 내용 확인

더보기
name: Build and Push Docker Image

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set version environment variable
        run: |
          VERSION=$(cat version.txt)
          echo "VERSION=$VERSION" >> $GITHUB_ENV

      - name: Build Docker image
        run: |
          docker build -t zyange/app-code:${{ env.VERSION }} .
          docker build -t zyange/app-code-login:${{ env.VERSION }} -f ./login/Dockerfile .
          docker build -t zyange/app-code-account:${{ env.VERSION }} -f ./account/Dockerfile .
          docker build -t zyange/app-code-loans:${{ env.VERSION }} -f ./loans/Dockerfile .

      # CD - 도커이미지 푸시
      - name: Login to Docker Hub
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

      - name: Push Docker image
        run: |
          docker tag zyange/app-code:${{ env.VERSION }} zyange/app-code:latest
          docker tag zyange/app-code-login:${{ env.VERSION }} zyange/app-code-login:latest
          docker tag zyange/app-code-account:${{ env.VERSION }} zyange/app-code-account:latest
          docker tag zyange/app-code-loans:${{ env.VERSION }} zyange/app-code-loans:latest

          docker push zyange/app-code:${{ env.VERSION }}
          docker push zyange/app-code-login:${{ env.VERSION }}
          docker push zyange/app-code-account:${{ env.VERSION }}
          docker push zyange/app-code-loans:${{ env.VERSION }}

          docker push zyange/app-code:latest
          docker push zyange/app-code-login:latest
          docker push zyange/app-code-account:latest
          docker push zyange/app-code-loans:latest

 

 

✔️ Dockerfile 생성

** 프로젝트 디렉터리 구조 **

/web

├── Dockerfile                  # 전체 애플리케이션을 위한 Docker 설정 파일
├── dbconn.php  
├── index.php  

├── login   
│   ├── Dockerfile              # /login 디렉토리의 Docker 설정 파일
│   ├── login.php  
│   ├── logout.php
│   └── register.php 

├── account  
│   ├── Dockerfile              # /account 디렉토리의 Docker 설정 파일
│   ├── account_add.php 
│   ├── transactions.php  
│   └── transfer.php 

├── loans   
│   ├── Dockerfile              # /loans 디렉토리의 Docker 설정 파일
│   ├── loan_application.php 
│   ├── loan_history.php
│   └── loan_product.php

├── javascript   
│   ├── accountAdd.js 
│   ├── register.js  
│   └── transfer.js     

├── api 
│   ├── check_account.php
│   ├── check_userid.php 
│   ├── random_account.php
│   └── transfer_account.php 

└── css
    ├── back.css   
    ├── input_account.css  
    ├── input.css 
    ├── loan.css   
    ├── transaction.css 
    └── user.css

 

1️⃣ Dockerfile

FROM php:8.0-apache
COPY . /var/www/html/
WORKDIR /var/www/html
RUN apt-get update && apt-get install -y libpg-dev \
    && docker-php-ext-install pdo pdo_pgsql
RUN a2enmod rewrite
EXPOSE 80

👇🏻 dbconn.php 파일 내용

더보기
<?php
    $serverName = getenv('POSTGRES_HOST');
    $database = getenv('POSTGRES_DB');
    $uid = getenv('POSTGRES_USER');
    $pwd = getenv('POSTGRES_PASSWORD');

    try {
        $dsn = "pgsql:host=$serverName;port=5432;dbname=$database";
        $conn = new PDO($dsn, $uid, $pwd);

        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        die("Error connecting to PostgreSQL: ". $e->getMessage());
    }
?>

2️⃣ login/Dockerfile

FROM php:8.0-apache

COPY ../dbconn.php /var/www/html/dbconn.php
COPY ../index.php /var/www/html/index.php
COPY ../javascript /var/www/html/javascript
COPY ../css /var/www/html/css
COPY ../api /var/www/html/api
COPY . /var/www/html/login

RUN docker-php-ext-install pdo pdo_mysql
RUN a2enmod rewrite
RUN echo "DocumentRoot /var/www/html/login" >> /etc/apache2/sites-available/000-default.conf
RUN echo "DirectoryIndex login.php" >> /etc/apache2/apache2.conf
CMD ["apache2ctl", "-D", "FOREGROUND"]

EXPOSE 80

3️⃣ account/Dockerfile

FROM php:8.0-apache

COPY ../dbconn.php /var/www/html/dbconn.php
COPY ../index.php /var/www/html/index.php
COPY ../javascript /var/www/html/javascript
COPY ../css /var/www/html/css
COPY ../api /var/www/html/api
COPY . /var/www/html/account

RUN docker-php-ext-install pdo pdo_mysql
RUN a2enmod rewrite
RUN echo "DocumentRoot /var/www/html/account" >> /etc/apache2/sites-available/000-default.conf
RUN echo "DirectoryIndex transactions.php" >> /etc/apache2/apache2.conf
CMD ["apache2ctl", "-D", "FOREGROUND"]

EXPOSE 80

4️⃣ loans/Dockerfile

FROM php:8.0-apache

COPY ../dbconn.php /var/www/html/dbconn.php
COPY ../index.php /var/www/html/index.php
COPY ../javascript /var/www/html/javascript
COPY ../css /var/www/html/css
COPY . /var/www/html/loans

RUN docker-php-ext-install pdo pdo_mysql
RUN a2enmod rewrite
RUN echo "DocumentRoot /var/www/html/loans" >> /etc/apache2/sites-available/000-default.conf
RUN echo "DirectoryIndex loan_product.php" >> /etc/apache2/apache2.conf
CMD ["apache2ctl", "-D", "FOREGROUND"]

EXPOSE 80

 

✔️  워크플로우 파일 업로드

$ git add .
$ git commit -m "Upload ci.yml"
$ git push origin main

워크플로우 실행 성공 화면
ci.yml 파일 정상 업로드 확인

 

✔️ Docker Hub 업로드 확인

워크플로우를 통해 Docker image가 업로드 되었는지 확인하는 작업