IT/잡다구리

[Github] Github Actions 사용하는법 , SSH 연결

월공 2021. 12. 9. 17:07
728x90
300x250

개발하던 프로젝트를 github repo 에 까지 다 push 해있다는 가정하에 설명합니다.

 

workflow 만들기

github 홈페이지에 해당 프로젝트로 진입을하면 "Actions" 부분에서 set up a workflow yourself 가 있는데 클릭하면

main.yml 이라고 기본이름으로 지정된 페이지가 나옵니다.

 

docker-compose 파일을 작성해보신분이라면 뭔지 대충 감이 잡히실겁니다.

작성안해보셨다해도, 그냥 main.yml 에 작성되있는것들이 순차적으로 하나씩하나씩 실행되는 파일이라고

생각하면됩니다.

우측에 있는 Marketplace , Documentation 은 지금 당장 신경안쓰셔도되고 꼭 여기서 안해도됩니다.

우리는 샘플 main.yml 을 만들려고 이 페이지에 진입한것뿐, 굳이 Marketplace 에서 뭐 안해도 나중에 내용만 복붙 그대로 해주면 이상없이 실행되서 크게 의미는 없어요

내가 넣고자 하는 기능을 바로 검색해서 나오게 해주니 편의성은 있겠네요.

사실 파일명도 크게 의미없고 우리가 필요한건 껍데기라서 그냥 별거 수정안하고 넘어가셔도됩니다.

 

여튼 우측 상단에 Start commit 을 하면

어느 브랜치에 넣을지, 선택할수있는데 그냥 master 로만 놓고 진행했습니다.

 

정상적으로 만들어졌다면, 내 git repo 에 아래처럼 .github 라는 폴더와 그 밑에 workflows 라는 폴더가 생성됩니다.

그 밑에 방금 내가 만든 yml 파일이 있구요.

(이름 얼마든지 바꿔도 상관없습니다, repo 에 잘 push 만 되있으면 실행하는데에 전혀 문제없습니다.)

수정하기 쉽게 , 내가 작업하던 로컬에 pull 받아서 vscode 에서 수정하시면됩니다.

 

저는 ssh 연결을 위하여 "appleboy/ssh-action@v0.1.4" 라는 액션을 사용했습니다.

