github actions CI/CD



CI & CD
CICDの基本概念は1. 지속적인 통합 2. 지속적인 서비스 제공 3. 지속적인 배포である.
アプリケーションの統合とテストから提供と導入まで、アプリケーションのライフサイクル全体で継続的な自動化と監視を実現

1. git push
2.github actionsでリモートリポジトリの変化を検出し、テスト光構築を行う.
3.問題がないと判断した場合は、導入します.
4.これらのサイクルはすべて開発者が判断し、作成します.
github actionsには基本的に提供されているテンプレート(時間を短縮し、開発を円滑にするために使用されています)がありますが、私は最初に使用したユーザーなので、googlingを通じてプロセス全体を理解し、書き直しました.
Build
name: Node.js CI

# 구독할 이벤트
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

# jobs 단위로 개별 서버(정확히는 Docker 컨테이너 단위라고 한다.)에서 작업이 수행된다.
# 각 작업은 병렬로 실행 된다고 하는데, needs: build와 같이 표시해서 기다릴 수도 있다.
jobs:
  build:
    # Ubuntu, Windows, MacOS를 지원한다.
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x] # 템플릿 기본값: [10.x, 12.x, 14.x]

    # uses 개념은 다른 사람이 작성한 내용을 실행하는 개념이다.
    # actions/checkout: GitHub의 마지막 커밋으로 Checkout 한다.
    # actions/setup-node: Node.js를 설치한다.
    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node-version }}
      # npm ci === npm install
      - run: npm ci --prefix /yeomanda/yeomanda/server
      # --if-present 옵션은 npm 스크립트가 존재할 때만 실행시키라는 의미이다.
      # 만약 build 스크립트가 없는 경우, 오류 없이 지나간다.
      - run: npm run build --if-present --prefix /yeomanda/yeomanda/server
      - run: npm run test --prefix /yeomanda/yeomanda/server
Deploy
deploy:
    needs: [build]
    runs-on: ubuntu-latest
    steps:
      - name: connect with ssh
        env:
          PRIVATE_KEY: ${{ secrets.AWS_PRIVATE_KEY  }}
          HOST_NAME : ${{ secrets.HOST_NAME  }}
          USER_NAME : ${{ secrets.USER_NAME  }}
         
        run: |
          echo "$PRIVATE_KEY" > private_key
          chmod 600 private_key
          ssh -o StrictHostKeyChecking=no -i private_key ${USER_NAME}@${HOST_NAME} '
            pm2 stop www
            pm2 delete www
            pm2 kill
            cd ./repo/yeomanda
            git pull origin main
            cd yeomanda/server
            pm2 start ./bin/www
          '
ここで大切なのは
グーグルを試してみましたが、みんな違う方法でenvを発表しました.その方法が一番きれいで正確です.

github repositoryのSettingsタブでは、左側に上図に示す複数のカテゴリがあります.このうちSecrets 카테고리は、予め変数を設定している.それらの変数は一度設定すると読み込めません.更新したいならスペースが出るので安全と言えます.
  • AWS_PRIVATE_KEY | vi path_to_key_pair/[ssh_key].pem at local
    ec 2インスタンスを作成してssh鍵を提供します.pemファイルを保存し、ファイルを保存する場所でviでファイルを開きます.きっと.
    私はcatで開けて、それからずっとssh connection timed outに行きました.
  • HOST_NAME&24579142|ec 2インスタンスを生成し、sshを接続する方法はUSER_NAMEであることがわかる.ここから抽出すればいいです.
  • 別の方法でsshに貼り付け、実行するスクリプトをサーバに送信します.shファイル'nohup[script name]として保存します.sh&'で実行できます.shファイルでは、「cd」や「git pull」などが動作しません.
    **bachrcファイルでaliasとして宣言し、インポート中に問題が発生しました.

    [script_to_run_nohup_but_not_working]

    stop_list=$(ps -ef | grep "node ./bin/www" | awk '{print $2}') 
    for stop_target in ${stop_list};do 
            kill -9 $stop_target 
    done 
    
    cd ./repo/yeomanda 
    git pull origin main 
    cd yeomanda/server 
    npm install 
    npm run start 
    nohup
    Linux上でプロセスを実行する端末がセッション接続を切断したときに実行を続行できるコマンド.
    デフォルトでは、セッションログアウトが端末で発生した場合、Linuxはその端末で実行されているプロセスにHUP信号を送信し、終了します.
    Nohupは、プロセスがこのHUP信号を無視できるようにするコマンドです.
    このスクリプトを実行すると、結果はログに書き込まれ、ログはssh -i [.pem file] [USER_NAME]@[HOST_NAME]で同じ場所で生成されます.データが多すぎると、ディスクがオーバーロードする可能性があるので、不要なデータ蓄積を避けるのも方法です.nohup.outファイルを生成したくない場合は、nohup.outと同じ方法で実行できます.
    1>/dev/nullは標準出力を使用しないことを示し、2>&1は標準エラーを標準出力と同じにすることを示します.
    出典:https://gracefulprograming.tistory.com/128[peterエレガントなプログラミング]
    Background
    なぜec 2 instanceを使うのか
    リソースが限られており、PCをずっと開いているわけにはいかないので、仮想パソコンは私たちが借りています.もしそうであれば、インスタンスに接続して端末を閉じるか、pcの電源を切るか、どうすればいいですか.nohup [프로세스] 1>/dev/null 2>&1 &最終的には、端末とpcが電源を入れるかどうかにかかわらず、24時間サーバを駆動します.これは通常、의미가 없다と呼ばれています.
    👏
    これは、sshバインドインスタンスをローカルで使用し、サーバを通常の백그라운드로 서버를 돌린다に変換する場合に、サーバをバックグラウンドに変換する方法です.そのため、端末がオフになると、サーバも切断されます.
    最終的には、サーバをバックグラウンドに配置する必要がありますが、使用するパッケージでは、
  • forever
  • pm2
  • npm run startで起動するのはよくありません.foreverです.
    $ npm install -g pm2@latest
    $ pm2 start app.js//app.jss psの実行
    $ pm2 stop app.js//app.jss psを停止
    $ pm2 delete app.js//app.js psの削除
    $pm 2 kill//pm 2掛け
    https://github.com/jjmmll0727/yeomanda/blob/main/.github/workflows/nodejs.yml