前幾天寫了個基於 rsync 進行文件同步的 Action -> rsync-deploy-action。目的有三個:html
git pull
一下,且服務器還掛着其餘東西,性能仍是有點損耗的,換成經過 rsync 進行主動推送的方式好點;今天擼一篇文章簡單記錄下此次折騰。nginx
挑 rsync 協議,不挑 FTP 或 scp 的新建 GitHub Actions 的部分緣由是 rsync 能夠作增量備份。GitHub Action 有三種類別,即 Docker container、JavaScript 和 Composite run steps。此次手擼的 Action 歸屬於 GitHub 官方文檔介紹的 Docker container action。rsync-deploy-action 已經發布到 GitHub 的 Marketplace。源倉庫地址:https://github.com/yeshan333/rsync-deploy-action。git
rsync 與其餘文件傳輸工具(如 FTP 或 scp)不一樣,rsync 的最大特色是會檢查發送方和接收方已有的文件,僅傳輸有變更的部分(默認規則是文件大小或修改時間有變更)。github
rsync-deploy-action 基於 SSH 協議進行文件的遠程同步,從元數據文件 action.yml 能夠看到,Action 支持 8 個參數「6個必選,2個可選」。docker
name: 'rsync-deploy-action' description: 'Synchronize files to the remote server using the SSH private key' inputs: ssh_login_username: description: 'SSH login username' required: true remote_server_ip: description: 'remote server ip' required: true ssh_port: description: 'remote server SSH port' required: true default: "22" ssh_private_key: description: 'login user SSH private key' required: true source_path: description: 'The source storage path of the synchronous files' required: true destination_path: description: 'The destination storage path of the synchronous files' required: true ssh_args: description: 'SSH args' required: false rsync_args: description: 'rsync args' required: false outputs: start_time: description: 'Start time of synchronization' end_time: # id of output description: 'End time of synchronization' runs: using: 'docker' image: 'Dockerfile' args: - ${{ inputs.ssh_login_username }} - ${{ inputs.remote_server_ip }} - ${{ inputs.ssh_port }} - ${{ inputs.ssh_private_key }} - ${{ inputs.source_path }} - ${{ inputs.destination_path }} - ${{ inputs.ssh_args }} - ${{ inputs.rsync_args }} branding: icon: 'file' color: 'green'
利用 rsync-deploy-action 的 Dockerfile 文件配合 Action 執行日誌能夠一窺 GitHub Actions 背後是如何執行的。 Action 的 with 參數的傳遞在必定程度上利用了 Dockerfile 的 ENTRYPOINT。shell
# Container image that runs your code FROM alpine:latest RUN apk update \ && apk upgrade \ && apk add --no-cache \ rsync \ openssh-client # Copies your code file from your action repository to the filesystem path `/` of the container COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # Code file to execute when the docker container starts up (`entrypoint.sh`) ENTRYPOINT ["/entrypoint.sh"]
接下來介紹下利用 rsync-deploy-action 進行 Hexo 博客同步到我的騰訊雲 CVM 服務器的過程。npm
因爲 rsync 是基於 SSH 協議的,rsync-deploy-action 須要使用到 SSH 私鑰,因此須要先建立一個能夠進行 SSH 遠程登陸的用戶,不建議直接使用 root 用戶。ubuntu
一、先配置好遠程騰訊雲 CVM 服務器 SSH 容許密鑰登陸。編輯 SSH 配置文件 /etc/ssh/sshd_config。vim
vim /etc/ssh/sshd_config
保存後,重啓 sshd。服務器
systemctl restart sshd
二、新建用戶 github,用於遠程 SSH 免密登陸。
在遠程服務器執行以下命令:
# root 用戶下建立用戶 github 而且指定 HOME 目錄 useradd -d /home/github github # 也可使用 adduser github,adduser會自動建立 HOME 目錄等 # 設置 github 用戶密碼,用於後續 SSH 登陸公鑰的上傳 passwd github
三、在本地 PC 執行以下命令,建立用於登陸的密鑰對。
# 生成密鑰對 ssh-keygen -t rsa -b 4096 -C "1329441308@qq.com" # 將生成的公鑰上傳到雲服務器,server_ip 爲服務器 IP 地址,ssh_port 爲 SSH 端口號 cat ~/.ssh/id_rsa.pub | ssh github@server_ip -p ssh_port "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" # ssh 密鑰登陸測試,server_ip 爲服務器 IP 地址,ssh_port 爲 SSH 端口號 ssh -p ssh_port -i ~/.ssh/id_rsa github@server_ip
以上操做完成沒問題以後,便可使用 rsync-deploy-action 了,後面以我的 Hexo 博客的同步爲例子,簡單看下如何使用此 Action。
我的 Hexo 博客以前已經配置過 GitHub Action 的 workflows 進行博客的自動部署「博客源倉庫:yeshan333/actions-for-hexo-blog」,因此再添加個 step 給 rsync-deploy-action 便可啓用博客同步。step 聲明以下:
name: Site CI on: pull_request: branches: [master] push: branches: [master] jobs: build: runs-on: ubuntu-latest steps: ...... - name: Release to GitHub Pages run: | git config --global user.email "1329441308@qq.com" git config --global user.name "yeshan333" git clone git@github.com:yeshan333/yeshan333.github.io.git .deploy_git chmod 755 -R .deploy_git hexo clean hexo generate hexo deploy - name: Push to tencentyun CVM uses: yeshan333/rsync-deploy-action@v1.0.0 with: ssh_login_username: ${{ secrets.SSH_LOGIN_USERNAME }} remote_server_ip: ${{ secrets.REMOTE_SERVER_IP }} ssh_port: ${{ secrets.SSH_PORT }} ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} source_path: ./.deploy_git/* destination_path: ~/shan333.cn rsync_args: --exclude="./.deploy_git/.git/*"
workflow 中名爲 Push to tencentyun CVM 的 step 會將 .deploy_git 下的全部文件上傳到雲服務器「存放到 ~/shan333.cn 目錄下」,熟悉 Hexo 的朋友應該知道 hexo deploy
生成的文件會放在 .deploy_git
目錄下,這裏用到了 Hexo 的一個 Plugin -> hexo-deployer-git。其實也能夠將 hexo generate
生成的 public 目錄下的全部文件同步到雲服務器。
rsync-deploy-action 使用到的參數解釋「有部分數據也算是隱私數據,這裏意思下用了 GitHub 的 repository secrets」:
~/shan333.cn
,即/home/github/shan333.cn
「大功告成」。rsync 協議的更多介紹可參考:WangDoc.com rsync。
我的的騰訊雲 CVM 服務器以前爲了方便維護安裝了個運維面板BT.CN,Hexo 博客是用過 Nginx Serving 的,但 Nginx 是經過運維面板安裝的,默認的 user 爲 www「寶塔對 Nginx 的配置文件進行了拆分」,但同步後的博客是放在 github 用戶的 HOME 目錄下的 shan333.cn 目錄中的,www 無權限執行博客的相關文件(403 Forbidden),因此須要操做波給 www 用戶可執行權限,讓 Nginx Worker 能夠 serving 博客:
# root 用戶下執行,github 目錄下的全部文件 755 權限 chmod -R 755 /home/github # 將 www 用戶添加到 github user group usermod www -G -a www
本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