使用github actions部署代碼

背景

最近寫了個工具,須要在服務端運行,一開始直接使用transmit上傳代碼,可是每次更新代碼都要同步,並且因爲服務器在國外,速度賊慢,因此趁着放假搞了下代碼自動部署。html

要實現的功能

以前用過Github的Webhooks作過自動部署,原理就是本身服務器上啓動一個服務,對外暴露一個接口,每次代碼push到github時,github服務器會調用你的接口,收到請求後再執行代碼部署。
此次決定換用Actions實現一個相似的功能,原理相似,代碼push到github時,github服務器會執行你預設好的步驟,部署代碼。要實現的功能就是:git

  1. push代碼
  2. github actions runner登陸本身的服務器
  3. 切到目錄,拉取代碼,重啓服務

步驟

首先要實現登陸服務器,用帳戶密碼天然能夠,可是不太安全,因此採用SSH密匙登陸的方式,步驟以下(參考mac 免密ssh登錄配置不坑指南):github

  1. 本地建立公私匙對(我的以爲新建一個專用的匙對比較好):npm

    ssh-keygen -t rsa -C "github actions"
  2. 上傳公匙到服務器ubuntu

    ssh-copy-id -i [公鑰文件] user@host 
    # user是你的ssh的用戶,host是服務器地址,這時候還要輸入密碼。
    # 例子:ssh-copy-id -i id_rsa.pub root@111.111.111.111
  3. ssh-add(mac的坑點)安全

    好通常別的系統到這就能夠免密登錄了,可是mac並不這樣。還要調用ssh-add
    ssh-add -K [你的私鑰文件,就是那個不加.pub結尾的文件] 
    # 例如,ssh-add -K id_rsa

    這時候就能夠直接使用 ssh user@host 登陸服務器了,若是你想,服務器IP每次都得手動輸入,記不住,有沒有更好的方式了?答案是,有。
    如下可選,並且與本文的主要目的(部署代碼)無關,參考mac ssh免密登陸 鏈接遠程服務器bash

  4. 在.ssh目錄下建立一個config文件, 寫入服務器

    Host alias-name    # 別名,這裏舉例爲 alias-name
    HostName 111.111.111.111   # 要登陸服務器域名或IP
    Port 22                    # 要登陸服務器的端口   
    User root                  # 要登陸服務器的用戶名

    設置成功後就能夠直接使用ssh alias-name登陸服務器了!app

  5. 在github倉庫中添加私匙
    咱們須要給github服務器受權在本身的服務器上執行一些命令,因此須要給它受權,把私匙給它。確定不能明文寫在代碼裏,放在那裏呢?答案是Secrets中。在倉庫的Settings中,將步驟1中生成的私匙添加到Secrets中(注意添加時Name是後面actions中要用到的)。通常會把私匙、服務器Host、服務器User都添加到Secrets中,這樣,若是後續更改服務器或者登錄用戶時就不須要改代碼了。
2. 編寫Actions文件

參考1:GitHub Actions 入門教程
參考2:使用 GitHub Actions 實現博客自動化部署ssh

具體過程不表,個人是這樣的

name: deploy
on:
 push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  # Allows you to run this workflow manually from the Actions tab
 workflow_dispatch:
jobs:
 deploy:
 runs-on: ubuntu-latest
 steps:
      - name: executing remote ssh commands
        
        # 使用appleboy/ssh-action@master來執行命令
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_SECRET }}
          script: cd </your/code/path> && git pull && npm install && <restart your service>

其中</your/code/path><restart your service>替換爲本身的就能夠了。
須要注意的時,其實沒有辦法直接讓github actions runner直接登陸咱們的服務器並執行命令,因此須要使用appleboy/ssh-action@master封裝的actions。

OK,大工告成!

相關文章
相關標籤/搜索