通過GitHub actions發(fā)布hugo到私有云服務(wù)器

繼上次分享的GitHub actions 發(fā)布到GitHub pages,收到的反饋還不錯,咱們這次也記錄了下編寫腳本的過程,過程比較坎坷,如果只要結(jié)果,請看文章最后幾個板塊的內(nèi)容。

準(zhǔn)備工作

SSH key 生成

ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N ""
# You will get 2 files:
#   gh-pages.pub (public key)
#   gh-pages     (private key)

配置私鑰

如果前面讀過我的hugo通過Github Action部署到Github Pages文章,那么一定知道怎么去上傳公鑰,這里我們再重復(fù)一下

假設(shè) 開發(fā)項目為 tianhui.xin
打開tianhui.xin倉庫的settings,再點擊Secrets,然后添加咱們剛剛生成的私鑰,name為ACTIONS_DEPLOY_KEY

Add your private key Success
image
image

上傳公鑰服務(wù)器

ssh-copy-id appuser@10.10.10.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/appuser/.ssh/id_rsa.pub"
The authenticity of host '10.10.10.10 (10.10.10.10)' can't be established.
ECDSA key fingerprint is SHA256:mpM5LP8zLMh/CibV34URdTFbciAJ3fvCG1f9kSD2ITI.
ECDSA key fingerprint is MD5:60:40:77:02:5b:c6:e0:9a:e7:a3:96:bf:10:da:12:1c.
Are you sure you want to continue connecting (yes/no)? yes

輸入遠(yuǎn)程用戶的密碼后,SSH公鑰就會自動上傳了.SSH公鑰保存在遠(yuǎn)程Linux服務(wù)器的.ssh/authorized_keys文件中

思考

docker鏡像每次都是一個新的,SSH在第一次連接都會詢問這個一個問題

The authenticity of host '10.10.10.10 (10.10.10.10)' can't be established.

RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.10.10 (10.10.10.10)' (RSA) to the list of
known hosts.
Enter passphrase for key '/home/appuser/.ssh/id_rsa':

其原因是因為/home/appuser/.ssh目錄下的known_hosts不存在對你正要連接的服務(wù)器信息,也就是說你是第一次連接;那么我們是不是可以偽造一個呢,喏,你還別說,我還真去把自己電腦上的known_hosts的對應(yīng)記錄復(fù)制了一份上去,我簡直是個天才,但結(jié)果不盡人意,好吧,咱們繼續(xù)折騰。

幸運的是我在梯子的幫助下,找到了這樣一個命令ssh-keyscan,搞起??

ssh-keyscan -t rsa 10.10.10.10 >> "/home/appuser/known_hosts"

新建job腳本(測試SSH腳本)

主要過程就是測試下在docker環(huán)境下如何遠(yuǎn)程SSH,

name: aliyun

on:
  push:
    branches:
      - master
jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@master
        with:
          submodules: true
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2.2.2
        with:
          hugo-version: '0.59.1'
          extended: true
      - name: Build
        run: hugo --minify
      - name: Deploy
        env:
          ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          HOST: 10.10.10.10
          USER: appuser
        run: |
          SSH_PATH="$HOME/.ssh"
          mkdir -p $SSH_PATH
          touch "$SSH_PATH/known_hosts"
          echo "$ACTIONS_DEPLOY_KEY" > "$SSH_PATH/id_rsa"
          chmod 700 "$SSH_PATH"
          chmod 600 "$SSH_PATH/known_hosts"
          chmod 600 "$SSH_PATH/id_rsa"
          eval $(ssh-agent)
          ssh-add "$SSH_PATH/id_rsa"
          ssh-keyscan -t rsa $HOST >> "$SSH_PATH/known_hosts"
          ssh -o StrictHostKeyChecking=no -i $SSH_PATH/id_rsa -A -tt $USER@$HOST ls

執(zhí)行push,等待CI部署完成,查看log發(fā)現(xiàn)已經(jīng)打印出了服務(wù)器的文件文件夾信息,??

測試結(jié)果

最終的job腳本

配置說明

使用只需要關(guān)注deploy中的env配置

config description
ACTIONS_DEPLOY_KEY 連接服務(wù)的私鑰(在GitHub項目下的setting>Secrets配置)
HOST 服務(wù)器的IP地址
USER 服務(wù)器的部署用戶,對應(yīng)的私鑰的用戶
HOME_PATH 登陸服務(wù)器后,我們?nèi)ツ膫€目錄,一般設(shè)置為用戶目錄
DEVELOP_SH_PATH 服務(wù)器部署腳本(咱們的部署目錄還是服務(wù)器上執(zhí)行,不寫在job中)
PACKAGE_NAME 打包的名稱(public.tar.gz),目前只支持這個
DEVELOP_DIR 項目部署文件夾
BACKUP_DIR 項目的備份文件夾

