Ssoon

1주 : Jenkins CI/CD + Docker : 2 본문

CICD 맛보기

1주 : Jenkins CI/CD + Docker : 2

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

CI/CD 실습 환경 구성

 

  •  Jenkins와 Gogs를 실행하여 CI/CD 환경을 구축하는데 필요한 설정을 포함하고 있습니다. Jenkins는 CI/CD 파이프라인을 관리하고, Gogs는 Git 저장소를 호스팅하는 역할을 합니다.
  • 이 설정 파일을 사용하여 두 서비스를 동시에 실행할 수 있습니다. docker-compose up -d 명령어로 Jenkins와 Gogs를 백그라운드에서 실행할 수 있습니다.
[ssoon@localhost cicd-labs]$ 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.yaml 파일에 정의된 Jenkins와 Gogs 컨테이너가 실행되며, 각 서비스는 설정된 포트와 볼륨을 바탕으로 동작합니다.
  • Jenkins는 웹 UI (8080 포트)와 Jenkins 에이전트 연결을 위한 포트 (50000)로 실행됩니다.
  • Gogs는 Git 서비스를 제공하는 웹 UI (3000 포트)와 SSH 서비스 (10022 포트)로 실행됩니다.
[ssoon@localhost cicd-labs]$ docker compose up -d
[+] Running 21/21
 ✔ gogs Pulled                                                                                                            8.7s 
   ✔ fbcfea79c1c4 Pull complete                                                                                           1.3s 
   ✔ b750f2521639 Pull complete                                                                                           3.8s 
   ✔ cda92632d61f Pull complete                                                                                           3.9s 
   ✔ 2ce425e35c79 Pull complete                                                                                           4.0s 
   ✔ f1f82ac6ad8d Pull complete                                                                                           4.1s 
   ✔ 9299ca8ed698 Pull complete                                                                                           5.1s 
   ✔ f3c4d7f3a9bb Pull complete                                                                                           5.2s 
 ✔ jenkins Pulled                                                                                                        17.5s 
   ✔ b2b31b28ee3c Already exists                                                                                          0.0s 
   ✔ 09ceeed8fa1c Pull complete                                                                                          11.6s 
   ✔ 19ffe971b4b1 Pull complete                                                                                          11.8s 
   ✔ d3073edebc88 Pull complete                                                                                          11.8s 
   ✔ cbe4b9088bc7 Pull complete                                                                                          11.8s 
   ✔ 6247593ed994 Pull complete                                                                                          12.8s 
   ✔ 40b97309cacd Pull complete                                                                                          12.8s 
   ✔ 8a99a6e22ba3 Pull complete                                                                                          12.9s 
   ✔ b4e68d4601f6 Pull complete                                                                                          13.9s 
   ✔ 18c1dbc71d53 Pull complete                                                                                          13.9s 
   ✔ e44966ae9784 Pull complete                                                                                          14.0s 
   ✔ ada8f1c507ec Pull complete                                                                                          14.0s 
[+] Running 5/5
 ✔ Network cicd-labs_cicd-network   Created                                                                               0.4s 
 ✔ Volume "cicd-labs_jenkins_home"  Created                                                                               0.0s 
 ✔ Volume "cicd-labs_gogs-data"     Created                                                                               0.0s 
 ✔ Container gogs                   Started                                                                               1.5s 
 ✔ Container jenkins                Started                                                                               1.5s
 
 [ssoon@localhost cicd-labs]$ docker compose ps
NAME      IMAGE             COMMAND                   SERVICE   CREATED          STATUS                             PORTS
gogs      gogs/gogs         "/app/gogs/docker/st…"   gogs      25 seconds ago   Up 23 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   25 seconds ago   Up 23 seconds                      0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp
  • docker compose exec를 사용하여 실행 중인 두 컨테이너(gogs, jenkins)에 접근하고, 각 컨테이너 내에서 whoami와 pwd 명령을 실행하여 해당 컨테이너에서 현재 사용자와 작업 디렉터리를 확인합니다.
[ssoon@localhost cicd-labs]$ for i in gogs jenkins ; do echo ">> container : $i <<"; docker compose exec $i sh -c "whoami && pwd"; echo; done
>> container : gogs <<
root
/app/gogs

>> container : jenkins <<
jenkins
/

[ssoon@localhost cicd-labs]$ docker compose exec jenkins bash
jenkins@6040c315080f:/$ whoami
jenkins

