Github Action 을 활용한 CI/CD TEST

푸르둥개·2025년 11월 19일

문서의 목적 과 정의
Github Action을 활용한 CI/CD Pipeline TEST
팀원 모두가 자유롭게 Github Action을 사용하게 될때까지 진행해 보는게 목적임.

build 내역 및 소스 분석

GitHub Actions용 YAML 내역

name: CI/CD Pipeline

on:
  push:
    branches:
      - mytest     

jobs:
  build-test:
    environment: kdev 
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./charts/dev/test/mytest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '7.4'
    
    - name: Install Composer dependencies
      run: composer install

    - name: Install SonarQube Scanner
      run: |
        curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
        sudo apt-get install -y nodejs
        npm install -g sonar-scanner


    - name: SonarQube scan
      env:
        SONAR_TOKEN: ${{ secrets.MYTEST_SONAR_TOKEN }}
      run: |
        sonar-scanner \
          -Dsonar.projectKey=mytest \
          -Dsonar.sources=. \
          -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \
          -Dsonar.login=${{ secrets.MYTEST_SONAR_TOKEN }}

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    - name: Log in to Harbor
      run: echo "${{ secrets.HARBOR_PASSWORD }}" | docker login -u ${{ secrets.HARBOR_USERNAME }} --password-stdin https://reg-kdev.mydomain.com

    - name: Build and push Docker image
      run: |
        docker build -t reg-kdev.mydomain.com/mytest/demo:1.8 .
        docker push reg-kdev.mydomain.com/mytest/demo:1.8 

    - name: action-slack
      uses: 8398a7/action-slack@v3
      with:
        status: ${{ job.status }}
        author_name: www-be
        fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        if_mention: failure,cancelled
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
      if: always() # Pick up events even if the job fails or is canceled

설명

  • [1~6] 코드가 mytest 브랜치에 push되면 실행됩니다.
    • test 를 위해 임시 생성 했습니다. - ex) yourtest
  • [8~14] 최신 Ubuntu 가상 환경에서 작업을 실행합니다.
    • Github 에서 제공하는 Host를 사용 합니다.
      • runs-on: ubuntu-latest
    • Build를 위한 소스는 아래의 디렉토리를 참고 합니다.
      • working-directory: ./charts/dev/test/mytest
  • [16~18] 저장소를 checkout 합니다.
    GitHub - actions/checkout: Action for checking out a repo
    • uses: actions/checkout@v4
  • [18~32] PHP & Composer 및 Sonar-Scanner 설치
  • [35~43] SonarQube 연동
    • sonar-scanner 를 통해 수집된 정보를 SonarQube 서버로 전송 합니다.
    • secrets.SONAR_HOST_URL & secrets.SONAR_TOKEN 정보는 Gibhub에 등록한 “Environment secrets” 정보를 참고 합니다.
          -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \
          -Dsonar.login=${{ secrets.MYTEST_SONAR_TOKEN }}
  • [45~46] Docker Build 하기

  • [48~54] horbor login & image push 하기.

    • secrets.HARBOR_PASSWORD & secrets.HARBOR_USERNAME 정보는 Gibhub에 등록한 “Environment secrets” 정보를 참고 합니다.

      run: echo "${{ secrets.HARBOR_PASSWORD }}" | docker login -u ${{ secrets.HARBOR_USERNAME }}

    • image push
      - tag는 임의 지정

      docker build -t reg-kdev.mydomain.com/mytest/demo:1.8 .
      docker push reg-kdev.mydomain.com/mytest/demo:1.8

  • [56 ~ 65] Slack 연동

====

sonarqube 버전 upgrade ( 10.1 → 10.6 ) 에 따른 Yaml 파일 변경 됨 ( 2024.09.09)

  • sonar-scanner
  • job 분리
    • build & sonar scan 분리

변경된 YAML 내역

name: CI/CD Pipeline

on:
  push:
    branches:
      - mytest             

jobs:
  build-test:
    environment: dev 
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./charts/dev/test/my

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '7.4'
    
    - name: Install Composer dependencies
      run: composer install

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    - name: Log in to Harbor
      run: echo "${{ secrets.HARBOR_PASSWORD }}" | docker login -u ${{ secrets.HARBOR_USERNAME }} --password-stdin https://reg-kdev.mydomain.com

    - name: Build and push Docker image
      run: |
        docker build -t reg-kdev.mydomain.com/my/demo:1.9 .
        docker push reg-kdev.mydomain.com/my/demo:1.9 

  sonar:
    name: SonarQube Scan
    runs-on: ubuntu-latest
    environment: dev
    defaults:
      run:
        working-directory: ./charts/dev/test/my         

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Install SonarQube Scanner
      run: |
        curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -
        sudo apt-get install -y nodejs
        npm install -g sonarqube-scanner

    - name: Run SonarQube scan
      run: |
        sonar-scanner \
          -Dsonar.projectKey=mytest \
          -Dsonar.sources=. \
          -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \
          -Dsonar.login=${{ secrets.MYTEST_SONAR_TOKEN }}



