전 포스팅에서는 코드 변경이 생기면 수동으로 컨테이너 재배포를 했기에 그에 대한 번거로움을 줄일 수 있는 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로 초기암호를 확인할 수 있다.

c77cccf0-97a1-467f-891c-fcc3f1012704

그 다음은 플러그인 설정을 하고 그 다음은 user 생성을 하고 URL 설정하는 데에 내 pc ip를 입력해 주면 젠킨스 초기세팅은 완료된다!

85303df6-997e-4f9c-93bf-0d16a4229807

위에 언급한 대로 Jenkins 컨테이너에서 호스트에 있는 도커 데몬을 사용할 건데 설정은 두 가지 방식이 있다.

image

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

image 1

젠킨스 컨테이너 내에서 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

그러고 젠킨스 컨테이너에 빠져나와 해당 설정이 적용되게 젠킨스 컨테이너 재기동을 해주면 된다!

image 2

그럼 위에 그림대로 docker 그룹에 포함된 jenkins 유저가 docker 실행이 가능해 진다.

Gogs

gogs는 http://127.0.0.1:3000/install로 접속해 보면 설치단계 페이지가 먼저 보인다.

55c238c4-3756-43dc-9180-ea282635e167

데이터베이스 유형은 SQLite3으로 하고 URL에 내 pc ip를 적고 브랜치는 main으로 변경하고 관리자 계정을 생성해 주면 된다.

로그인하고 들어오면 아래 화면이 보이는데 이 때 번역이슈로 한국어보다는 English로 하단에서 변경해 주는게 좋다

image 3

이제 젠킨스에서 해당 저장소에 접근할 수 있게 내 설정에서 토큰을 발행한다

image 4

7138113217be2e4d1c99a4f5e8464f32c687a35a

그 다음은 아래처럼 프라이빗 레포지토리를 생성한다

image 5

여기까지 저장소에서 할일은 마쳤고 이제 젠킨스 내부에 접속하여 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에는 아까 발급한 토큰을 입력해 주면 된다.

image 6

마지막으로 해당 레포지토리를 잘 받아온 것을 확인할 수 있다

image 7

원격 레포지토리에도 새로 만든 파일이 잘 반영이 되나 확인하기 위해 파이썬코드, 도커파일, 버전정보파일을 생성해서 push해 본다

image 8

잘반영되었다!

image 9

Categories:

Updated:

Leave a comment