[00:00]
Anthropic에서 Claude Code를 출시했는데
[00:02]
이것은 에이전트 코딩을 위해 사용할 수 있는 CLI 도구입니다
[00:05]
이 영상에서는 DevOps 프로젝트에
[00:07]
이 도구를 사용해보면서 DevOps 엔지니어에게
[00:09]
얼마나 유용한지 확인해보겠습니다
[00:11]
Claude Code는 CLI 도구인데, 이것이 제가 매우 좋아하는 이유입니다
[00:14]
저에게 매력적인 이유는 제가 모든 작업을
[00:17]
Neovim에서 CLI를 통해 하기 때문이죠
[00:19]
그 워크플로우에서 사용할 수 있는 도구가 있다면
[00:22]
정말 좋을 것 같습니다
[00:24]
npm install로 설치하며
[00:27]
좋은 점은 이를 dev container에서도 사용할 수 있다는 것입니다
[00:31]
아시다시피 저는 요즘
[00:33]
거의 전적으로 dev container 내에서 작업하고 있기 때문이죠
[00:36]
저는 거의 전적으로 dev container 안에서
[00:39]
작업하고 있습니다. 여기 준비한 프로젝트가 있는데
[00:42]
이건 얼마 전에 만든 프로젝트입니다
[00:45]
이 프로젝트는 Shelly 센서에서 데이터를 읽고
[00:50]
제 침실 온도를 측정합니다
[00:53]
Shelly 센서는 MQTT 메시지 큐로 데이터를 보내고
[00:56]
제 Kubernetes 홈랩에서 실행 중인 Python 컨테이너가
[01:00]
그 큐를 읽어서
[01:03]
PostgreSQL 데이터베이스에 저장합니다
[01:05]
그리고 제 Grafana 대시보드에서
[01:07]
그 데이터를 읽을 수 있죠
[01:10]
예를 들어 지난 90일 동안의 침실 온도와
[01:13]
습도를 전체적으로 확인할 수 있습니다
[01:15]
습도를 전체적으로 확인할 수 있습니다
[01:18]
이게 이 프로젝트의 기능입니다
[01:19]
그런데 부끄럽게도 이 프로젝트는
[01:22]
제 Kubernetes 홈랩에서 루트 사용자로 실행되고 있습니다
[01:25]
루트 컨테이너로 실행 중이죠
[01:28]
이 문제를 해결해야 합니다
[01:30]
제가 직접 작성했지만 당시에는 시간이 없었습니다
[01:35]
지금 Dockerfile은 이렇게 생겼는데
[01:38]
루트 사용자로 실행되고 있습니다. 좋지 않죠
[01:42]
이것이 Claude Code에게 좋은 도전이 될 것 같습니다
[01:44]
먼저 dev container를 빌드해보겠습니다
[01:46]
devpod up. Recreate 명령어를 실행합니다
[01:49]
이렇게 하면 제 dev container.json을 확인하고
[01:51]
필요한 모든 것을 설치합니다
[01:54]
이 특정 프로젝트에 필요한 모든 것을 설치하고 있습니다
[01:58]
이제 모든 dot 파일을 클론하고
[02:01]
제가 원하는 대로 정확히 설치할 것입니다
[02:02]
저는 이를 위해 Zsh와 mise를 사용하고 있습니다
[02:05]
mise가 fzf, ripgrep, neovim 등을 설치하는 것을 볼 수 있죠
[02:07]
기본적으로 제 개발 환경을
[02:10]
제가 원하는 대로 정확히 설정할 것입니다
[02:12]
이제 devpod SSH를 실행하고
[02:14]
Shelly를 검색하면, 제 환경이
[02:18]
완전히 구성되어 있습니다
[02:21]
이 실험적 설정을 true로 허용하겠습니다
[02:24]
이제 개발할 준비가 되었습니다
[02:27]
Neovim을 열면 모든 설정이 포함된 Neovim이 설치됩니다
[02:31]
모든 것이 설정되면 완전히 격리된 별도의 환경이
[02:34]
제 PC에서 실행됩니다
[02:37]
이제 설정이 완료되었으니 Python extra를 추가하겠습니다
[02:40]
이제 Python이 활성화되었습니다
[02:44]
main.py 파일을 열면
[02:46]
Python 개발에 필요한 모든 패키지가 설치됩니다
[02:49]
이제 개발할 준비가 완료되었습니다
[02:53]
이 모든 것이 마법처럼 보이거나
[02:55]
제 dev container 워크플로우에 관심이 있으시다면
[02:58]
Neovim이 모든 설정과 함께 설치됩니다
[03:01]
모든 설정이 완료되면
[03:04]
완전히 격리된 별도의 환경이
[03:07]
제 PC에서 실행됩니다
[03:09]
이제 완료되었으니 Python extra를 추가하겠습니다
[03:13]
이렇게요. 이제 Python이 활성화되었습니다
[03:16]
이제 main.py 파일을 열면
[03:20]
Python 개발에 필요한 모든 패키지가 설치됩니다
[03:24]
이제 개발할 준비가 완료되었습니다
[03:27]
이 모든 것이 마법처럼 보이거나
[03:29]
제 dev container 워크플로우에 관심이 있으시다면
[03:32]
관심이 있으시다면
[03:34]
이제 개발할 준비가 완료되었습니다
[03:37]
이 모든 것이 마법처럼 보이거나
[03:39]
제 dev container 워크플로우에 관심이 있으시다면
[03:41]
제 커뮤니티를 확인해보세요
[03:43]
school.com/cubecraft에서 확인하실 수 있습니다.
[03:45]
이번 달에 출시된 전체 코스가 있는데,
[03:48]
이 설정 방법을 가르쳐 드립니다.
[03:51]
이제 Claude Code를 설치해 보겠습니다.
[03:54]
여기 문서로 들어가서
[03:57]
npm을 사용해서 Claude Code를
[03:59]
설치할 겁니다.
[04:01]
저희는 npm을 사용해서
[04:03]
Claude Code를 설치할 거예요. 흥미로운 점은
[04:05]
브라우저가 없어도 실제로
[04:08]
인증이 가능하다는 겁니다.
[04:10]
그럼 가이드를 따라가 봅시다.
[04:14]
시작하려면 Claude를 실행하세요.
[04:16]
할 일은 기본적으로 Claude를 실행하는 것입니다.
[04:20]
run claude를 실행하면 됩니다.
[04:23]
이제 몇 가지 설정 옵션을 물어볼 겁니다.
[04:26]
light 텍스트를 선택합니다.
[04:28]
이제 Anthropic 콘솔 계정에
[04:32]
로그인하라고 요청합니다.
[04:35]
그렇게 해봅시다. 제 개발 컨테이너는
[04:38]
브라우저가 없기 때문에
[04:40]
링크를 제공해줍니다.
[04:42]
그 링크를 따라가보겠습니다.
[04:45]
이제 인증을 요청합니다.
[04:47]
저는 이미 Anthropic 계정에 로그인되어 있고
[04:50]
이 코드를 복사해서 붙여넣으면
[04:53]
API 키를 생성합니다.
[04:56]
이제 프로젝트가 설정되었습니다.
[04:58]
이게 기본적인 Claude Code와
[05:01]
우리가 보게 될 인터페이스입니다.
[05:04]
도움말을 보려면 help 명령어를 실행하거나
[05:07]
init 명령어를 실행해서 Claude에 대한
[05:10]
지침이 있는, claude.md 파일을 생성할 수 있습니다.
[05:13]
먼저 그렇게 해보겠습니다.
[05:15]
그렇게 하면
[05:17]
기본적으로 제 작은 프로젝트를
[05:19]
분석하게 됩니다.
[05:21]
필요한 것이 있는지 확인하고
[05:26]
제가 사용하는 규칙이 있는지 확인합니다.
[05:29]
코드뿐만 아니라 리드미를 기반으로
[05:31]
이것을 분석합니다. 좋습니다.
[05:34]
이제 claude.md 파일이 생성되었습니다.
[05:38]
mi가 설치된 도커 컨테이너를 실행하는 방법에 대한
[05:42]
지침이 있네요. 흥미롭습니다.
[05:45]
우리가 사용하고 있는 것을 감지했군요.
[05:47]
UV 패키지 관리자를
[05:48]
감지했네요. 좋아요.
[05:51]
여기 감지한 코드 스타일 가이드라인이 있습니다.
[05:54]
PEP 8 스타일 가이드를 따르라고 하네요. 흥미롭습니다.
[05:58]
여기에 프로젝트 지침을 추가했네요.
[06:01]
그리고 저는 모든 커밋에 컨벤셔널 커밋을
[06:04]
사용하는 것을 좋아합니다.
[06:06]
Claude Code가 git 커밋을 할 수 있다는 걸 알고 있으니
[06:08]
claude.md에 추가해봅시다.
[06:10]
이 저장소에서
[06:15]
컨벤셔널 커밋을 사용한다고 추가합니다.
[06:18]
이전 커밋을 확인해보세요.
[06:22]
이제 커밋 이력을 보고 있습니다.
[06:29]
그리고 이제 '모든 커밋 메시지에 컨벤셔널 커밋을 사용하세요'라고
[06:31]
추가하고 있습니다.
[06:33]
claude.md에 이 수정을 하시겠습니까?
[06:36]
네, 하겠습니다.
[06:38]
감사합니다.
[06:40]
네를 눌렀습니다.
[06:41]
이제 컨벤셔널 커밋 섹션에 이것이 추가되었습니다.
[06:47]
좋습니다. 여기까지 잘 진행되고 있습니다.
[06:50]
Claude Code가 실행 중이고 변경할 수 있으며
[06:52]
모두 제 개발 컨테이너 내부에서 실행되고 있습니다.
[06:54]
이것은 매우 중요한 점입니다.
[06:56]
여기서 시도해보고 싶은 몇 가지 프롬프트가 있습니다.
[06:59]
첫 번째는 이 프로젝트의 레이아웃이 변경되었으니
[07:02]
Docker 파일을 올바른 경로로 업데이트하세요.
[07:04]
이전에는 main.py 파일이
[07:06]
src 디렉토리에 있었습니다.
[07:09]
그리고 이것을 uv로 옮기면서
[07:12]
그리고 제가 uv로 파일을 옮기면서
[07:15]
이것을 프로젝트 이름으로 변경하기로 했어요
[07:16]
이 경우에는 평면 구조를 사용했고
[07:20]
그래서 클로드가 이걸 고칠 수 있는지 확인해 보려고 합니다
[07:23]
이것을 붙여넣어 보겠습니다
[07:26]
아, 이게 아니고 이걸 복사해서
[07:29]
여기 제 프롬프트에 붙여넣겠습니다. '도커 파일을 올바른 경로로 업데이트하세요'
[07:33]
이제 어떻게 처리하는지 봅시다
[07:36]
자, 여기 있네요. 애플리케이션 디렉토리 내용을
[07:40]
컨테이너의 app 위치로 복사합니다
[07:42]
네, 그 수정이 이루어졌네요
[07:44]
이제 클로드가 git 명령어도 도울 수 있는지 확인해 봅시다
[07:47]
여기 이 가이드에 몇 가지 일반적인 작업이 있어요
[07:50]
보시다시피 코드에 대해 질문할 수 있습니다
[07:52]
이게 흥미롭네요, 레이어 캐싱이 어떻게 작동하는지 설명해 주는 것도 있고
[07:56]
git 작업을 자동화할 수도 있어요
[07:59]
변경사항 커밋하기, PR 생성하기와 같은 것들이요
[08:02]
작년 12월에 마크다운 테스트를 추가한 커밋도 있네요
[08:04]
정말 흥미롭습니다
[08:06]
그럼 '변경사항 커밋하기'를 해봅시다
[08:08]
자, 여기 있습니다. git add 명령어군요
[08:10]
git add 명령어는 괜찮네요
[08:14]
이제 봅시다
[08:16]
git commit -m
[08:18]
docs: cloud.md 추가 및 Docker 파일 경로 수정
[08:22]
음, 이건 꽤 긴 커밋 메시지네요
[08:25]
이렇게 긴 커밋 메시지가 좋은 관행인가요?
[08:28]
저는 한 줄짜리에 익숙해서요
[08:31]
이런 건 차라리 PR에 넣는 게 낫겠어요
[08:34]
그래서 클로드에게 말해봅시다
[08:37]
'아니요, 프로젝트 초기에 했던 것처럼
[08:40]
한 줄짜리 커밋 메시지를 사용해주세요'
[08:43]
그래서 이렇게 나왔네요
[08:44]
'docs: cloud.md 추가 및 Docker 파일 경로 수정'
[08:47]
좋습니다. 진행할까요? 네
[08:50]
좋습니다. 이제 git 작업을 자동화했네요
[08:52]
CLI에서 모두 편리하게 할 수 있어요
[08:59]
다음으로 제가 생각한 프롬프트는 '현재 컨테이너가 루트로 실행 중입니다. 루트가 아닌 사용자로 실행하도록 업데이트하고,
[09:07]
Alpine 3.13 이미지를 사용하세요'
[09:10]
이 프롬프트로 프로젝트를 제공해 보겠습니다
[09:12]
여기에 약간의 함정이 있어요
[09:14]
Python 3.13 Alpine 이미지를 사용하라고 명시하지 않았거든요
[09:18]
제대로 처리하는지 확인해 봅시다
[09:21]
Docker 파일을 읽고 있네요
[09:23]
자, 여기 있습니다. Python 3.13 Alpine으로 변경했어요
[09:26]
좋네요. 루트가 아닌 사용자를 생성합니다
[09:29]
애플리케이션 파일의 소유권을 변경하고 루트가 아닌 사용자로 전환합니다
[09:32]
좋습니다. 사실 제 프롬프트에 약간 실수가 있었어요
[09:36]
그래서 프롬프트를 다시 수정해 보겠습니다
[09:39]
3을 누르고 '이거 좋아 보입니다. 한 가지만 더 변경하겠습니다'
[09:43]
'사용자와 그룹 ID를 사용하고 싶습니다'
[09:44]
1000:1000을 제 쿠버네티스 매니페스트에 넣고 싶어요
[09:46]
이제 명령어가 그룹 ID와 이름으로 변경되었네요
[09:49]
이렇게요. 좋습니다. 이제 작동해야 합니다
[09:53]
그러면 이걸 추가합시다. 좋아 보이네요
[09:56]
이제 Docker 파일 최적화도 해보겠습니다
[09:59]
가능한 한 작게 만들어 보려고요
[10:01]
이렇게요. 자, 어떻게 처리했는지 봅시다
[10:05]
이제 작업 디렉토리를 설정했고
[10:07]
멀티스테이지 빌드를 사용하지는 않네요
[10:09]
흠, 제 프롬프트에 실수가 있었나 봅니다
[10:13]
프롬프트를 다시 개선해 봅시다
[10:15]
3을 누르고 다시 말해보겠습니다
[10:18]
이 내용이 좋아 보입니다. 한 가지만 더 변경할게요
[10:22]
사용자와 그룹 ID를
[10:26]
1000:1000으로 쿠버네티스
[10:29]
매니페스트에 사용하고 싶습니다
[10:30]
좋습니다. 이제 명령어가 그룹 ID와
[10:33]
이름을 이렇게 변경했네요. 이제 작동할 겁니다
[10:37]
그럼 이걸 추가합시다. 좋아 보이네요
[10:41]
그리고 이제 Docker 파일을 최적화해서
[10:44]
가능한 한 작게 만들어 보겠습니다
[10:47]
이렇게요. 자, 어떻게 처리했는지 봅시다
[10:52]
이제 작업 디렉토리를 설정했고
[10:54]
멀티스테이지 빌드를 사용하지는 않네요
[10:57]
흠, 뭔가 잘못된 것 같습니다
[10:59]
이제 작업 디렉토리를
[11:02]
설정했네요. 멀티스테이지 빌드는 사용하지 않고 있어요
[11:05]
이 시점에서는
[11:10]
작업 디렉토리를 설정했네요
[11:14]
빌드 단계에서요.
[11:21]
네.
[11:25]
좋아요. 음... 제가 생각했던 건
[11:29]
더
[11:30]
멀티스테이지 방향으로 생각하고 있었는데요.
[11:34]
멀티스테이지
[11:40]
빌드로요. 어떻게 작성하는지 봅시다.
[11:51]
여기 있네요. 이게 더 나아 보이네요. 이제
[11:53]
빌드
[11:55]
스테이지가 있고, requirements.txt를 복사하고
[11:59]
디렉토리를 복사하고
[12:01]
그 다음 최종 스테이지가 있네요.
[12:05]
좋아요. 이제 멀티스테이지
[12:09]
빌드가 있습니다.
[12:11]
좋습니다. 이걸 수락하고
[12:15]
이제 이것이 실제로 제대로 빌드되는지 확인해 봅시다.
[12:18]
이제 제 프로젝트로 다시 가볼게요.
[12:20]
제가 DB가 있는 Docker Compose 파일이 있는데
[12:23]
현재 그 포트들이 사용 중이라
[12:25]
그걸 변경하는 것은 신경 쓰지 않을 거예요.
[12:28]
그냥 이게 실제로 작동하는지 테스트할 겁니다.
[12:31]
그리고 환경 파일도 필요할 거예요.
[12:33]
이런 식으로 빌드를 해볼게요.
[12:36]
Docker compose build로 실행해서
[12:39]
이미지가 제대로 빌드되는지 확인해 봅시다.
[12:43]
좋아요, 훌륭합니다.
[12:46]
에러가 있긴 하지만 이건 사실
[12:48]
데이터베이스에 연결할 수 없어서 발생한 오류예요.
[12:55]
Python 명령어를 실행할 때
[12:58]
실제로 모든 의존성과 필요한 패키지를
[13:01]
가져올 수 있었습니다.
[13:04]
그래서 Python 프로그램이 실제로 올바르게 실행되고 있어요.
[13:07]
보시다시피 로깅까지 하고 있고
[13:10]
Postgres 연결을 생성하는 시점에서
[13:11]
실패했습니다.
[13:15]
빌드는 제대로 작동합니다.
[13:18]
마지막으로 제가 약간의 변경을 했는데요.
[13:20]
이 프로젝트는 이전에
[13:21]
poetry를 사용했었고 지금은
[13:24]
UV로 마이그레이션했습니다.
[13:28]
구조가 약간 변경되었는데
[13:30]
이전에는 requirements.txt를 사용했었고
[13:33]
이제 UV로 마이그레이션했습니다.
[13:36]
구조가
[13:41]
조금 바뀌었어요. 이전에는
[13:44]
requirements.txt를 사용했는데
[13:46]
requirements.t
[13:47]
제 조사에 따르면 그건 이제 구식 방법이 되었고
[13:51]
이제 UV가 등장하면서
[13:54]
더 깔끔한 방법이 생겼어요
[13:56]
그냥 pyproject.toml을 사용하는 거죠.
[13:58]
다음으로 클로드 코드에게 줄 프롬프트는
[14:01]
"이 프로젝트는 이전에 requirements.txt를 사용했었는데
[14:05]
프로젝트를 uv로 마이그레이션했으니
[14:07]
docker 파일을 업데이트해서
[14:09]
uv와 pyproject.toml을 사용하도록 해주세요"입니다.
[14:12]
이렇게 내용이 있지만
[14:14]
이게 상대적으로 새로운 기술이기 때문에
[14:18]
문서도 같이 제공할 것 같아요.
[14:20]
Docker 컨테이너에서 UV를 사용하는 방법에 대한
[14:24]
모든 문서를 복사할 겁니다.
[14:26]
이렇게요.
[14:29]
그리고 클로드
[14:32]
MD... docs
[14:37]
디렉토리를 추가할게요.
[14:39]
아, 그 전에 변경사항을 커밋해야겠네요.
[14:44]
변경사항을 커밋합니다.
[14:54]
흥미롭네요. docker-compose를 변경한 것을
[14:56]
감지했네요. 이 편집을 하시겠습니까?
[14:58]
아니요, 아니요. docker-compose는
[15:01]
지금은 무시하세요.
[15:04]
좋아요, 이제 Docker 파일을 커밋하고 있습니다.
[15:05]
수정사항을 반영하시겠습니까?
[15:08]
아니요.
[15:10]
지금은 Docker compose를 무시해주세요.
[15:15]
좋아요. 이제 Docker 파일을 커밋하고 있네요.
[15:18]
Docker 파일
[15:24]
업데이트가 완료됐습니다. 이제
[15:27]
docs 디렉토리를 만들겠습니다. 그리고 docs
[15:29]
디렉토리 안에,
[15:35]
docs에,
[15:36]
파일을 생성하겠습니다.
[15:41]
uvd를 만들고 거기에 이 모든 내용을 붙여넣겠습니다.
[15:44]
기술적으로는 마크다운이 아니지만, 한번 보죠.
[15:48]
그리고 이제 이것을 프롬프트에도 추가하겠습니다.
[15:51]
docs/uvd.md에 지침을 추가했습니다.
[15:54]
이 디렉토리에 최신 UV 문서를
[15:58]
추가했고 Docker 컨테이너에서 UV를 사용하는 방법에 대한
[16:03]
지침도 있습니다.
[16:08]
이제 이것이 어떻게 작동할지 살펴보겠습니다.
[16:11]
Docker 컨테이너에서요.
[16:13]
이게 어떻게 진행될지 봅시다.
[16:16]
인터넷에 접근할 수 없는 LLM에게는
[16:18]
꽤 어려운 과제라고 생각합니다.
[16:20]
자, 한번 확인해 봅시다.
[16:23]
좋아요, 확인해 보죠.
[16:26]
이제 UV Python 이미지를
[16:27]
사용하게 되었네요. 그래서 UV가 이미 있을 겁니다.
[16:31]
그런 다음 pi project.toml과 UV lock을 복사하고
[16:35]
UV frozen으로 의존성을 설치해서
[16:38]
재현성을 보장합니다.
[16:42]
좋아 보이네요.
[16:43]
재현성을 보장하기 위해 UV frozen으로 의존성을 설치합니다.
[16:47]
괜찮아 보이네요.
[16:49]
아, 이건 좋지 않네요.
[16:55]
이걸 다시 SRC로 바꿨어요. 왜 그런 거죠?
[16:57]
실제로 이걸 두 번 추가하고 있네요. 그건 좋지 않습니다.
[17:01]
음, 좋지 않네요.
[17:02]
알겠습니다. 몇 가지 문제가 있네요.
[17:04]
왜 SRC 디렉토리를 도입하는 거죠? 그러지 마세요.
[17:09]
단순하게 유지하세요.
[17:14]
이제 훨씬 나아 보이네요.
[17:18]
이미지를 가져와서 PI 프로젝트를 복사한 다음
[17:21]
의존성을 설치하고 있습니다.
[17:24]
그런데 이걸 두 번 실행하고 있어요.
[17:26]
왜 그러는지 알아봅시다.
[17:31]
왜 그런지 확인해 보죠.
[17:35]
왜 UV sync를
[17:38]
두 번 실행하고 있나요?
[17:40]
좋아요, 이제 UV sync를 한 번만 실행하네요.
[17:46]
그래서 좋습니다. 그리고 여기에 이걸 추가하고 있어요.
[17:49]
일단 이걸 받아들이겠습니다.
[17:52]
이제 이걸 바로 커밋하라고 요청하네요.
[17:55]
흥미롭네요.
[17:58]
git add는 더 이상 확인이 필요하지 않을 것입니다.
[18:00]
물어볼 필요가 없어요. 이제 git commit을 실행할 거고
[18:04]
그걸 진행하겠습니다.
[18:05]
이제 애플리케이션을 테스트해 봅시다.
[18:08]
docker build를 다시 실행해서
[18:10]
애플리케이션이 실제로 빌드되는지 확인해 보겠습니다.
[18:13]
제대로 실행되는지 보겠습니다.
[18:16]
자, 이제 애플리케이션을 테스트해 봅시다.
[18:19]
docker build를 다시 실행해서
[18:21]
애플리케이션이 실제로 빌드되는지 볼게요.
[18:25]
됐네요! 실제로 실행됐습니다.
[18:27]
모든 의존성을
[18:28]
올바르게 설치했군요.
[18:30]
여기에 의존성이 없었다면
[18:32]
실행되지 않고 의존성을 찾을 수 없어서
[18:35]
오류가 발생했을 겁니다.
[18:38]
그래서 제대로 실행된다는 것을
[18:40]
알 수 있습니다. 이제 한 가지 더 해보고
[18:42]
쿠버네티스 매니페스트도
[18:44]
업데이트할 수 있는지 확인해 보겠습니다.
[18:47]
홈랩 저장소로 가서
[18:49]
풀 해보겠습니다.
[18:52]
Shelly 배포가 어디 있는지 봅시다.
[18:54]
여기 Shelly 배포가 있네요.
[18:56]
편의상 이걸 지금 저장소에
[18:59]
추가해 보겠습니다.
[19:03]
docs에 예제 배포 YAML을 만들고
[19:06]
이렇게 붙여넣겠습니다.
[19:11]
편의상 이걸 제 저장소에
[19:14]
추가하겠습니다. docs에
[19:20]
example_deployment.yml을
[19:22]
만들고 이렇게 붙여넣겠습니다.
[19:27]
예제 배포 YAML을
[19:30]
추가했습니다.
[19:32]
쿠버네티스 클러스터에서
[19:33]
사용자 1000으로 실행되도록 이것을 업데이트해 주세요.
[19:38]
심지어 알아차리지 못해도 확인해 보겠습니다.
[19:41]
예제 배포 YAML을 추가했으니, 쿠버네티스 클러스터에서
[19:48]
사용자 1000으로 실행되도록 업데이트해 주세요.
[19:54]
심지어 파일을 찾지 못해도 확인해 보겠습니다.
[19:59]
YAML 파일을 감지할 수 있는지 봅시다.
[20:01]
제가 위치를 알려주지 않아도 감지하는지 확인해 봅시다.
[20:07]
좋네요, 실제로 YAML 파일을 검색하기 위해
[20:09]
글로빙(globbing)을 사용했군요. 흥미롭네요.
[20:12]
시큐리티 컨텍스트를 설정하고
[20:15]
runAsUser를 설정했으며, 권한도 제한했습니다.
[20:18]
실제로 이제 완전히 보안이 적용되었네요.
[20:21]
그래서 음, 실제로 이것은
[20:23]
이제 완벽하게 보안이 적용되었습니다. 네, 이것을
[20:27]
제 올바른 배포로 사용하고 싶습니다.
[20:36]
이제
[20:37]
제 github.com은
[20:40]
shelly인데, 여기로 가면
[20:46]
제 GitHub Actions가 이제
[20:51]
이 변경사항을 푸시하면 GitHub Actions가
[20:53]
이것의 새 컨테이너 이미지를 빌드할 겁니다.
[20:56]
네, 이걸 커밋하고 싶습니다. 변경사항을 푸시하죠.
[21:03]
푸시하고 싶은데, 궁금하네요.
[21:09]
네, 제 SSH 키를 감지할 것입니다.
[21:12]
성공적으로 변경사항을 푸시했습니다. 그리고
[21:17]
이제 GitHub Actions가 실행 중인 것을 볼 수 있습니다.
[21:21]
이제 보면
[21:23]
GitHub Actions가 실제로 실행 중입니다.
[21:26]
그래서
[21:27]
이것은 새 태그로 이어질 것입니다.
[21:30]
GitHub Actions가 자동으로 태그를 생성하니까요.
[21:34]
만약 이것이 모두 빌드되고 제대로 작동하면
[21:36]
매니페스트를 업데이트할 수 있고
[21:38]
컨테이너가 비루트 사용자로
[21:40]
실행될 것입니다.
[21:42]
좋습니다. 이제 이미지가 업데이트되었고
[21:46]
태그를 확인하면
[21:49]
최신 태그는 이제
[21:52]
030입니다.
[21:54]
제가 할 일은
[21:58]
deployment.yaml을 열고
[22:03]
홈랩으로 가서
[22:06]
붙여넣기 하는 것입니다.
[22:08]
이것을 030으로 업데이트합시다.
[22:14]
그리고 푸시하겠습니다. 'Shelly를 비루트로 업데이트'
[22:18]
이것을 홈랩 저장소에 푸시하겠습니다.
[22:23]
그런 다음 개발 컨테이너에 들어가서
[22:30]
앱을 조정할 것입니다.
[22:34]
이제 GitOps 컨트롤러에게
[22:40]
최신
[22:42]
변경사항을 가져오라고 지시하는 중입니다.
[22:45]
이제 K9s를 열면
[22:47]
새로운 컨테이너가 배포되는 것을 볼 수 있을 겁니다.
[22:50]
여기 있네요. Shelly API가 이미 실행 중입니다.
[22:53]
14초 전에 시작됐네요. 로그를 확인하면
[22:58]
여기 있습니다. 데이터 삽입이
[23:00]
완료되었습니다. 성공적으로 실행 중입니다.
[23:03]
여기서 쉘로 들어가면
[23:07]
이제 'whoami' 명령을 실행하면
[23:10]
app 사용자로 실행 중입니다.
[23:12]
cat /etc/passwd를 보면
[23:16]
사용자 1000:1000으로 실행 중입니다. 예를 들어
[23:20]
apt-key add를 하면
[23:24]
권한이 거부됩니다. 비루트 사용자이기 때문에
[23:26]
패키지를 추가할 수 없습니다. sudo su를 해도
[23:31]
작동하지 않습니다.
[23:34]
자, 여기 있습니다. 성공적으로 애플리케이션을
[23:37]
멀티스테이지 빌드로 업데이트했습니다.
[23:40]
프로젝트를 UVic로 변환했고
[23:43]
패키지 설치 방법으로 그 방식을 사용하고 있습니다.
[23:47]
이제 자동으로 변경사항을 GitHub에 푸시하고
[23:51]
또한 성공적으로 비루트 사용자로 실행할 수 있게 되었습니다.
[23:54]
프로젝트를 UVic로 변환했고 그 방식으로 패키지를 설치하고 있습니다.
[23:59]
이제 자동으로
[24:01]
GitHub에 변경사항을 푸시하고 있으며
[24:03]
또한 비루트 사용자로 성공적으로 실행할 수 있게 되었습니다.
[24:06]
정말 감명받았습니다. 실제로 이것에 매우 만족합니다.
[24:10]
이 도구에 매우 만족하는데,
[24:13]
보시다시피 이제
[24:14]
에이전트 코딩의 이점을 가지면서
[24:16]
완전히 CLI에서 작업하고 있습니다.
[24:18]
이 도구에 매우 만족하는데, 보시다시피
[24:21]
이제 에이전트 코딩의 이점을 가지면서
[24:24]
완전히 CLI에서 작업하고 있습니다. 이전 세션과
[24:28]
Claude Code와 일반 Neovim 사이를
[24:30]
오가며 세션 간에 왔다갔다 할 수 있고
[24:33]
개발 컨테이너를 사용하여 CLI에서 익숙하게
[24:37]
원하는 모든 작업을 할 수 있습니다.
[24:39]
개발 컨테이너와 결합된 Claude Code는
[24:41]
매우 강력한 조합입니다.
[24:44]
마지막으로 Claude Code가 매우 비싸다고 들었는데,
[24:46]
비용이 어떻게 되는지 확인해 봅시다.
[24:49]
Claude Code가 매우 비싸다고 들었는데,
[24:50]
비용이 어떻게 되는지 확인해 봅시다.
[24:53]
종료해 보겠습니다.
[24:54]
좋아요. 이 전체 세션에 1달러가 들었네요.
[24:57]
코드가 많지 않은 아주 작은 프로젝트였습니다.
[25:01]
그래서 네, 이게 많은 돈인가요? 모르겠네요.
[25:04]
직접 Claude API를 사용하는 것보다는 더 비싼 것 같습니다.
[25:07]
거기서는 20달러를 소진하는 데 엄청 오래 걸리거든요.
[25:09]
하지만 저에게는 감당할 수 있는 수준입니다.
[25:12]
저는 이 정도면 괜찮습니다.
[25:13]
이것은 확실히 제가 얻은 가치에 비해 1달러의 가치가 있습니다.
[25:16]
하지만 더 큰 프로젝트와 더 큰 작업에서는
[25:20]
비용이 빠르게 늘어날 수 있다고 들었습니다.
[25:22]
그래서 이것을 더 많이 사용하고 테스트해 볼 계획입니다.
[25:25]
만약 여러분이 제가 사용한 개발 컨테이너 워크플로에
[25:28]
관심이 있다면, 전체 과정을 제공해 드립니다.
[25:31]
또는 제 홈랩에서 제가 한 작업이 마음에 드셨다면,
[25:32]
쿠버네티스 홈랩을 직접 구축하는 데
[25:35]
도움을 드릴 수도 있습니다. 이 모든 것과 저에게 직접 액세스하려면
[25:38]
school.com/cubcraft로 오세요.
[25:40]
그곳에서 뵙기를 바랍니다.
[25:42]
시청해 주셔서 감사합니다.
[25:44]
다음 시간에 뵙겠습니다.
[25:47]
제 홈랩에서 했던 작업이 마음에 드셨다면,
[25:50]
쿠버네티스 홈랩을 직접 구축하는 데도 도움을 드릴 수 있습니다.
[25:52]
이 모든 것과 저와 커뮤니티에 직접 접근하려면,
[25:54]
school.com/cubcraft로 오세요.
[25:57]
거기서 뵙기를 바랍니다.
[25:59]
시청해 주셔서 감사합니다. 다음에 뵙겠습니다.
[26:00]
다음에 뵙겠습니다.