Ssoon

3주차 - Jenkins CI/ArgoCD + K8S : 실습환경 본문

CICD 맛보기

3주차 - Jenkins CI/ArgoCD + K8S : 실습환경

구구달스 2024. 12. 16. 21:37
CloudNet@ 가시다님이 진행하는 CI/CD 맛보기 스터디

실습환경

🧿 Jenkins, gogs 컨테이너 기동

  • docker-compose.yaml
services:

  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    restart: unless-stopped
    networks:
      - cicd-network
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - jenkins_home:/var/jenkins_home

  gogs:
    container_name: gogs
    image: gogs/gogs
    restart: unless-stopped
    networks:
      - cicd-network
    ports:
      - "10022:22"
      - "3000:3000"
    volumes:
      - gogs-data:/data

volumes:
  jenkins_home:
  gogs-data:

networks:
  cicd-network:
    driver: bridge
  • Docker Compose를 사용하여 두 개의 컨테이너(gogs, jenkins)를 실행한 결과를 확인합니다.
[ssoon@localhost cicd-labs]$ docker compose up -d
[+] Running 2/2
 ✔ Container gogs     Started                                                                                                               0.8s 
 ✔ Container jenkins  Started
 
[ssoon@localhost cicd-labs]$ docker compose ps
NAME      IMAGE             COMMAND                   SERVICE   CREATED       STATUS                             PORTS
gogs      gogs/gogs         "/app/gogs/docker/st…"   gogs      13 days ago   Up 28 seconds (health: starting)   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp
jenkins   jenkins/jenkins   "/usr/bin/tini -- /u…"   jenkins   13 days ago   Up 28 seconds                      0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp

🧿 Jenkins 컨테이너 초기 설정

  • Jenkins 초기 암호를 확인합니다.
[ssoon@localhost cicd-labs]$ docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
33557ec3fb1d4c0092faed46fa200cb8

 


  • 계정 및 암호를 입력합니다.


  • Jenkins URL를 설정합니다.


🧿 Jenkins 컨테이너에서 호스트에 도커 데몬 사용 설정 (Docker-out-of-Docker)

  • Jenkins 컨테이너 내부에 도커 실행 파일 설치
  • docker compose exec --privileged -u root jenkins bash:
    • Jenkins 컨테이너 내부에서 명령어를 실행하기 위해 사용됩니다.
    • --privileged: 컨테이너가 호스트와 유사한 권한을 가지도록 설정합니다. 이를 통해 Docker CLI 등을 설치할 수 있습니다.
    • -u root: 컨테이너 내부에서 root 사용자로 실행합니다.
    • jenkins: 명령을 실행할 컨테이너 이름입니다.
    • bash: 컨테이너 내부에서 Bash 쉘을 실행합니다.
[ssoon@localhost cicd-labs]$ docker compose exec --privileged -u root jenkins bash
  • Docker 패키지를 신뢰할 수 있는지 검증하기 위해 Docker 공식 GPG 키를 다운로드합니다.
  • 파일은 /etc/apt/keyrings/docker.asc에 저장됩니다.
root@9afd0ab27f06:/# curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
  • 키 파일의 읽기 권한을 모든 사용자에게 부여합니다.