#    - name: action-slack
#      uses: 8398a7/action-slack@v3
#      with:
#        status: ${{ job.status }}
#        author_name: www-be
#        fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
#        if_mention: failure,cancelled
#      env:
#        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
#      if: always() # Pick up events even if the job fails or is canceled

========

배포 참고용 파일들.

1.composer.json - ChatGPT 검색 참고 하였음

{
    "name": "your-username/your-project-name",
    "description": "A brief description of your project",
    "require": {
        "php": "^7.4 || ^8.0",
        "monolog/monolog": "^2.0",
        "phpunit/phpunit": "^9.0"
    },
    "require-dev": {
        "squizlabs/php_codesniffer": "^3.5"
    },
    "autoload": {
        "psr-4": {
            "YourNamespace\\": "src/"
        }
    },
    "scripts": {
        "test": "phpunit"
    }
}

2.Dockerfile

FROM nginx

설정(Config) 정리

관리자 : 관리자 진행 ( 대부분 최초 1회만 하면 됨 )
담당자 : 배포담당자 진행 ( 상황에 맞게 수정 하면 됨 )

  • GitHub secrets 설정 (관리자)
    • 릴리즈 환경 별로 다른 Secrets 설정 하기 → 참고

Github 권한 설정
myadmin : admin 으로 변경 함.

  • Environment에 Secrets를 생성하기

Environment secrets > Add Environment secrets
Name : YOUR_SECRT_NANE ex) MYTEST_SONAR_TOKEN
Value : Secret value

YAML 에서 사용법

  • enviroment : NAME 설정
.
jobs:
  build-test:
    environment: dev
 .   
 . 

TEST용 브랜치(Branchs) 생성 및 YAML 준비 (담당자)

  • Branches
    • name : 영문이름으로 생성 (ex: mytest )

  • YAML
    • GitHub Actions는 YAML 생성
    • 위치 : 레포지토리의 .github/workflows에 생성 (파일내용은 상위 소스 참고)

  • Helm-charts 및 기타 소스 생성
  • 위치 : charts/dev/test/[name] 하위 생성

Commit & Push , Action 확인 (담당자)

  • YAML 파일 Commit & Push
    • 각자 상황에 맞는 방식으로 진행 하면 됨
  • Github Action 실행 결과 확인 하기
    • 성공한 경우 는 아래와 같이 “V” 체크 표시 됨.

  • 실패할 경우는 아래와 같이 “X” 체크 표시 됨.

  • 결과 및 Log 확인 (세부내역)

SonarQube - 소스정적 분석 (담당자)

  • 프로젝트 (Project) 생성
    • “Create Project” 클릭

  • Create a Project 설정 > ( 참고 : 실제 서비스 적용시 github 의 branch name 으로 맞춰서 작성 할 것 )
    • Project display name : yourtest
    • Project Key : yourtest
    • Main branch name: yourtest

  • Set Up Project for Clean any You Code” 설정
    • “Use the global setting” 선택

  • Create GitHub Secrects 설정

    • token 생성 : “Generate a token” 선택

  • “Generate a project token” 세부 항목

    • Token name : 내용 그대로 유지
    • Expires in : 1 year 로 변경
    • 내용 기재 후 “Generate” 버튼 선택

  • “Generate a project token” 세부 항목 - 1

  • 토큰 생성 확인

    • 생성된 토큰은 복사 & 저장 해 둘것 ( 화면을 벋어나면 추가 확인 안됨)

  • “Create Workflow YAML File” 설정
    • sample 예제를 만들어 주는 페이지로 별도 설정은 필요 없음

  • 등록 완료
    • 등록 절차는 완료 되었음 ( GitHub Action 실행 하면 생성된 Project 활성 화 됨 )

  • 소나큐브 워크플로우 소스 추가 (Github Action )
    • secrets.SONAR_HOST_URL & secrets.MYTEST_SONAR_TOKEN 을 GitHub의 Environment secrets 에 사전 등록 해 줄것. !! (필수)
    • 코드 추가 (test.yaml 예시)

    - name: SonarQube scan
      env:
        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
      run: |
        sonar-scanner \
          -Dsonar.projectKey=mytest \
          -Dsonar.sources=. \
          -Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \
          -Dsonar.login=${{ secrets.MYTEST_SONAR_TOKEN }}
  • 정적분석 시작
    • Bugs / Code Smells 정보 확인

