Gitea Actions 통한 CI/CD 구성하기 #3

Paul
17 min readMay 9, 2024

--

https://blog.gitea.com/assets/images/view-logs-bba5a14d392bd522bffc172c1a1319bb.png

앞에서 Gitea Runner 환경 구성 방법에 대해 알아보았습니다. 이제 Gitea Actions을 사용하여 CI/CD 파이프라인을 구성하는 방법에 대해서 알아보도록 하겠습니다. Gitea Actions 를 통한 CI/CD 구성은 아래와 같습니다.

Gitea Actions 통한 CI/CD 구성
  • 소스 코드를 Git에 push합니다.
  • Gitea Actions은 도커 컨테이너를 빌드하고 이미지를 Docker Hub에 푸시합니다.
  • Helm의 values.yaml 파일에서 이미지 태그 정보를 업데이트한 후, Git에 push합니다.
  • ArgoCD는 업데이트된 Helm 정보를 동기화하여 배포를 진행합니다.

도커 이미지 빌드 및 푸시를 위한 Gitea Actions

도커 이미지를 빌드하고 푸시하기 위해 워크플로우를 작성할 때 사용할 수 있는 액션은 다음과 같습니다.

  • docker/login-action : docker/login-action Docker Registry 로그인하는데 사용됩니다.
  • docker/build-push-action : docker/build-push-action 은 이미지 빌드에서 Docker Registry로 이미지 푸시까지 실행하는 작업입니다.
    캐시의 취급이나 빌드 대상의 플랫폼의 지정 등, 편리한 기능을 사용하기 쉬운 형태로 제공해 줍니다.

Gitea Actions 통한 CI 구성하기

소스 코드를 받고 도커 컨테이너 빌드한 후에 Docker Hub Container Registry에 이미지를 푸시 하는 워크 플로우를 작성 합니다. 특정 디렉토리 또는 파일 이벤트가 트리거 되는 것을 방지하기 위해 paths-ignore 추가로 설정을 했습니다.

# .gitea/workflows/gitea-ci.yaml
name: Build And Test
run-name: ${{ gitea.actor }} is runs ci pipeline
on:
push:
branches:
- main
paths-ignore:
- LICENCE
- 'docs/**'
- 'helm/**'

jobs:
Gitea-Docker-Build-Push:
runs-on: ubuntu-20.04
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: gnu96/gitea-docker-build-push-repo:latest

Gitea Actions에서 환경 변수 및 보안 설정 값을 가져올 수 있도록, Gitea 저장소에서 환경 변수를 설정하는 기능을 제공합니다. 저장소 설정 > Actions > Secrets(Variables) 설정을 통해 Docker Hub 로그인에 필요한 사용자 이름 및 토큰 정보를 저장합니다. 그리고 Gitea Actions yaml 파일에서 ${{ secrets.DOCKERHUB_USERNAME }} , ${{ secrets.DOCKERHUB_TOKEN }} 을 사용하여 값을 불러올 수 있습니다.

Gitea 저장소의 환경 변수 설정

저장소의 소스를 수정한 후 Git Push를 하면 Gitea Actions가 실행되며, 에러가 없을 경우 아래와 같이 성공적으로 Job이 실행 되는 것을 확인 할 수 있습니다.

Gitea Actions 실행 화면

ArgoCD 및 Helm3 설치하기

Gitea Actions 통해 도커 컨테이너 빌드하고 Docker Hub에 이미지를 푸시한후에 ArgoCD를 사용하여 배포하겠습니다. ArgoCD 설치는 k3s 환경에서 진행할 예정입니다.

  • k3s 설치하기

k3s는 설치가 간편하고 100MB 미만의 바이너리로 운영되는 경량 쿠버네티스입니다. 따라서 로컬 환경에서 쿠버네티스 환경을 구성하기에 적합니다. k3s 설치 방법은 아래와 같습니다.