[ssoon@localhost cicd-labs]$ docker compose exec gogs bash
6a58eedeb25b:/app/gogs# whoami
root
  •  Jenkins 컨테이너 내에 있는 initialAdminPassword 파일의 내용을 출력하는 명령어입니다. 이 파일은 Jenkins 설치 후, 초기 관리자 비밀번호를 담고 있으며, Jenkins 웹 UI에 처음 로그인할 때 사용됩니다.
[ssoon@localhost cicd-labs]$ docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
64daf6eead8e469bb1d89da4fe9c4c0b

  • Admin 유저 생성

  • Jenkins URL 설정

  • 접속을 확인합니다.

🧿 Jenkins 컨테이너에서 호스트에 도커 데몬 사용 설정

DIND (Docker in Docker) vs DooD (Docker out of Docker)

개념 Docker 컨테이너 내에서 Docker를 실행하는 방식 Docker 컨테이너에서 호스트 Docker 데몬을 직접 접근하는 방식
구성 Docker 컨테이너 내부에 Docker를 설치하여 사용 Docker 컨테이너는 호스트 머신의 Docker 데몬과 통신
사용 예시 CI/CD 파이프라인에서 Docker 컨테이너를 빌드할 때 사용 Docker 컨테이너에서 호스트 시스템의 Docker를 사용해야 할 때
보안 보안상 이슈가 있을 수 있음 (컨테이너에서 Docker 데몬에 접근) 보안상의 위험은 덜하지만 호스트와 컨테이너가 밀접하게 연결됨
성능 Docker 데몬을 컨테이너 내에서 실행하므로 오버헤드 발생 가능 호스트에서 직접 Docker 데몬을 사용하므로 성능적으로 더 효율적
유스케이스 컨테이너 내에서 독립적인 Docker 환경이 필요할 때 호스트의 Docker를 그대로 사용하여 리소스를 절약할 때
설치 및 설정 Docker 데몬을 컨테이너 내부에 설치하고 실행 Docker 컨테이너에서 호스트 Docker 소켓을 공유하여 실행
장점 독립적이고 격리된 환경에서 Docker를 실행할 수 있음 호스트와 리소스를 공유하여 더 빠르고 간편한 설정 가능
단점 Docker 데몬을 컨테이너 내에서 실행하는 것이 보안상 리스크가 될 수 있음 호스트 시스템에 의존적이므로 제한적인 환경에서는 문제가 될 수 있음

 

  • jenkins 컨테이너 내에서 root 사용자 권한으로 bash 셸을 실행하고  docker 를 설합니다.
[ssoon@localhost cicd-labs]$ docker compose exec --privileged -u root jenkins bash

root@6040c315080f:/# id
uid=0(root) gid=0(root) groups=0(root)

root@6040c315080f:/# curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc

root@6040c315080f:/# chmod a+r /etc/apt/keyrings/docker.asc

root@6040c315080f:/# 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

root@6040c315080f:/# apt-get update && apt install docker-ce-cli curl tree jq -y
Get:1 https://download.docker.com/linux/debian bookworm InRelease [43.3 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]     
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:5 https://download.docker.com/linux/debian bookworm/stable amd64 Packages [31.7 kB]
Get:6 http://deb.debian.org/debian bookworm/main amd64 Packages [8789 kB]
Get:7 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2712 B]
Get:8 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [206 kB]
Fetched 9326 kB in 1s (6521 kB/s)                        
Reading package lists... Done
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
curl is already the newest version (7.88.1-10+deb12u8).
The following additional packages will be installed:
  docker-buildx-plugin docker-compose-plugin libjq1 libonig5
The following NEW packages will be installed:
  docker-buildx-plugin docker-ce-cli docker-compose-plugin jq libjq1 libonig5 tree