root@9afd0ab27f06:/# chmod a+r /etc/apt/keyrings/docker.asc
  • 새로운 APT 저장소를 추가합니다.
    • dpkg --print-architecture: 현재 시스템의 CPU 아키텍처를 확인 (amd64, arm64, 등).
    • $(. /etc/os-release && echo "$VERSION_CODENAME"): 현재 OS의 버전 코드네임(예: bullseye, buster)을 확인.
    • 저장소 URL: Docker 공식 저장소(https://download.docker.com/linux/debian).
  • 추가된 저장소 정보는 /etc/apt/sources.list.d/docker.list에 저장됩니다.
root@9afd0ab27f06:/# echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
  • apt-get update: 패키지 목록을 최신 상태로 업데이트합니다.
  • apt install: 필요한 패키지를 설치합니다.
    • docker-ce-cli: Docker 명령줄 인터페이스 (컨테이너 제어용).
    • curl: HTTP 요청을 전송하는 도구.
    • tree: 디렉토리 구조를 트리 형식으로 출력.
    • jq: JSON 데이터를 처리하는 CLI 도구.
    • yq: YAML 데이터를 처리하는 CLI 도구.
root@9afd0ab27f06:/# apt-get update && apt install docker-ce-cli curl tree jq yq -y
  • jenkins 사용자가 Docker 소켓에 접근할 수 있도록 설정합니다.
root@9afd0ab27f06:/# groupadd -g 2000 -f docker
root@9afd0ab27f06:/# chgrp docker /var/run/docker.sock
root@9afd0ab27f06:/# ls -l /var/run/docker.sock
srw-rw----. 1 root docker 0 Dec 16  2024 /var/run/docker.sock
root@9afd0ab27f06:/# usermod -aG docker jenkins
root@9afd0ab27f06:/# cat /etc/group | grep docker
docker:x:2000:jenkins
  • 사용자를 Docker 그룹에 추가합니다.
[ssoon@localhost cicd-labs]$ sudo usermod -aG docker $USER
[ssoon@localhost cicd-labs]$ newgrp docker

🧿 Gogs 컨테이너 초기 설정 : Repo(Private) - dev-app , ops-deploy

  • 데이터베이스 유형 : SQLite3
  • 애플리케이션 URL : http://<자신의 PC IP>:3000/
  • 기본 브랜치 : main
  • 관리자 계정 설정 클릭 : 이름(devops), 비밀번호(qwe123), 이메일 입력


  • Token을 생성합니다.

  • 2eb64d2d3e338b6d326d3d094b9ea242ab83f744

  • New Repository 1 : 개발팀용
    • Repository Name : dev-app
    • Visibility : (Check) This repository is Private
    • .gitignore : Python
    • Readme : Default → (Check) initialize this repository with selected files and template

  • New Repository 2 : 데브옵스팀용
    • Repository Name : ops-deploy
    • Visibility : (Check) This repository is Private
    • Readme : Default → (Check) initialize this repository with selected files and template
    ⇒ Create Repository 클릭 : Repo 주소 확인


🧿 Gogs 실습을 위한 저장소 설정 : 호스트에서 직접 git 작업

  • Git은 Gogs 서버에 접속하여 devops라는 조직/사용자가 관리하는 dev-app 리포지토리를 찾습니다.
  • 리포지토리의 모든 내용을 사용자의 로컬 디렉토리에 복제합니다.
  • 복제된 디렉토리는 **dev-app/**이라는 폴더로 생성됩니다.
[ssoon@localhost cicd-labs]$ git clone http://192.168.56.105:3000/devops/dev-app.git
'dev-app'에 복제합니다...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
오브젝트 묶음 푸는 중: 100% (4/4), 694 bytes | 694.00 KiB/s, 완료.
  • user.name과 user.email: 커밋 기록에 표시될 사용자 정보 설정.
  • init.defaultBranch: 새 리포지토리의 기본 브랜치 이름을 main으로 설정.
  • credential.helper store: 인증 정보를 저장해 작업을 편리하게 만듦.
[ssoon@localhost dev-app]$ git config user.name "devops"
[ssoon@localhost dev-app]$ git config user.email "devops@example.com"
[ssoon@localhost dev-app]$ git config init.defaultBranch main
[ssoon@localhost dev-app]$ git config credential.helper store
  • 현재 브랜치는 main입니다.
  • 리포지토리는 Gogs 서버(192.168.56.105:3000)에 있는 dev-app 원격 저장소와 연결되어 있습니다.
[ssoon@localhost dev-app]$ git branch
* main
[ssoon@localhost dev-app]$ git remote -v
origin  http://192.168.56.105:3000/devops/dev-app.git (fetch)
origin  http://192.168.56.105:3000/devops/dev-app.git (push)
  • server.py
  • 클라이언트가 서버에 접속하면:
    • 현재 시간(The time is...)과
    • 서버 호스트 이름(Server hostname...)을 반환.
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from datetime import datetime
import socket

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        
        now = datetime.now()
        hostname = socket.gethostname()
        response_string = now.strftime("The time is %-I:%M:%S %p, VERSION 0.0.1\n")
        response_string += f"Server hostname: {hostname}\n"
        self.wfile.write(bytes(response_string, "utf-8")) 

def startServer():
    try:
        server = ThreadingHTTPServer(('', 80), RequestHandler)
        print("Listening on " + ":".join(map(str, server.server_address)))
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()

if __name__ == "__main__":
    startServer()
  • Dockerfile
FROM python:3.12
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app 
CMD python3 server.py
  • VERSION
0.0.1
  • 새 파일 3개(Dockerfile, VERSION, server.py)가 커밋 및 원격 저장소에 업로드합니다.
[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
        Dockerfile
        VERSION
        server.py

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)

[ssoon@localhost dev-app]$ git add .

[ssoon@localhost dev-app]$ git commit -m "Add dev-app"
[main d89b73e] Add dev-app
 3 files changed, 32 insertions(+)
 create mode 100644 Dockerfile
 create mode 100644 VERSION
 create mode 100644 server.py
 
[ssoon@localhost dev-app]$ git push -u origin main
오브젝트 나열하는 중: 6, 완료.
오브젝트 개수 세는 중: 100% (6/6), 완료.
Delta compression using up to 4 threads
오브젝트 압축하는 중: 100% (4/4), 완료.
오브젝트 쓰는 중: 100% (5/5), 905 bytes | 905.00 KiB/s, 완료.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To http://192.168.56.105:3000/devops/dev-app.git
   d86af95..d89b73e  main -> main
branch 'main' set up to track 'origin/main'.
  • Gogs Repo 에서 확인합니다.


🧿 자신의 도커 허브 계정에 dev-app (Private) repo 생성, (옵션) Token 발급

Comments