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
회원가입을 완료하게 되면 준비는 완료된다. 당연히 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 |