13. CI 구축

2024. 11. 21. 15:29·devops/minikube

argocd로 git도 연동했겠다. 본격적인 개발을 위해 CI를 짜겠다.

이걸 하는 이유는

 

1. 내가 개발을 완료하여 git에 push를 하고
2. 이 git push 내용을 image로 말아 올리고
3. 이 image를 argocd가 최신으로 받아오게 업데이트도 해야 하고
4. 잘 작동되었는지 모니터링도 해야한다.

 

이 4가지 혹은 그 이상의 단계를 진행해야 할지도 모른다. 이 것을 매번 하는건 매우 곤혹스러운 일이다.

 

 

gitlab으로 CI를 구성할수도 있고, container 이미지는 ECR을 사용할 수도 있고 입맛에 따라 다르겠지만 나는 CI는 github action으로 container이미지는 docker로 진행하려고 한다.(이게 공짜니까) 기업이나 프로젝트를 남에게 보여주기 싫거나 보안이 문제인 사람들은 private repository로 진행하는 경우도 많더라...

 

CI를 진행하기전에 docker 부터 진행하자.

Docker

https://hub.docker.com/

회원가입을 완료하게 되면 준비는 완료된다. 당연히 username과 password는 알아야 한다.

 

Github Action

GitHub Actions은 GitHub에서 제공하는 CI/CD (Continuous Integration/Continuous Deployment) 도구이다.  이것은 개발자들이 소프트웨어 개발 프로세스를 자동화할 수 있게 해준다. 이 기능으로 git에 푸쉬가 되면 자동으로 docker image를 만들도록 하겠다.

 

그전에 레파지토리를 만들고 간단히 뼈대부터 잡도록하자.

 

golang으로 백엔드를 개발할 것이기 때문에 다음과 같은 이름으로 레파지토리를 만들었다.

 

 

본인 github repository에서 Actions를 클릭한다.

 

 

다른 workflow도 있지만 Simple workflow로 설치하도록한다.

 

 

파일이름은 본인 입맛에 맞게 바꾸고 commit하면된다.

 

 

그리고나서 Actions를 다시 들어가면 아래와 같은 그림이 뜰꺼고 그럼 simple한 pipe라인은 세팅이 된 것이다.

 

 

기본 뼈대가 잡혔으니 이제 git을 clone하여 로컬에서 docker image를 푸쉬해보자.


$ git clone https://github.com/ggorockee/camping-backend-with-go.git
$ cd camping-backend-with-go
$ git config user.name ggorockee
$ git config user.email ggorockee@gmail.com
$ git remote remove origin
$ git remote add origin https://ggorockee:<YOUR GITHUB TOKEN>@github.com/ggorockee/camping-backend-with-go.git

 

위 명령어를 실행 후 폴더를 열어보면 다음과 같은 파일이 있는 것을 볼 수가 있다.

 

여기에 아주 기본적인 파일 몇개만 추가하자.

 

main.go

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World")
}

 

 

go.mod

module camping-backend-with-go

go 1.22.5

 

Dockerfile

## base go image
FROM golang:1.23-alpine as builder

RUN mkdir /app
COPY . /app
WORKDIR /app
RUN CGO_ENABLED=0 go build -o ggocamping .
RUN chmod +x /app/ggocamping

## build a tiny docker image
FROM alpine:latest
RUN mkdir /app
COPY --from=builder /app/ggocamping /app

CMD [ "/app/ggocamping"]

 

 

buildAndPush.yml

name: Docker Image CI

on:
  push:
    branches: [ "main" ]

env:
  GIT_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
  TARGET_REPOSITORY: ${{ vars.DEVOPS_REPOSITORY }}
  DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
  DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
  REPOSITORY_NAME: camping-backend-with-go
  DOCKERFILE: Dockerfile

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    outputs:
      SHA: ${{ env.SHA }}
    steps:
    - name: Set short git commit SHA
      uses: benjlevesque/short-sha@v3.0
      id: short-sha
      with:
        length: 8
    - run: echo $SHA
      env:
        SHA: ${{ steps.short-sha.outputs.sha }}
    - name: set variables
      uses: marcdomain/set-variables@v1.2
      with:
        variables: |
          SHA: "${{ env.SHA }}"
    
    - name: Checkout 
      uses: actions/checkout@v4
    
    - name: Set up QEMU
      uses: docker/setup-qemu-action@v3
    
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3
    
    - name: Login to Docker Hub
      uses: docker/login-action@v3
      with:
        username: ${{ env.DOCKERHUB_USERNAME }}
        password: ${{ env.DOCKERHUB_TOKEN }}
    
    - name: Build and push
      uses: docker/build-push-action@v6
      with:
        context: .
        push: true
        tags: ${{ env.DOCKERHUB_USERNAME }}/${{ env.REPOSITORY_NAME }}:v-${{ env.SHA }}
        file: ${{ env.DOCKERFILE }}

 

이렇게 파일을 총 4개를 만들고나서 github에 push를 하자. 에러가 발생할 텐데 이것은 당연한 처사이다.

 

그 이유는

env:
    GIT_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
    TARGET_REPOSITORY: ${{ vars.DEVOPS_REPOSITORY }}
    DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
    DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}

 

을 github에 등록해주지 않아서 그렇다. 이부분을 추가해주도록 하자.

secrets는 Secret에 vars는 Variables에 추가하도록하자.

  • DOCKERHUB_USERNAME: dockerhub의 본인 username이고,
  • DOCKERHUB_TOKEN: 은 비밀번호
  • REPO_ACCESS_TOKEN: GitHub Token.
  • DEVOPS_REPOSITORY: ggorockee/devops-camping

 

Settings > Secrets and variables > Actions

 

Repository Secrets > New repository secret

 

이런식으로 추가한다.

완료된 화면이다.

 

이렇게 추가하고 나서 다시 actions탭으로 들아가서 Re-run jobs를 돌려보자.

 

성공적으로 돌아간 것을 확인할 수 있다.

 

dockerhub에서 확인해보면 이미지가 잘들어간 것을 확인할 수 있다. 이제 이 이미지를 사용하는 쿠버네티스 리소스를 만들어주기만 하면 되겠다.

 

'devops > minikube' 카테고리의 다른 글

15. CICD 구축(마무리)  (0) 2024.11.22
14. Docker Image를 이용한 Helm Template 수정  (31) 2024.11.21
12. gitops로 nginx 배포  (24) 2024.11.20
11. argocd 접속  (24) 2024.11.20
10. argocd 설치  (0) 2024.11.20
'devops/minikube' 카테고리의 다른 글
  • 15. CICD 구축(마무리)
  • 14. Docker Image를 이용한 Helm Template 수정
  • 12. gitops로 nginx 배포
  • 11. argocd 접속
꼬락이
꼬락이
ggorockee 님의 블로그 입니다.
  • 꼬락이
    꼬락이의 개발일지
    꼬락이
  • 전체
    오늘
    어제
    • 분류 전체보기 (30)
      • devops (28)
        • aws (0)
        • minikube (18)
        • go (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    istio
    Github action
    SWAGGER
    helm
    Minikube
    golang
    EC2
    cert-manager
    Gorm
    Kubernetes
    JWT
    argoc
    yq
    aws
    repository
    clean-archtiecture
    systemd
    k8s
    CICD
    GO
    Clean Architecture
    port-forwarding
    CI
    DB 연결
    Github
    rds
    ArgoCD
    Teleport
    db 우회
    쿠버네티스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
꼬락이
13. CI 구축
상단으로

티스토리툴바