2023. 8. 14. 00:00ㆍDevOps/Git & GitHub
git 을 기본적으로 사용할 줄 안다고 가정 하고 하겠다.
window 상에서 git 을 사용하고 싶다면 아래 link 에서 download 받아 설치하자
https://git-scm.com/download/win
Git - Downloading Package
Download for Windows Click here to download the latest (2.41.0) 32-bit version of Git for Windows. This is the most recent maintained build. It was released 26 days ago, on 2023-07-13. Other Git for Windows downloads Standalone Installer 32-bit Git for Win
git-scm.com
Docker 관련은 아래를 참조하자
https://yogingang.tistory.com/444
WSL 을 이용하여 Ubuntu 에 Docker 를 이용하여 배포 - 01
윈도우스에서 docker desktop 없이 docker 를 사용하고 싶을 수 있다. wsl 설치 부터 docker 설치 까지 과정을 확인하려면 아래를 참고하자 https://yogingang.tistory.com/426 솔루션 파일이 있는 폴더에 Dockerfile을
yogingang.tistory.com
요즘은 개발자에게 개발만 요구 하지 않는다.
devops (그런건 없다...)라는 말을 별로 좋아 하지 않지만 실제 개발자가 개발만 할 수는 없다.
회사에 deploy 관련된 infra 를 따로 관리해주는 팀이 없다면 개발자가 해야한다.
개발자가 가장 단순하게 CI , CD 를 구현 하는 방법은 azure, aws, google cloud 를 제외하고는
gitlab 과 github 에서 지원하는 agent 또는 action 을 이용하는 수 밖에 없다.
이번 강좌에서는 그 중에서 Github Action 을 이용한 배포에 대해서 알아보자.
자신의 Github 에서 Action 을 적용할 Repository 로 이동한다.
상단에 Settings--> 왼쪽 Actions/Runners 선택 --> 오른쪽 상단 New self-hosted runner
WSL 에 설치해서 처리 할테니 Linux 를 선택하자
그럼 아래쪽에 Download 부터 Configure 그리고 self-hosted runner 를 고르는게 나온다.
우리는 wsl 에 runner 를 설치해서 사용할 테니 self-hosted runner 를 사용하자
이제 wsl 을 통해 ubuntu 에 접속하자 (자신이 wsl 에 설치한 linux system 에 접속하자)
그리고 다음을 실행 하자
mkdir actions-runner && cd actions-runner
최신 runner 도 다운로드 받자
curl -o actions-runner-linux-x64-2.307.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.307.1/actions-runner-linux-x64-2.307.1.tar.gz
압축도 해제해주고
tar xzf ./actions-runner-linux-x64-2.307.1.tar.gz
저장소 연결
./config.sh --url [저장소 주소] --token [토큰 값]
이제 github 에서 확인해보자 runners 에 있다.
이제 쉘 에서 다음을 실행 하자
./run.sh
이제 workflows 디렉토리 안에 actions 사용시 금방 생성한 self-hosted runner 를 이용해 build 되도록 yaml 파일을 만들어주자
set up a workflow yourself 를 실행하자
아래를 입력하자 (self hosted runner 를 썼을 때는 run-on 을 아래와 같이 구성해야 한다. 만약 label 까지 했다면
[self-hosted, linux, x64,label명] 까지 해야 한다.
name: checkout-build-run-docker
on:
workflow_dispatch:
jobs:
echo:
runs-on: [self-hosted, linux, x64]
steps:
- run: ls -al
- uses: actions/checkout@v3
위와 같이 하면 checkout 이라는 github 에서 미리 정의된 action에 의해 최신 source 파일이 CI ( 우리는 wsl ubuntu) 에 download 된다.
이제 Dockerfile 을 실행 하도록 해서 image 를 build 하자
name: checkout-build-run-docker
on:
workflow_dispatch:
jobs:
echo:
runs-on: [self-hosted, linux, x64]
steps:
- name: Check out code
uses: actions/checkout@v3
- name: Build docker images
run: docker build -t signalr-template -f Dockerfile .
다 실행되었다면 docker run 을 통해 docker 를 실행하자
name: checkout-build-run-docker
on:
workflow_dispatch:
jobs:
echo:
runs-on: [self-hosted, linux, x64]
steps:
- name: Check out code
uses: actions/checkout@v3
- name: Build docker images
run: docker build -t signalr-template -f Dockerfile .
- name: Run docker
run: docker run -it -p 5004:5004 --rm signalr-template
이제 Github action 에서 workflow 를 직접 실행 시켜보자
Run workflow 를 click 하면 실행한다.
그러면 실행하다가 docker run 에서 "Device is not a TTY error" 에러가 날 것이다.
이부분 부터 해결해보자
name: checkout-build-run-docker
on:
workflow_dispatch:
jobs:
echo:
runs-on: [self-hosted, linux, x64]
steps:
- name: Check out code
uses: actions/checkout@v3
- name: Build docker images
run: docker build -t signalr-template -f Dockerfile .
- name: Run docker
shell: 'script -q -e -c "bash {0}"'
run: |
docker run -it -p 5004:5004 --rm signalr-template
자 이렇게 실행하면 실행은 되는데 아래와 같이 Run docker 부분에서 영원히 돌고 있을 것이다.
어쩔수 없다. 우리가 demon 에서 실행 한 것이 아니기 때문이다.
workflow 를 cancel 하자. 아래와 같이 log 를 console 보여주는 대화형으로 docker 를 실행해서 그렇다.
이제 이부분을 demon 형태로 실행되도록 수정해서 문제를 해결해 보자
일단 현재 self hosted runner 에서 실행중이니 runner 를 설치한 server 로 이동하자
그리고 이 server 에서 실행되고 있는 docker container 를 stop 하고 image 를 삭제하자
docker stop [container-id]
docker rmi [image-name]
자 그런데 demon 으로 만들기 전에 생각할 것이 하나 있다.
자동으로 배포 하려는 건데 새로 배포할때 마다 docker stop 과 docker rmi 를 계속 해줄수는 없다.
workflow 에 추가해서 자동으로 처리되도록 하자
몇몇 코드를 수정해야 한다.
name: checkout-build-run-docker demon
on:
workflow_dispatch:
jobs:
echo:
runs-on: [self-hosted, linux, x64]
steps:
- name: Check out code
uses: actions/checkout@v3
- name: Stop and remove existing container
run: |
CONTAINER_NAME=signalr-template-container
RUNNING_CONTAINER_ID=$(docker ps -aq -f "name=$CONTAINER_NAME")
if [ ! -z "$RUNNING_CONTAINER_ID" ]; then
echo "Stopping and removing container: $RUNNING_CONTAINER_ID"
docker stop "$RUNNING_CONTAINER_ID"
docker rmi signalr-template
else
echo "No running container with name $CONTAINER_NAME found."
fi
- name: Build docker images
run: |
docker build -t signalr-template -f Dockerfile .
- name: Run docker
shell: 'script -q -e -c "bash {0}"'
run: |
docker run --name signalr-template-container -d -p 5004:5004 --rm signalr-template
위 workflow 를 확인하면
"name: Stop and remove existing container"
추가 되었다. 이 부분이 docker 를 stop 하고 image 를 삭제하는 부분이다.
if 문은 container 와 image 가 없을 경우 error 가 생겨 더이상 workflow 진행이 되지 않는 것을 방지 하는 것이다.
이렇게 하고 실행하면 정상적으로 실행이 되고
내 runner 가 존재하는 곳에 자동으로 배포가 된다.
세상 참 좋아졌다.!!! 하!..
관련영상
'DevOps > Git & GitHub' 카테고리의 다른 글
GitLab CI , CD (0) | 2023.08.28 |
---|