( 상세페이지 https://github.com/marketplace/actions/ssh-remote-commands?version=v0.1.4 )

상세페이지 메뉴얼 꼭 참고하시기바라고 ,, 저 안에 상세히 다 있습니다.

 

apple.yml

name: React build apple

######### master branch에 push 되었을때만 실행#########
on: 
  push:            
    branches:
      - master
######### master branch에 push 되었을때만 실행#########

jobs:
  React-Build-ssh-action:
    runs-on: ubuntu-latest
    name: Build
    steps:
      - name: SSH Remote Commands
        uses: appleboy/ssh-action@v0.1.4        
        with:
          host: ${{ secrets.HOST }}          
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          timeout: 40s  # 30초 기본        
          script: |
            echo "테스트 출력"

위 apple.yml 파일은 단순히 ssh 연결만 테스트 하는 용도입니다.

yml 파일이 되게 뭐 복잡하게 보이는데 차근차근 봐보시면

소스 첫째 줄은 그냥 말그대로 이름이고

2~5 라인은  master branch 에 push 되었을때만 실행하라 라는 조건이 붙었고, 저부분에는 pull request 할때 실행해라 혹은 master branch 가 아닌 타 브랜치에도 여러 조건을 걸수있습니다.

 

7번 jobs 부터가 메인인데

8번 React-Build-ssh-action 의미없습니다 짓기나름

9번 runs-on: ubuntu-latest 

Github Action 이 가동되면 이게 도커 컨테이너에서 돌아가는거라 dockerfile 에 FROM (기반 이미지)이 존재하는것처럼 여기서도 비슷한 개념입니다. 

10번 name : Build 역시 짓기나름입니다.

11번 steps 순차적으로 명령어 수행합니다.

12번  - name: 여러 명령을 실행하다보면 , 내가 확실히 무슨 명령어인지 얘가 뭘 실행하고있는지 구분할수 있는게 필요합니다. 물론 짓기나름이고 어떤 uses 를 쓰는지 그래도 명시는 해두는게 편합니다.

 

13번 Marketplace 에 다른 천재들이 올려놓은거 갖다쓰는 라인입니다.

실제로 action 페이지 진입해서 우측에 초록버튼 클릭해보면 아래 처럼 레이어팝업이 뜨는데 저거 그대로 갖다붙혀넣으시면됩니다.

14번 with 부터는 해당 액션의 메뉴얼 보고 그대로 양식 맞춰 작성하시면되며 env 가 올수도있고 with 가 올수도있으니 꼭 사용할 action 메뉴얼 참고하셔서 각 다르게 맞추시면됩니다.

 

 

${{secret.XXX}}

${{secret.xxx}} 은 말그대로 비밀 KEY-VALUE 개념인데 ,

해당 부분은 Git repo 페이지의 Settings - Secrets 에서 등록 가능합니다.

아래처럼 선언할수있고 이제 저런식으로 넣게되면 ${{secret.KEY}} = "VALUE" 가 되는겁니다.

 

HOST, NAME, PASSWORD ,PORT 까지 정상적으로 Secret 키에 등록해서 master 에 PUSH 를 진행하면

yml 에 작성한대로 Actions 페이지에서 해당 과정을 아래처럼 순차적으로 모니터링 할수 있습니다.

사실 지금 이 포스팅을 작성한대로 내용만 보면 별거 아닌거 같지만 , 여러 삽질을 상당히 많이 했기에 ..

yml 파일도 두개 만들어서 각각 다른 action 취하면서 테스트하고 별짓을 다했네요.

목록중에 클릭하면 아래처럼 상세 내역 볼수있습니다.


결과적으로는 세팅완료 되었으나 순탄하지는 않았습니다.

고비가 참 많았는데요 -_- ; 

대부분의 에러가 아래와 같았고

 dial tcp ***:***: i/o timeout

기타 등등 에러 ..

ssh: connect to host 000.000.000.000 port 00: Operation timed out

git /usr 어쩌고 에러 ..

메뉴얼대로 제대로 양식 안맞춰주면 에러 무조건 납니다. 들여쓰기, 띄어쓰기 하나에도 민감하니까 이점 참고하세요

 

정 답답하시면 secret 에 안하고 바로 정보 입력해서 테스트 해도되는데 만약에 이 repo 를 public 으로 놓게 되면 action 내역을 누구나 다 볼수있으니 이 점 염두하셔서 , 웬만하면 secret 이용해서 변수로 갖고오는걸로 테스트하세요.

 

저 같은 경우엔 ssh 포트를 기존에 22가 아니라 바뀌면서 서버쪽에도 세팅해야될게 참 많았고 ..

#여기도 바꿔주고
/usr/lib/firewalld/services/ssh.xml

#여기도 바꿔주고
#해외 커뮤니티에서 아래껀 바꿔줘도 아무짝에 쓸모없다고 하네요, 기록추가 합니다.
vi /etc/services

#여기도 바꿔주고
vi /etc/ssh/sshd_config

뭣보다 결론적으로 안됐던건 방화벽 때문에 갈렸던거라 ..

 

Centos7 사용중인 서버였고 , firewall zone 이 block 이어서 계속 연결 실패가 떳었습니다.

zone 별로 특성이 다 다르니 꼭 이 점도 참고하시면 좋을거같구요.

public 으로 바꾸고 난 후에 ssh port 맞춰 열어주니 연결 잘되는걸 확인하였고, 그냥 ssh 연결 테스트만 하는거면 보통 10~20초 내로 바로 연결되니까 그 이상 넘어가면 연결 실패라고 보셔도 무방합니다.

 

그리고 랜선이 두개시면 zone 설정하실때 꼭 해당 zone 의 interfaces 도 확인하셔서 맞게 들어가는지도 체크하세요.

각 랜선 별로 zone이 다를수 있습니다.

 

그리고 또 추가적으로 다른 문제로는 , 예전에 제가 포스팅 한것 중에 해외 IP 차단 룰 설정하는게 있었는데

https://bug41.tistory.com/102

이것들 때문에 안들어가는것도 있었네요.

우선 해외 IP 차단 rule 삭제하니까 잘 들어갑니다.

이 부분은 추후 개선해야겠네요 

SSH-KEYGEN

 

하도 안되길래 성질나서 password 말고 ssh key 생성해서도 해봤는데 뭐 이것도 나름 좋은 경험했네요 -_- ;;

 

ssh keygen 생성은 제 PC 로컬 (윈도우) git bash 를 이용하여 작업했습니다.

#ssh-keygen 생성
ssh-keygen -t rsa -b 4096 -C "[Git 이메일 주소]"
#엔터 난사 (passphrase 은 암호화를 한층 강화하기위한 salt 라고 보시면 됩니다. 우선은 아무것도 안침)

#윈도우 기준으로 C:\Users\pc\.ssh 에 생김 (경로 설정 가능)

#cd 로 .ssh 에 진입해서 안에 있는 파일중 is_rsa.pub 의 내용을 서버에 보내줘야함
cat ./id_rsa.pub | ssh [계정명]@[서버IP] -p [포트] ' cat >> /[경로]/authorized_keys '

요렇게 등록 해주면됩니다.

 

-----BEGIN OPENSSH PRIVATE KEY-----
여기 안에 들어간것만 넣어주는게 아니라 위 아래 --- 까지 다 넣어줘야합니다 ~
-----END OPENSSH PRIVATE KEY-----

 

이렇게 등록해주고나면 yml 파일에서 ${{secrets.KEY}} 사용 가능합니다

728x90
300x250