0 upgraded, 7 newly installed, 0 to remove and 1 not upgraded.
Need to get 58.4 MB of archives.
After this operation, 189 MB of additional disk space will be used.
Get:1 https://download.docker.com/linux/debian bookworm/stable amd64 docker-buildx-plugin amd64 0.17.1-1~debian.12~bookworm [30.3 MB]
Get:2 http://deb.debian.org/debian bookworm/main amd64 libonig5 amd64 6.9.8-1 [188 kB]
Get:3 http://deb.debian.org/debian bookworm/main amd64 libjq1 amd64 1.6-2.1 [135 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 jq amd64 1.6-2.1 [64.9 kB]
Get:5 http://deb.debian.org/debian bookworm/main amd64 tree amd64 2.1.0-1 [52.5 kB]
Get:6 https://download.docker.com/linux/debian bookworm/stable amd64 docker-ce-cli amd64 5:27.3.1-1~debian.12~bookworm [15.0 MB]
Get:7 https://download.docker.com/linux/debian bookworm/stable amd64 docker-compose-plugin amd64 2.29.7-1~debian.12~bookworm [12.7 MB]
Fetched 58.4 MB in 1s (51.0 MB/s)               
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package docker-buildx-plugin.
(Reading database ... 10537 files and directories currently installed.)
Preparing to unpack .../0-docker-buildx-plugin_0.17.1-1~debian.12~bookworm_amd64.deb ...
Unpacking docker-buildx-plugin (0.17.1-1~debian.12~bookworm) ...
Selecting previously unselected package docker-ce-cli.
Preparing to unpack .../1-docker-ce-cli_5%3a27.3.1-1~debian.12~bookworm_amd64.deb ...
Unpacking docker-ce-cli (5:27.3.1-1~debian.12~bookworm) ...
Selecting previously unselected package docker-compose-plugin.
Preparing to unpack .../2-docker-compose-plugin_2.29.7-1~debian.12~bookworm_amd64.deb ...
Unpacking docker-compose-plugin (2.29.7-1~debian.12~bookworm) ...
Selecting previously unselected package libonig5:amd64.
Preparing to unpack .../3-libonig5_6.9.8-1_amd64.deb ...
Unpacking libonig5:amd64 (6.9.8-1) ...
Selecting previously unselected package libjq1:amd64.
Preparing to unpack .../4-libjq1_1.6-2.1_amd64.deb ...
Unpacking libjq1:amd64 (1.6-2.1) ...
Selecting previously unselected package jq.
Preparing to unpack .../5-jq_1.6-2.1_amd64.deb ...
Unpacking jq (1.6-2.1) ...
Selecting previously unselected package tree.
Preparing to unpack .../6-tree_2.1.0-1_amd64.deb ...
Unpacking tree (2.1.0-1) ...
Setting up docker-buildx-plugin (0.17.1-1~debian.12~bookworm) ...
Setting up tree (2.1.0-1) ...
Setting up docker-compose-plugin (2.29.7-1~debian.12~bookworm) ...
Setting up docker-ce-cli (5:27.3.1-1~debian.12~bookworm) ...
Setting up libonig5:amd64 (6.9.8-1) ...
Setting up libjq1:amd64 (1.6-2.1) ...
Setting up jq (1.6-2.1) ...
Processing triggers for libc-bin (2.36-9+deb12u9) ...

root@6040c315080f:/# docker info
Client: Docker Engine - Community
 Version:    27.3.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.17.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.7
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 2
  Running: 2
  Paused: 0
  Stopped: 0
 Images: 12
 Server Version: 27.3.1
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 88bf19b2105c8b17560993bee28a01ddc2f97182
 runc version: v1.2.2-0-g7cb3632
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.14.0-427.13.1.el9_4.x86_64
 Operating System: Rocky Linux 9.4 (Blue Onyx)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.489GiB
 Name: localhost.localdomain
 ID: 61bff9fc-e42f-411a-89a6-315a7cd61a4d
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

root@6040c315080f:/# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                    PORTS                                                                                      NAMES
6040c315080f   jenkins/jenkins   "/usr/bin/tini -- /u…"   12 minutes ago   Up 12 minutes             0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   jenkins
6a58eedeb25b   gogs/gogs         "/app/gogs/docker/st…"   12 minutes ago   Up 12 minutes (healthy)   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp       gogs

root@6040c315080f:/# which docker
/usr/bin/docker
  • Jenkins 컨테이너 내부에서 root가 아닌 jenkins 유저도 docker를 실행할 수 있도록 권한을 부여합니다.
root@6040c315080f:/# groupadd -g 2000 -f docker

root@6040c315080f:/# chgrp docker /var/run/docker.sock

root@6040c315080f:/# ls -l /var/run/docker.sock
srw-rw----. 1 root docker 0 Dec  2 12:01 /var/run/docker.sock

root@6040c315080f:/# usermod -aG docker jenkins

root@6040c315080f:/# cat /etc/group | grep docker
docker:x:2000:jenkins

root@6040c315080f:/# exit
exit

[ssoon@localhost cicd-labs]$
  • "permission denied" 오류가 발생
[ssoon@localhost cicd-labs]$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/containers/json": dial unix /var/run/docker.sock: connect: permission denied
[ssoon@localhost cicd-labs]$ docker compose restart jenkins
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.oneoff%3DFalse%22%3Atrue%2C%22com.docker.compose.project%3Dcicd-labs%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied

