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

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
-Dsonar.host.url=${{ secrets.SONAR_HOST_URL }} \
-Dsonar.login=${{ secrets.MYTEST_SONAR_TOKEN }}
[45~46] Docker Build 하기
[48~54] horbor login & image push 하기.
run: echo "${{ secrets.HARBOR_PASSWORD }}" | docker login -u ${{ secrets.HARBOR_USERNAME }}
docker build -t reg-kdev.mydomain.com/mytest/demo:1.8 .
docker push reg-kdev.mydomain.com/mytest/demo:1.8
[56 ~ 65] Slack 연동
====
변경된 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
관리자 : 관리자 진행 ( 대부분 최초 1회만 하면 됨 )
담당자 : 배포담당자 진행 ( 상황에 맞게 수정 하면 됨 )
Github 권한 설정
myadmin : admin 으로 변경 함.

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

.
jobs:
build-test:
environment: dev
.
.




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

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




Create GitHub Secrects 설정

“Generate a project token” 세부 항목

“Generate a project token” 세부 항목 - 1
토큰 생성 확인



- 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 }}

SonarQube + PR decoration 하기 (검토중) → 링크

TEST - 진행 중
name: CI/CD Pipeline
on:
push:
branches:
- mytest
pull_request:
branches:
- main



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

“NEW PROJECT” 등록

- 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/test/demo:1.8 .
docker push reg-kdev.mydomain.com/test/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

참고
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/