IT/잡다구리

[Github] 셀프 러너 Github Self hosted Runner 사용하는법 (Feat. 리눅스, 셀프호스트러너)

월공 2024. 1. 12. 11:37
728x90
300x250

github action 사용하는법에 대해선 예전에 아래와 같이 포스팅 한적이 있습니다.

https://bug41.tistory.com/entry/Github-Github-Actions-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EB%B2%95-SSH-%EC%97%B0%EA%B2%B0

외부망이 엄격히 막혀있는 서버지만 배포 프로세스를 갖춰야해서 찾아보다가
세팅 다 마치고 안까먹고자 작성하는 포스팅입니다.


셀프러너를 시작하고픈 Repo 의 Settings 에 들어가서 Actions -> Runners 로 진입

New self-hosted runner 진입

그럼 아래와 같이 나오는데 내가 어디서 돌릴지 macOS, Linux, Windows 중 하나 클릭 하면되고
그에 따른 세팅법이 아주 자세하게 나와있습니다.

아래 Download, Configure 진행해주시면되고 ,
Using your self-hosted runner 는 yml 에 작성해주면 되고 actions runner 설치할때 runner 이름 뭘로 하냐에 따라 다르게 입력되는거라 일단 신경 안쓰셔도됩니다.

차례차례 복붙해서 명령어 실행만 해주면되는데 중간에 shasum:command not found 뭐시기 에러 날 수도 있습니다.
그럼 당황하지말고 그냥 없는거 설치만 해주면됩니다.
아래 2가지 설치 진행하고 이상없이 세팅 끝마침

yum install perl-Digest-SHA -y

yum install libicu -y

아 그리고 runner 설치할때 뭐 그룹명 명칭 이런거 입력하라고 하는데 그냥 맘편하게 프로젝트명 써서 진행하셔도 무방합니다. (main.yml 에 들어감)

정상적으로 세팅이 완료 되었다면 "actions-runner" 폴더가 당연히 생성이 되있고 그 안에 runner 관련 파일들이 쭈루룩 있을건데

실행은 ./run.sh 라고 해주시면되는데 이러면 푸티창 계속 켜놔야하니까
아래와 같이 ./log 라는 폴더에 일별 파일명으로 로그도 쌓으면서 백그라운드로 실행을 해놓읍시다.

 current_date=$(date +"%Y-%m-%d"); ./run.sh > "./log/log_${current_date}.txt" 2>&1 &


이러면 러너 설치 및 실행준비는 끝,
이제 본격적으로 내가 배포하고싶은 프로젝트를 git pull 해서 내 서버에 갖고와야겠죠

git clone 해서 소스 불러오려하니 계속 username , password 틀렸네 어쨋네 말썽 부리길래 무슨 정책이 바뀌었다는것 같아서 그냥 맘편하게 토큰 생성해갖고 password 에 토큰 값 입력하시면 git clone 이상없이 진행 할 수 있습니다.
토큰은 github 로그인 후 우측상단 메뉴 -> Settings -> Developer Settings -> Personal access tokens -> Tokens(classic)
에서 생성 가능합니다.

여튼 프로젝트를 clone 해서 가져오면 프로젝트 내의 최상위 경로에 아래와 같이 파일을 생성해줘야하는데
직접 생성해줘도되고 아니면 github repo -> actions -> New workflow -> set up a workflow yourself 에서도 생성 가능합니다.

두가지 방식의 yml 이 있어서 둘 다 첨부합니다.

.github/workflows/main.yml
#main.yml
name: learn-github-actions  #이름 상관없음
on:
  push:
    branches: #main 브랜치에 푸시 될때마다
      - main 

defaults:
  run:
    working-directory: /home/ec2-user/프로젝트명 #프로젝트 경로

jobs:
  self-runner-testing: #이름 상관없음
    runs-on: [runner 명칭 위에서 프로젝트명으로 지정한거]      
    steps:      
		
      - name: Configure Git
        run: git remote set-url origin https://${{ secrets.TOKEN }}@github.com/${{ secrets.USERNAME }}/[프로젝트 repo명]
        
      - name: git pull 진행
        run: git pull origin main

      - name: npm install --force 실행
        run: npm install --force

      - name: npm run build 실행
        run: npm run build
        
      - name: pm2 restart myWeb 실행
        run: pm2 restart myWeb

위에 주석을 보시면 아시겠지만 정말 간단한 yml 파일입니다
main 브랜치에 푸시가 될때마다 아래 경로의 프로젝트에서 선언한 작업들을 처리해라 라는 뜻입니다.

Configure Git 부분을 안해주시면 git pull 할때 매번 username 같은 정보를 입력하라고 합니다.
해당 repo Settings -> Secrets and variables -> Actions -> Actions secrets and variables -> Repository secrets 에서 등록 가능합니다.

자세한 설명이 필요하시면 포스팅 최상단에 github action 세팅할때 글에 ${{secret.XXX}} 부분을 보시면 됩니다

이제 제 서버에 러너가 실행되고 있다가 main 브랜치에 푸시가 된것을 감지하면 , 푸시된 새로운 소스들을 자기한테 pull 해서 받아오고,  npm install 을 진행후에 , build 를 하고 , pm2 를 재시작 할 겁니다.

사실 이렇게 세팅을 하니 package.json 이 수정되는게 아니라면 npm install 을 굳이 하지 않아도 되는데 이 부분은 좀 더
찾아서 보완을 할 수 있을듯 합니다.


다른 yml


위 처럼 진행안해도 actions/checkout 이라는걸 사용하면 git 저장소에 있는 최신화 된 소스를 가져와서 진행할수 있습니다.
위 main.yml 을 좀 더 보완해서 진행하였습니다.

name: learn-github-actions
on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: self-hosted

    steps:
    # 해당 repo 의 최신화된 소스로 접근
    - name: Checkout Repository
      uses: actions/checkout@v3
      with:
        repository: bug41/testRepo
        ref: main
        token: ${{ secrets.TOKEN }}

	#env 파일은 gitignore 에 추가되어있어서 따로 다른 폴더에 놓고 copy 진행함
    - name: Copy env file
      run: |
        cp [복사해야할 경로와 파일] /home/ec2-user/actions-runner/_work/myProject/myProject    

	# checkout 했을때 정말 최신꺼 가져오는지 테스트하려고 찍음
    #- name: Display Git Log
    #  run: git log

    - name: Install Dependencies
      run: npm install --force      

    - name: Build
      run: npm run build
      
	# build 잘됐는지 목록 보고싶어서 찍음
    - name: Display Folder
      run: ls -al

    - name: Restart pm2
      run: pm2 restart dapps 
      #run: pm2 start npm --name "dapps" -- start

    - name: Save PM2 Configuration
      run: pm2 save


이제 main 브랜치에 배포를 진행하고나서 Actions 페이지를 확인해보면 아래와 같이 구동되는 것을 확인 할 수 있습니다.

github action yml 을 작성할때 ubuntu 뭐시기 하면서 가상의 공간에서 진행을 하였는데, 셀프러너는 그 가상의 공간이 말그대로 내 로컬서버에서 진행이 되는거라 서버의 어떤 디렉토리든 접근하기 용이해서 편리했습니다.
"가상의 공간" 이라는게 결국 action-runner 를 설치한 _work 폴더에 내가 설정한 runner 명으로 들어가있고요
그 안에서 git checkout 으로 소스 땡겨오는거라 npm install 이던 build 던 다 진행가능합니다.


액션 러너를 백그라운드로 실행 하고있는데 제대로 돌고 있는지 확인하고 싶은경우 아래 명령어 입력

ps -ef | grep run

 

728x90
300x250