쟝이의 세상
CI/CD 파이프라인 - 개발 워크플로우 본문
** 순서 **
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
✔️ Docker Hub 업로드 확인
워크플로우를 통해 Docker image가 업로드 되었는지 확인하는 작업
'자료' 카테고리의 다른 글
행정구역 경계 데이터 추출하기 (1) | 2024.12.20 |
---|---|
CI/CD 파이프라인 - 운영 워크플로우 (0) | 2024.11.11 |
VMware에서 Ubuntu를 사용하여 Kubernetes 환경 구축 (1) | 2024.11.07 |
CSRF 취약점 모의해킹 (0) | 2024.10.29 |
Metasploit을 활용하여 모의해킹 (0) | 2024.10.25 |