TEST - 진행 중

name: CI/CD Pipeline

on:
  push:
    branches:
      - mytest
  pull_request:
    branches:
      - main  
  • 결과 - 실패
    • Sonaqube - Plugin 설치 ( Community Branch Plugin)

  • PR 진행 결과

Unit Test (정보수집중)

PHP Unit Test : PHPUnit: The PHP Testing Framework / PHPUnit (php-actions) - GitHub Marketplace

go Unit Test : GitHub - stretchr/testify: A toolkit with common assertions and mocks that plays nicely with the standard library

Docker image Build (담당자)

  • Build 관련 파일 준비 : Base image / Dockerfile / 소스파일 등.
    • 파일 위치 : ./helm-charts/dev/test/[브렌치명] 밑에 생성

Harbor (이미지 저장소) 설정 - (담당자)

  • Project 생성
    • Test용 image 저장소 생성

“NEW PROJECT” 등록

  • TEST용 브랜치명 등록 ( 실 서비스에는 서비스명 등록)
    • Project Name : mytest

  • Github Action YAML 수정
    • Harbor login 하기
    • secrets.HARBOR_PASSWORD & secrets.HARBOR_USERNAME는 GitHub의 Environment secrets 에 사전 등록 해 줄것. !! (필수)
- name: Log in to Harbor
      run: echo "${{ secrets.HARBOR_PASSWORD }}" | docker login -u ${{ secrets.HARBOR_USERNAME }} --password-stdin https://reg-kdev.mydomain.com 
  • docker image push 하기
    • tag 명 변경
    - name: Build and push Docker image
      run: |
        docker build -t reg-kdev.mydomain.com/test/demo:1.8 .
        docker push reg-kdev.mydomain.com/test/demo:1.8 
  • Push 된 image 상태 확인
    • Projects > Repositories 선택

  • tag 선택

  • Scan 내역 확인

  • Build History 확인

  • image push 확인
    • docker push 또는 Github Action YAML 통한 자동 배포 ( argoCD 연동)

Slack noti 설정

  • 채널 생성
    • 생성할 채녈명 입력

  • GitHub app 추가
    • 채널 > 세부정보 보기> 통합 > 앱 에서 추가

  • Github Action 연동
    • webhook URL 생성

  • Github Action YAML 수정
    • secrets.SLACK_WEBHOOK_URL은 GitHub의 Environment secrets 에 사전 등록 해 줄것. !! (필수)
   - name: action-slack
      uses: 8398a7/action-slack@v3
      with:
        status: ${{ job.status }}
        author_name: www-be
        fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
        if_mention: failure,cancelled
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required
      if: always() # Pick up events even if the job fails or is canceled
  • Slack noti 확인
    • 채널 메시지 확인


참고

Checkout V4 : https://github.com/actions/checkout

Setup PHP in GitHub Actions : https://github.com/shivammathur/setup-php

Welcome to Node.js DEB repository : https://deb.nodesource.com/

setup-buildx-action : https://github.com/docker/setup-buildx-action

SonarQube와 Github Action으로 수행하는 정적 분석 https://kdev.ing/static-analysis-performed-by-sonarqube-and-github-action/

GitHub Actions를 이용한 Slack Notification : https://whyeskang.com/410

[OpenSource] sonarQube 이해하기 -1 : 정의, 주요특징, 구성요소, 수행 프로세스 : https://adjh54.tistory.com/381

Github Action과 Slack 연동해서 빌드 결과 받기 : Github Action과 Slack 연동해서 빌드 결과 받기

[중간과제] github action과 argocd 연계 프로젝트를 마치며 : https://malwareanalysis.tistory.com/263

github actions > NPM package 자동 배포 : github actions > NPM package 자동 배포

Have a better CI/CD in GitHub Action by using Sonarqube on Django : Have a better CI/CD in GitHub Action by using Sonarqube on Django

오픈소스 컨테이너 레지스트리 Harbor로 컨테이너 레지스트리 간 복제 수행하기:https://nangman14.tistory.com/78

[Github]깃허브의 CI툴인 Actions의 문법 간단 정리 : https://jinmay.github.io/2020/05/13/git/github-action-syntax/

풀 리퀘스트 만들기 : https://www.atlassian.com/ko/git/tutorials/making-a-pull-request

Sonarqube 설치 + PR decoration 하기 : https://dlwnsdud205.tistory.com/350

SonarCloud 적용기: https://gong-check.github.io/dev-blog/BE/%EC%98%A4%EB%A6%AC/sonarcloud/sonarcloud/

profile
DevOps, 개발팀과 운영팀이 알아두면 좋은 정보를 공유합니다.

0개의 댓글