[CI/CD]1주차 - CI/CD 실습 환경 구성
전 포스팅에서는 코드 변경이 생기면 수동으로 컨테이너 재배포를 했기에 그에 대한 번거로움을 줄일 수 있는 CI/CD의 필요성을 느꼈다. 이번 포스팅은 CI/CD를 구축하기 위한 Jenkins와 Gogs의 세팅과정을 담았다.
Jenkins
docker compose를 활용하여 jenkins랑 gogs를 컨테이너로 띄울거다. gogs는 Go로 작성된 자체 호스팅된 오픈 소스 Git 서버이다.
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
젠킨스는 8080 포트로 외부노출할거고 50000포트는 기본적으로 젠킨스 마스터와 통신하는 포트라고 한다.
젠킨스 내부에서 docker 명령어를 날릴 수 있게 docker.sock을 공유할 수 있게 /var/run/docker.sock
도 마운트 설정을 했다. 그럼 젠킨스가 로컬에 있는 docker를 사용할 수 있게 된다
gogs도 웹접속을 위한 3000포트 및 ssh 접속을 위한 포트 설정과 마운트 설정을 해주고
각 컨테이너에 restart: unless-stopped
옵션을 추가해 주었는데 이는 컨테이너를 stop 시키지 전까지는 항상 재시작시킨다는 옵션이다.
이제 127.0.0.1:8080으로 젠킨스 웹페이지로 접속한다. 그럼 초기암호 입력하라는 창이 뜨는데 docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
로 초기암호를 확인할 수 있다.
그 다음은 플러그인 설정을 하고 그 다음은 user 생성을 하고 URL 설정하는 데에 내 pc ip를 입력해 주면 젠킨스 초기세팅은 완료된다!
위에 언급한 대로 Jenkins 컨테이너에서 호스트에 있는 도커 데몬을 사용할 건데 설정은 두 가지 방식이 있다.
Dind(Docker-in-docker)는 그림처럼 Host와 젠킨스 컨테이너 둘다 별도의 도커데몬을 가져가는 것이고
DooD(Docker-out-of-Docker)는 Host에 설치된 도커데몬을 젠킨스 컨테이너에서도 소켓을 통해 동일하게 사용할 수 있는 것이다.
이 실습에서는 DooD 방식을 사용하기 위해 위에 언급한 docker compose 파일에 소켓을 마운트 시켜두었다.
그럼 젠킨스 서버에는 도커데몬 설치는 필요없이 docker-ce-cli
만 설치해 주면 된다
Jenkins 컨테이너 내부에 도커 실행 파일을 설치하기 위해 서버에 접속하는데 이 때 root로 접속할 수 있게 privileged 옵션을 사용한다. 그냥 접속하게 되면 jenkins 유저로 들어가게 되기 때문이다.
docker compose exec --privileged -u root jenkins bash
접속 후 docker-ce-cli
를 설치하고 나서 docker 명령어를 사용해 보면 호스트에서와 동일하게 docker 사용이 가능해 진다.
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 -y
젠킨스 컨테이너 내에서 root 유저로 docker 명령을 날릴 수 있는 것이다.
jenkins 서버에서 사용하는 jenkins 유저로는 해당 명령어를 날릴 수 없기 때문에 docker 그룹에 포함시켜 준다
groupadd -g 2000 -f docker
chgrp docker /var/run/docker.sock
ls -l /var/run/docker.sock
usermod -aG docker jenkins
cat /etc/group | grep docker
그러고 젠킨스 컨테이너에 빠져나와 해당 설정이 적용되게 젠킨스 컨테이너 재기동을 해주면 된다!
그럼 위에 그림대로 docker 그룹에 포함된 jenkins 유저가 docker 실행이 가능해 진다.
Gogs
gogs는 http://127.0.0.1:3000/install
로 접속해 보면 설치단계 페이지가 먼저 보인다.
데이터베이스 유형은 SQLite3으로 하고 URL에 내 pc ip를 적고 브랜치는 main으로 변경하고 관리자 계정을 생성해 주면 된다.
로그인하고 들어오면 아래 화면이 보이는데 이 때 번역이슈로 한국어보다는 English로 하단에서 변경해 주는게 좋다
이제 젠킨스에서 해당 저장소에 접근할 수 있게 내 설정에서 토큰을 발행한다
7138113217be2e4d1c99a4f5e8464f32c687a35a
그 다음은 아래처럼 프라이빗 레포지토리를 생성한다
여기까지 저장소에서 할일은 마쳤고 이제 젠킨스 내부에 접속하여 git 설정을 해주면 된다
젠킨스 컨테이너에 접속한 후 호스트 볼륨에 마운트한 /var/jenkins_home/
로 이동해서 작업을 진행한다.
git config --global user.name "devops"
git config --global user.email "a@a.com"
git config --global init.defaultBranch main
계정정보를 설정하고 방금 만든 레포지토리를 clone해 온다. 이 때 Username에는 계정명을, Password에는 아까 발급한 토큰을 입력해 주면 된다.
마지막으로 해당 레포지토리를 잘 받아온 것을 확인할 수 있다
원격 레포지토리에도 새로 만든 파일이 잘 반영이 되나 확인하기 위해 파이썬코드, 도커파일, 버전정보파일을 생성해서 push해 본다
잘반영되었다!
Leave a comment