# Vagrant 환경의 ubuntu-20.04 가상머신 환경
# Install k3s 환경
vagrant@gitea:~$ curl -sfL https://get.k3s.io | sh -
# k3s 서비스 상태 체크
vagrant@gitea:~$ systemctl status k3s
● k3s.service - Lightweight Kubernetes
Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2024-05-04 00:14:12 UTC; 4h 5min ago
Docs: https://k3s.io
Main PID: 807 (k3s-server)
Tasks: 276
Memory: 848.7M
CGroup: /system.slice/k3s.service
├─ 807 /usr/local/bin/k3s server
├─1945 containerd
...
# kubectl 에서 해당 파일을 접근하기 위한 권한 설정
vagrant@gitea:~$ sudo chmod 766 /etc/rancher/k3s/k3s.yaml
# kubectl 명령어를 통해서 네임스페이스 정보를 가지고 오기
vagrant@gitea:~$ kubectl get ns
NAME STATUS AGE
kube-system Active 4d15h
kube-public Active 4d15h
kube-node-lease Active 4d15h
default Active 4d15h
argocd Active 4d15h
api-gateway Active 3d3h

ArgoCD는 Kubernetes 환경에서 애플리케이션의 배포와 관리를 지원하는 도구로, GitHub, Bitbucket, GitLab, Gitea와 같은 CI/CD 시스템(Git Actions, Pipelines)과의 통합이 용이합니다. ArgoCD의 설치 방법은 아래에 설명되어 있습니다. 설치가 완료되면 https://192.168.56.173:31917/ 주소로 접속하여 로그인 합니다.

# ArgoCD 네임스페이스 생성하기
vagrant@gitea:~$ kubectl create ns argocd
# ArgoCD mainifests 다운로드
vagrant@gitea:~$ wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -O install.yaml
# ArgoCD 설치
vagrant@gitea:~$ kubectl apply -n argocd -f install.yaml
# ArgoCD 설치 리소스를 정보를 출력함.
vagrant@gitea:~$ kubectl get all -n argocd
# ArgoCD 접속을 위한 패스워드 정보를 얻기
vagrant@gitea:~$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

# ArgoCD 외부 접속이 가능하도록 NodePort로 변경
vagrant@gitea:~$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'

# ArgoCD 외부 접속이 가능하도록 서비스 Port
kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
....
argocd-repo-server ClusterIP 10.43.152.35 <none> 8081/TCP,8084/TCP 56m
argocd-server-metrics ClusterIP 10.43.186.128 <none> 8083/TCP 56m
argocd-server NodePort 10.43.2.54 <none> 80:31263/TCP,443:32560/TCP 56m
  • Helm3 설치하기

Helm은 Kubernetes에서 애플리케이션을 쉽게 배포하고 관리할 수 있는 패키지 매니저입니다. Helm 차트를 사용하면 애플리케이션과 관련된 모든 Kubernetes 리소스를 한 패키지로 묶어 배포할 수 있으며, 이를 통해 버전 관리와 롤백을 쉽게 할 수 있습니다.

vagrant@gitea:~$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
vagrant@gitea:~$ chmod 700 get_helm.sh
vagrant@gitea:~$ ./get_helm.sh

Gitea Actions 통한 CD 구성하기

k3s 환경에 ArgoCD 환경을 구성을 하였습니다. 지금 부터 ArgoCD의 Helm를 통해서 배포를 하기 위하여 Helm Chart를 생성하고, Gitea Actions에서 Helm Chart 의 Value.yaml 파일을 수정해서 자동 배포가 되도록 구성을 해 보겠습니다.

  • Helm Chart 생성하기
# git clone 소스 다운로드
vagrant@gitea:~/temp$ git clone https://192.168.56.173:3300/gitea/gitea-docker-build-push-repo.git
Cloning into 'gitea-docker-build-push-repo'...
...
vagrant@gitea:~/temp/gitea-docker-build-push-repo$ ls
Dockerfile LICENSE package.json README.md server.js

