Gom3rye 2025. 6. 23. 15:10
728x90
반응형

Git Action을 이용해서 Docker Image를 DockerHub에 배포

소스 파일을 작성하고 실행 후 Dockerfile을 이용해서 이미지 생성

  • go 버전 확인 및 설치
    • Mac M1의 경우는 아키텍쳐가 다르므로 확인하고 다운로드 해야 한다.
    • apt를 이용해서 설치하는 경우는 최신 버전이 아닐 수 있으니 유의
go version
# 최신 버전 설치
sudo snap install go --classic
  • 소스 파일 만들기 vi main.go
package main
import(
	"fmt"
	"os"
)
func main(){
	fmt.Fprintln(os.Stdout, "Go Go Go")
}
  • 실행 시켜서 확인해보기
go run main.go # Go Go Go
  • 이미지 생성 및 컨테이너 구동
    • 컨테이너를 만들고 commit 명령을 이용해서 컨테이너를 이미지로 생성(명령 이용)
    • Dockerfile을 이용해서 이미지를 생성(코드 이용)
FROM golang:1.15-alpine3.12 AS gobuilder-stage

WORKDIR /usr/src/goapp
COPY main.go .

RUN CGO_ENABLED=0 GOOS=linux COARCH=amd64 go build -o /usr/local/bin/gostart

FROM scratch AS runtime-stage
COPY --from=gobuilder-stage /usr/local/bin/gostart /usr/local/bin/gostart
CMD ["/usr/local/bin/gostart"]

python, go, node → 소스 파일 + Dockerfile ⇒ 실행할 때 소스 코드 필요하다.

→ 소스 코드 많으면 src 폴더 만들어서 거기를 복사

java → dockerfile이나 git action에서 직접 빌드하지 않는 이상 소스 코드 안 필요하고 jar 파일만 있으면 된다.

  • 이미지 빌드
docker build -t 이미지이름 도커파일위치
docker build -t goapp:1.0 .
  • 컨테이너를 생성해서 확인 (웹 프로그래밍이 아니고 한 번 실행되는 거니까 -d 옵션 필요 없음, 계속 실행되어야 할 때 -d 옵션 주는 것)
docker run --name goapp-deploy goapp:1.0 # Go Go Go
  • git hub에 push
    • git 설치
    sudo apt update
    sudo apt install git
    git version
    