job文件

name: aliyun

on:
  push:
    branches:
      - master
jobs:
  build:

    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@master
        with:
          submodules: true
      - name: setup Hugo
        uses: peaceiris/actions-hugo@v2.2.2
        with:
          hugo-version: '0.59.1'
          extended: true
      - name: Build
        run: hugo --minify
      - name: deploy
        env:
          ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          HOST: 10.10.10.10
          USER: appuser
          HOME_PATH: /home/appuser
          DEVELOP_SH_PATH: /home/appuser/develop.sh
          PACKAGE_NAME: public.tar.gz
          DEVELOP_DIR: tianhui.xin
          BACKUP_DIR: backup
        run: |
          SSH_PATH="$HOME/.ssh"
          mkdir -p $SSH_PATH
          touch "$SSH_PATH/known_hosts"
          echo "$ACTIONS_DEPLOY_KEY" > "$SSH_PATH/id_rsa"
          chmod 700 "$SSH_PATH"
          chmod 600 "$SSH_PATH/known_hosts"
          chmod 600 "$SSH_PATH/id_rsa"
          eval $(ssh-agent)
          ssh-add "$SSH_PATH/id_rsa"
          ssh-keyscan -t rsa $HOST >> "$SSH_PATH/known_hosts"
          cd public
          tar -cf $PACKAGE_NAME *
          scp $PACKAGE_NAME $USER@$HOST:$HOME_PATH
          ssh -o StrictHostKeyChecking=no -i $SSH_PATH/id_rsa -A -tt $USER@$HOST sh $DEVELOP_SH_PATH \
            -d $HOME_PATH/$DEVELOP_DIR -b $HOME_PATH/$BACKUP_DIR -f $HOME_PATH/$PACKAGE_NAME
          exit

遠(yuǎn)程服務(wù)器操作

新建develop.sh

#!/bin/sh
set -e

FILE_NAME=`basename $0`

#說明
show_usage="usage:$FILE_NAME [-d develop_path,-b backup_path -f file_path]"

#參數(shù)
# 本地倉庫目錄
opt_develop_path=""

# 備份目錄
opt_backup_path=""

# 部署文件
opt_file_path=""


GETOPT_ARGS=`getopt -o d:b:f: -al develop_path:,backup_path:,file_path: -- "$@"`
eval set -- "$GETOPT_ARGS"
#獲取參數(shù)
while [ -n "$1" ]
do
        case "$1" in
                -d|--develop_path) opt_develop_path=$2; shift 2;;
                -b|--backup_path) opt_backup_path=$2; shift 2;;
                -f|--opt_file_path) opt_file_path=$2; shift 2;;
                --) break ;;
                *) echo $1,$2,$show_usage; break ;;
        esac
done

# 判斷參數(shù)
if [[ -z $opt_develop_path || -z $opt_backup_path || -z $opt_file_path ]]; then
        echo -e $show_usage
        exit 0
fi

if [ "$opt_develop_path" = "$opt_backup_path" ]; then
  echo 'develop_path eq backup_path'
  exit 0
fi

# 判斷部署文件是否存在
if [ ! -f $opt_file_path ]; then
    echo "$opt_file_path file does not exist"
    exit 0
fi

# 判斷文件夾是否存在
if [ ! -x $opt_develop_path ]; then
  mkdir $opt_develop_path
fi

# 判斷文件夾是否存在
if [ ! -x $opt_backup_path ]; then
  mkdir $opt_backup_path
fi

# 文件夾不是空的
if [ ! "`ls -A $opt_develop_path`" = "" ]; then
  cd $opt_develop_path
  tar -cf $opt_backup_path/$(date +%Y%m%d%H%M).tar.gz $opt_develop_path/*
  rm -rf $opt_develop_path/*
fi
# 解壓文件
tar -xf $opt_file_path -C $opt_develop_path

echo "publish success!"

給予執(zhí)行權(quán)限

chomd u+x develop.sh
執(zhí)行結(jié)果

一切準(zhǔn)備就緒,開始你的奇妙之旅吧,碼字不易,有問題請留言交流。

相關(guān)文章:

  1. hugo通過Github Action部署到Github Pages

原文鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容