[CI/CD]3주차 - 실습 환경 구성
쿠버네티스 환경에서의 배포 자동화를 실습하기 위해
Jenkins, Gogs, Docker, Kind, ArgoCD를 사용할 것이다.
작업 환경 구성
먼저 Jenkins와 Gogs를 docker compose를 통해 설치한다.
이전 포스팅과 설치 내용은 동일하다
cat <<EOT > 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
EOT
docker compose로 기동시키고
docker compose up -d
docker compose ps
Jenkins 초기 세팅
http://127.0.0.1:8080에 접속하여 젠킨스 플러그인 설치 및 계정 생성을 마친다.
참고로 나는 이전 세팅 때 볼륨이 남아있어서 docker compose down -v
로 jenkins와 gogs의 볼륨까지 삭제한 후 진행하였다.
젠킨스 서버에 접속한 후 내부에 도커 실행 파일까지 설치해 준다
docker compose exec --privileged -u root jenkins bash
-----------------------------------------------------
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
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 curl tree jq yq -y
젠킨스 컨테이너에서 jenkins 유저가 도커를 실행할 수 있게 docker 그룹을 생성하고 실행 파일 소유자그룹을 docker 그룹으로 변경해 준다
groupadd -g 2000 -f docker
chgrp docker /var/run/docker.sock
jenkins 유저를 docker 그룹에 추가해 준다.
usermod -aG docker jenkins
docker compose restart jenkins
로 젠킨스 컨테이너 재기동해 준다.
Gogs 초기 세팅
http://127.0.0.1:3000/install에 접속하여 초기 세팅을 진행해 준다.
Your Settings > Applications > Generate New Token을 클릭해서 git 작업을 위한 토큰 하나 발급해 준다
개발팀용(dev-app)과 데브옵스팀용(ops-deploy)으로 레포 두 개도 생성해 준다.
이제 로컬에서 해당 레포를 clone해 오고 main 브랜치를 기본으로 설정해 준다.
git clone http://192.168.219.100:3000/devops/dev-app.git
git config user.name "devops"
git config user.email "devops@example.com"
git config init.defaultBranch main
git config credential.helper store
현재 시간, 버전, hostname을 출력하는 server.py
를 생성해 준다.
cat > server.py <<EOF
*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()*
EOF
Dockerfile은 간단하게 server.py를 구동시키는 애플리케이션으로 하나 생성해 준다
cat > Dockerfile <<EOF
FROM python:3.12
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app
CMD python3 server.py
EOF
echo "0.0.1" > VERSION
로 버전 파일을 생성해 주고 신규 생성한 아래 세 파일을 git에 푸시한다
DockerHub Access Token 발급
Docker Hub를 이미지저장소로 push&pull하기 위해서 Account settings > Security > Personal access tokens에서 토큰 하나 발급해 준다
Access permissions는 Read, Write, Delete로 설정해 준다
여기까지 실습 환경 구성을 1차적으로 완성하였다