# Helm 명령어를 통해서 helm chart를 생성함.
vagrant@gitea:~/temp/gitea-docker-build-push-repo$ helm create helm
Creating helm
vagrant@gitea:~/temp/gitea-docker-build-push-repo$ tree -L 2
.
├── Dockerfile
├── helm
│ ├── charts
│ ├── Chart.yaml
│ ├── templates
│ └── values.yaml
├── LICENSE
├── package.json
├── README.md
└── server.js

Helm 폴더에서 values.yaml 파일에서 아래의 내용을 주석 처리합니다.

# Default values for helm.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

#image:
# repository: nginx
# pullPolicy: IfNotPresent
# # Overrides the image tag whose default is the chart appVersion.
# tag: ""

Helm 폴더에 image.yaml 파일을 생성하고 아래와 같이 수정을 합니다.

image:
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
  • ArgoCD Repositories 저장소 등록하기
  • ArgoCD Application 생성하기

ArgoCD Repositories 에 등록된 저장소에서 Create application를 선택한 후에 Helm 배포를 위한 Helm Chart 폴더 및 Value 설정 위한 yaml 파일을 설정을 후 저장을 합니다.


# ArgoCD Application 설정 Yaml 파일
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: gitea-docker-build-push-repo-helm
namespace: argocd
spec:
project: default
# Application 저장소 정보 및 Helm Chart 경로 위치 설정
source:
repoURL: 'https://192.168.56.173:3300/gitea/gitea-docker-build-push-repo.git'
path: helm
targetRevision: HEAD
helm:
valueFiles:
- values.yaml # Helm Chart의 Default 값
- image.yaml # 배포할 Application 도커 이미지 설정
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
  • Gitea Actions 구성

Gitea Actions 에서 Helm의 image.yaml 파일에서 이미지 태그 정보를 업데이트한 후, Git에 push합니다.

# .gitea/gitea-ci.yaml
jobs:
Gitea-Docker-Build-Push:
runs-on: ubuntu-20.04
steps:
- name: Check out repository code
uses: actions/checkout@v3
...
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: gnu96/gitea-docker-build-push-repo:${{gitea.run_number}}
- name: Update values.yaml
run: |
cd helm
cat <<EOF > "image.yaml"
image:
repository: gnu96/gitea-docker-build-push-repo
pullPolicy: IfNotPresent
tag: ${{gitea.run_number}}
EOF
git config --global user.name 'gitea'
git config --global user.email 'gitea@github.com'
git add image.yaml
git commit -m "Update image.yaml"
git push
  • ArgoCD Application에서 SYNC를 통해서 배포를 합니다.
# 네임스페이스 정보
vagrant@gitea:~$ kubectl get ns
WARN[0000] Unable to read /etc/rancher/k3s/k3s.yaml, please start server with --write-kubeconfig-mode to modify kube config permissions
error: error loading config file "/etc/rancher/k3s/k3s.yaml": open /etc/rancher/k3s/k3s.yaml: permission denied
# config file 권한 수정
vagrant@gitea:~$ sudo chmod 766 /etc/rancher/k3s/k3s.yaml
vagrant@gitea:~$ kubectl get ns
NAME STATUS AGE
kube-system Active 4d20h
kube-public Active 4d20h
kube-node-lease Active 4d20h
default Active 4d20h
argocd Active 4d20h
api-gateway Active 3d8h
# Application Pod 정보
vagrant@gitea:~$ kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
gitea-docker-build-push-repo-helm-57b956f85b-plzz8 1/1 Running 0 19m

마무리하며

지금까지 로컬 환경에 Gitea 서버를 구축하고, Gitea Actions와 ArgoCD를 연동하여 Kubernetes 클러스터에 자동 배포하는 방법을 살펴보았습니다. 로컬 Git 서버 환경에서 다양한 테스트 및 외부 오픈소스와 연동이 가능한 환경을 구성할 수 있을 것 같습니다.

참고사이트

--

--