Docker 소켓 파일의 권한 재설정

  • 호스트의 /var/run/docker.sock 권한을 다시 설정하여 문제를 해결할 수 있습니다:
  • /var/run/docker.sock에 모든 사용자 접근 권한을 임시로 부여:
[ssoon@localhost cicd-labs]$ sudo chmod 666 /var/run/docker.sock
[sudo] ssoon의 암호:

⚠️ 보안 경고: chmod 666은 모든 사용자에게 Docker 소켓 접근 권한을 부여하므로, 테스트 후 반드시 권한을 660으로 되돌리세요:

  • 이후 Jenkins 및 Docker 명령 테스트.
[ssoon@localhost cicd-labs]$ docker compose exec jenkins docker info
Client: Docker Engine - Community
 Version:    27.3.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.17.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.7
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 2
  Running: 2
  Paused: 0
  Stopped: 0
 Images: 12
 Server Version: 27.3.1
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 88bf19b2105c8b17560993bee28a01ddc2f97182
 runc version: v1.2.2-0-g7cb3632
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.14.0-427.13.1.el9_4.x86_64
 Operating System: Rocky Linux 9.4 (Blue Onyx)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.489GiB
 Name: localhost.localdomain
 ID: 61bff9fc-e42f-411a-89a6-315a7cd61a4d
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

[ssoon@localhost cicd-labs]$ docker compose exec jenkins docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                   PORTS                                                                                      NAMES
fc368b58aec0   jenkins/jenkins   "/usr/bin/tini -- /u…"   9 minutes ago   Up 6 minutes             0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   jenkins
f940f826d2c3   gogs/gogs         "/app/gogs/docker/st…"   9 minutes ago   Up 9 minutes (healthy)   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp       gogs
  • Gogs 컨테이너 초기 설정합니다.
  • 데이터베이스 유형 : SQLite3
  • 애플리케이션 URL : http://<각자 자신의 PC IP>:3000/
  • 기본 브랜치 : main
  • 관리자 계정 설정 클릭 : 이름(계정명 - 닉네임 사용 devops), 비밀번호(계정암호 qwe123), 이메일 입력

  • docker compose exec gogs ls -l /data:
    • gogs 데이터 디렉토리의 파일들에 대한 정보를 확인합니다.
  • docker compose exec gogs ls -l /data/gogs:
    • gogs의 주요 데이터 폴더에 대한 내용을 확인하는 데 사용됩니다.
  • docker compose exec gogs ls -l /data/gogs/conf:
    • gogs의 설정 파일들이 위치한 폴더의 내용을 보여줍니다.
  • docker compose exec gogs cat /data/gogs/conf/app.ini:
    • gogs 컨테이너에서 app.ini 파일의 내용을 확인합니다.
    • app.ini 파일은 gogs의 주요 설정 파일 중 하나로, Gogs의 동작을 제어하는 중요한 설정들을 포함하고 있습니다.
[ssoon@localhost cicd-labs]$ docker compose exec gogs ls -l /data
total 4
drwxr-xr-x    4 git      git             61 Dec  2 14:29 git
drwxr-xr-x    5 git      git             41 Dec  2 12:57 gogs
drwx------    2 git      git           4096 Dec  2 12:57 ssh

[ssoon@localhost cicd-labs]$ docker compose exec gogs ls -l /data/gogs
total 0
drwxr-xr-x    2 git      git             21 Dec  2 14:29 conf
drwxr-xr-x    2 git      git             21 Dec  2 14:29 data
drwxr-xr-x    2 git      git             54 Dec  2 14:29 log

[ssoon@localhost cicd-labs]$ docker compose exec gogs ls -l /data/gogs/conf
total 4
-rw-r--r--    1 git      git            953 Dec  2 14:29 app.ini

[ssoon@localhost cicd-labs]$ docker compose exec gogs cat /data/gogs/conf/app.ini
BRAND_NAME = Gogs
RUN_USER   = git
RUN_MODE   = prod

[database]
TYPE     = sqlite3
HOST     = 127.0.0.1:5432
NAME     = gogs
SCHEMA   = public
USER     = gogs
PASSWORD = 
SSL_MODE = disable
PATH     = data/gogs.db

[repository]
ROOT           = /data/git/gogs-repositories
DEFAULT_BRANCH = main

[server]
DOMAIN           = localhost
HTTP_PORT        = 3000
EXTERNAL_URL     = http://192.168.56.105:3000/
DISABLE_SSH      = false
SSH_PORT         = 22
START_SSH_SERVER = false
OFFLINE_MODE     = false