# 초기화
git init
# stage에 파일을 추가 (디렉토리에 있는 거 전부다 추가 .)
git add .
# 로컬 레포지토리에 변경 내용 적용
git commit -m "메시지"
# 처음 git을 사용하면 email과 username을 추가해야 한다.
git config --global user.email "~~~~@gmail.com"
git config --global user.name "gom3rye" ##-> 비로소 로컬에 등록 완료
# git hub에 접속해서 repository를 생성하고 url을 복사
<https://github.com/Gom3rye/goaction.git>
# git hub에서 access token 생성
developer settings > personal access tokens > tockens(classic) > generate new tockens(classic) > 권한 repo & workflow 체크
[발급받은 tocken은 push할 때 비밀번호로 쓸 것]
# repository 등록
git remote add 레포지토리이름 레포지토리경로
git remote add origin <https://github.com/Gom3rye/goaction.git>
# push
git push 저장소이름 브랜치이름(이전의 기본 브랜치 이름은 main이었으나 지금은 master (git status 하면 알 수 있다.))
# (브랜치 이름 바꾸고 바로 쓰고 싶으면 git checkout -b 브랜치이름)
git push origin main
  • yaml
    • 이 기종 간에 데이터를 주고 받을 사용하는 포맷 중 하나 (xml이나 json과 역할이 동일)
    • 사람이 작성하기도, 보기도 편하고(json의 단점) 사이즈도 xml보다 작음 → Cloud에서 IaC, AI에서 text 처리할 때 yaml 많이 쓴다.
    • 작성법
      • 들여쓰기는 기본적으로 2칸 또는 4칸을 지원한다.
      • 들여쓰기를 이용해서 하위 속성을 설정한다.
      • 배열을 표시할 때는 [ ] 안에 나열해도 되고 하위 항목으로 -를 추가해가면서 작성해도 된다.
        • JSON에서는 배열을 표시할 때 skills:[”docker”, “kubernetes”] 형태로 배열을 표시하는데 yaml에서는 “
          skills”:
                    - docker
                    - kubernetes 로 표시한다.
      • 주석은 #뒤에 기재한다.
      • 데이터 표현
        • 참/거짓: true/false, yes/no
        • 숫자는 “”없이 기재
      • 줄바꿈은 |
        • JSON에서는 \n
  • git action
    • git hub에서 제공하는 CI/CD Tool로 개발의 workflow를 자동화할 수 있게 해주는 Tool이다.
    • Github Action의 Core 개념
      • Workflow
        • 자동화된 전체 프로세스로 하나 이상의 Job으로 구성되고 Event에 의해 예약되거나 트리거될 수 있다.
        • Workflow는 yaml로 작성되고 github repository에 .github/workflows 디렉토리 아래에 저장한다.
      • Event
        • Workflow를 트리거하는 특정 활동이나 규칙인데 커밋을 레포지토리에 push하고 pull을 요청할 때 Github에서 활동이 시작된다.
      • Job
        • 여러 step으로 구성되고 단일 가상 환경에서 실행된다.
        • 다른 Job에 의존 관계를 가질 수 있고 독립적으로 병렬로 실행하는 것도 가능하다.
      • Step
        • Job 안에서 순차적으로 실행되는 프로세스 단위이다.
        • step에서 명령을 내리거나 action을 실행할 수 있다.
      • Action
        • Job을 구성하기 위한 step 등의 조합으로 구성된 독립적인 명령이다.
        • Workflow의 가장 작은 빌드 단위이다.
        • Workflow에서 action을 사용하기 위해서는 Action이 반드시 Step을 포함해야 한다.
        • Action을 구성하기 위해서 레포지토리와 상호작용하는 커스텀 코드를 만들 수 있다.
      • Runner
        • Github Action Runner 애플리케이션이 설치된 머신으로 Workflow가 실행될 인스턴스이다.
  • Dockerhub에서 Token과 레포지토리를 생성
    • hub docker에서 actiontest 레포지토리 만들기
    • account settings > Personal access tokens > Read, Write, Delete 권한 주고 Generate > 발급된 Token copy 해놓기(한 번 발급되면 다시는 보여주지 않는다.)
    • Token: [발급 받은 토큰 값]
  • yaml 파일 만들어서 적용
    • git hub에서 만들 수 있고 프로젝트의 .github/workflows 디렉토리에 yaml 파일을 추가해도 된다.
    • 디렉토리를 생성하고 yaml 파일 추가
    mkdir -p .github/workflows
    vi .github/workflows/actiontest.yml
    
    name: actiontest
    # 여기에 이벤트 작성 (main 브랜치에 push가 발생하면)
    on:
      push:
        branches: ["main"]
        
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
          - name: Set up Go
            uses: actions/setup-go@v3
            with:
              go-version: 1.15
          - name: Build
            run: go build -v ./...
    
          - name: Dockerhub Login                                                                             uses: docker/login-action@v1
            with:
              username: ${{ secrets.DOCKERHUB_USERNAME }}
              password: ${{ secrets.DOCKERHUB_TOKEN }}
    
          - name: build and release to DockerHub
            env:
              NAME: kyla333
              REPO: actiontest
            run:
              docker build -t $REPO .
              docker tag $REPO:latest $NAME/$REPO:latest
              docker push $NAME/$REPO.latest
    
  • 변경된 내용 적용
git add .
git commit -m "actiontest"
git push origin main # -> Username and password required 라고 오류 뜬다.
  • git secret key 등록
    • git > settings > secrets and variables > actions > new repository secrets에 등록

  • git actions에서 Re-run jobs
    • build쪽에서 에러 남 → .github/workflows/actiontest.yml 의 빌드 부분 다시 보기 → tag와 build 부분을 나눠보자.
name: actiontest
on:
  push:
    branches: ["main"]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.15
      - name: Build
        run: go build -v ./...

      - name: Dockerhub Login
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
          
      - name: build
        env:
          REPO: actiontest
        run:
          docker build -t $REPO .

      - name: tagging
        env:
          NAME: kyla333
          REPO: actiontest
        run:
          docker tag $REPO:latest $NAME/$REPO:latest
      - name: Release To Dockerhub
        env:
          NAME: kyla333
          REPO: actiontest
        run:
          docker push $NAME/$REPO:latest
  • main.go 파일을 수정하고(Go 4번으로) 다시 push
  • docker stop, rm, rmi로 다 지우고 업로드 되는지 확인해보자.
    • 코드를 고쳐서 푸시만 하면 끝난 것 → CI
docker run --name goapp-deploy kyla333/actiontest:latest

 

728x90
반응형