最近寫了個工具,須要在服務端運行,一開始直接使用transmit上傳代碼,可是每次更新代碼都要同步,並且因爲服務器在國外,速度賊慢,因此趁着放假搞了下代碼自動部署。html
以前用過Github的Webhooks作過自動部署,原理就是本身服務器上啓動一個服務,對外暴露一個接口,每次代碼push到github時,github服務器會調用你的接口,收到請求後再執行代碼部署。
此次決定換用Actions實現一個相似的功能,原理相似,代碼push到github時,github服務器會執行你預設好的步驟,部署代碼。要實現的功能就是:git
首先要實現登陸服務器,用帳戶密碼天然能夠,可是不太安全,因此採用SSH密匙登陸的方式,步驟以下(參考mac 免密ssh登錄配置不坑指南):github
本地建立公私匙對(我的以爲新建一個專用的匙對比較好):npm
ssh-keygen -t rsa -C "github actions"
上傳公匙到服務器ubuntu
ssh-copy-id -i [公鑰文件] user@host # user是你的ssh的用戶,host是服務器地址,這時候還要輸入密碼。 # 例子:ssh-copy-id -i id_rsa.pub root@111.111.111.111
ssh-add(mac的坑點)安全
好通常別的系統到這就能夠免密登錄了,可是mac並不這樣。還要調用ssh-add
ssh-add -K [你的私鑰文件,就是那個不加.pub結尾的文件] # 例如,ssh-add -K id_rsa
這時候就能夠直接使用 ssh user@host
登陸服務器了,若是你想,服務器IP每次都得手動輸入,記不住,有沒有更好的方式了?答案是,有。
如下可選,並且與本文的主要目的(部署代碼)無關,參考mac ssh免密登陸 鏈接遠程服務器bash
在.ssh目錄下建立一個config文件, 寫入服務器
Host alias-name # 別名,這裏舉例爲 alias-name HostName 111.111.111.111 # 要登陸服務器域名或IP Port 22 # 要登陸服務器的端口 User root # 要登陸服務器的用戶名
設置成功後就能夠直接使用ssh alias-name
登陸服務器了!app
參考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,大工告成!