[email]
ENABLED = false

[auth]
REQUIRE_EMAIL_CONFIRMATION  = false
DISABLE_REGISTRATION        = false
ENABLE_REGISTRATION_CAPTCHA = true
REQUIRE_SIGNIN_VIEW         = false

[user]
ENABLE_EMAIL_NOTIFICATION = false

[picture]
DISABLE_GRAVATAR        = false
ENABLE_FEDERATED_AVATAR = false

[session]
PROVIDER = file

[log]
MODE      = file
LEVEL     = Info
ROOT_PATH = /app/gogs/log

[security]
INSTALL_LOCK = true
SECRET_KEY   = 1fhmqnciVfMru5s
  • 토큰을 생성합니다.
    • SettingsApplications : Generate New Token 클릭 - Token Name(devops) ⇒ Generate Token 클릭

  • 새로운 Repository 를 생성합니다.
    • Repository Name : dev-app
    • Visibility : (Check) This repository is Private
    • .gitignore : Python
    • Readme : Default → (Check) initialize this repository with selected files and template

  • Repo 주소 확인합니다.

  • git 을 설치하고 설정합니다.
[ssoon@localhost cicd-labs]$ sudo dnf install git -y

[ssoon@localhost cicd-labs]$ git config --global user.name "devops"
[ssoon@localhost cicd-labs]$ git config --global user.email "admin@example.com"

[ssoon@localhost cicd-labs]$ git clone http://192.168.56.105:3000/devops/dev-app.git
'dev-app'에 복제합니다...
Username for 'http://192.168.56.105:3000': devops
Password for 'http://devops@192.168.56.105:3000': 
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), 696 bytes | 696.00 KiB/s, 완료.

[ssoon@localhost cicd-labs]$ tree dev-app
dev-app
└── README.md

0 directories, 1 file

[ssoon@localhost cicd-labs]$ cd 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 파일 작성 & Dockerfile 생성 & VERSION 파일 생성

[ssoon@localhost dev-app]$ cat > server.py <<EOF
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from datetime import datetime

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        now = datetime.now()
        response_string = now.strftime("The time is %-I:%M:%S %p, CloudNeta Study.\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

[ssoon@localhost dev-app]$ cat > Dockerfile <<EOF
FROM python:3.12
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app 
CMD ["python3", "server.py"]
EOF

[ssoon@localhost dev-app]$ echo "0.0.1" > VERSION
  • 변경 사항을 스테이지에 추가 (git add .)
  • 변경 사항을 로컬 Git 저장소에 커밋 (git commit -m "Add dev-app")
  • 로컬 변경 사항을 원격 저장소에 푸시 (git push -u origin main)
[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 status
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.

커밋할 변경 사항:
  (use "git restore --staged <file>..." to unstage)
        새 파일:       Dockerfile
        새 파일:       VERSION
        새 파일:       server.py

[ssoon@localhost dev-app]$ git commit -m "Add dev-app"
[main f180896] Add dev-app
 3 files changed, 28 insertions(+)
 create mode 100644 Dockerfile
 create mode 100644 VERSION
 create mode 100644 server.py
 
[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'보다 1개 커밋만큼 앞에 있습니다.
  (로컬에 있는 커밋을 제출하려면 "git push"를 사용하십시오)

커밋할 사항 없음, 작업 폴더 깨끗함

[ssoon@localhost dev-app]$ git push -u origin main
Username for 'http://192.168.56.105:3000': devops
Password for 'http://devops@192.168.56.105:3000': 
오브젝트 나열하는 중: 6, 완료.
오브젝트 개수 세는 중: 100% (6/6), 완료.
Delta compression using up to 4 threads
오브젝트 압축하는 중: 100% (4/4), 완료.
오브젝트 쓰는 중: 100% (5/5), 868 bytes | 868.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
   cead6a3..f180896  main -> main
branch 'main' set up to track 'origin/main'.

[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.

커밋할 사항 없음, 작업 폴더 깨끗함
  • Gogs Repo 에서 확인합니다.

  • 도커 허브 계정에 dev-app (Private) repo 을 생성합니다.

 

 

'CICD 맛보기' 카테고리의 다른 글

1주 : Jenkins CI/CD + Docker : 4  (2) 2024.12.05
1주 : Jenkins CI/CD + Docker : 3  (0) 2024.12.04
1주 : Jenkins CI/CD + Docker : 1  (0) 2024.12.02
Comments