最近写了几个新的Bot,为了方便写的时候调试,研究了如何自动从本地部署到服务器,同时为了代码管理,Google了下“Github自动部署到服务器”。试了下Github Actions,真是相见恨晚。先简单记录下如何实现自动部署。
本地环境: Git + Pycharm
中间仓库: Github private repository
运行服务器: VPS + 开启SSH密钥对登陆 + 安装必要的工具
目录
一、Github 设置
创建Github账号并创建私有库
如果没有Github账号可以按教程创建一个。现在创建私有库免费,且个人使用没有数量上的限制。感谢Github,为代码进行Git管理带来了便捷。
创建SSH密钥对,用于授权Github对服务器的访问
私钥配置到Github仓库的环境变量
这里和配置SSH密钥授权登陆远程服务器类似,不同的是私钥需要配置到Github仓库中而不是保留在本地。
直接进入环境变量配置界面 https://github.com/用户名/仓库名/settings/secrets/actions 或从项目的设置里面进入
DEPLOY_KEY
变量的值导入后便不可见,但是可以随时修改。同样方式导入名子为SSH_HOST
的变量,用于存储服务器的IP,SSH_USERNAME
存储将登陆服务器的用户名。
上传公钥到服务器
和配置SSH密钥授权登陆远程服务器一样。为了方便,也可不去用编辑器编辑authorized_keys
文件,直接命令行导入
cat /root/.ssh/authorized_keys < 创建的公钥的内容 EOF
二、本地安装Git + Pycharm并配置
安装Git
直接下载这个版本 https://git-scm.com/download/win
安装Pycharm
社区版本即够用了 https://www.jetbrains.com/pycharm/download/#section=windows
设置Pycharm的Github账号
直接登陆Github账号报错“invalid authentication data 404 not found”,可以用token的方式登陆,获取链接:https://github.com/settings/tokens
Git的一些操作,包括add,commit,push,都在Pycharm的Git或者VCS菜单下,不需要敲任何命令。
三、服务器环境安装
安全设置
关闭密码方式登陆,仅开启SSH密钥方式登陆,参考
安装必要的程序
apt-get install sudo vim screen htop rsync curl sqlite3 python3-pip pip3 install python-telegram-bot
其中,
rsync和curl是把代码从Github上传到服务器必须用的;
给root用户安装sudo命令是是为了向下兼容有些为普通用户准备的带sudo的命令;
装vim的目的是博主习惯用vim;
装htop是为了更直观地看系统进程;
sqlite3和python3-pip是部署的项目需要用到。
四、Github仓库创建Actioins
等代码可从本地Push到Github仓库后,新建一个Actions脚本,将需要触发的一些命令写入
以下脚本供参考,可以直接替换掉新建的Actions脚本里面的默认内容
name: Deploy Python Telegram Bot (gdsharebot) on: push: branches: - master paths-ignore: - README.md - readme.md - LICENSE jobs: deploy: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'ci skip')" steps: - uses: actions/checkout@v2 - name: Deploy to Server uses: AEnterprise/rsync-deploy@v1.0 env: DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} ARGS: -avz --delete --exclude='*.pyc' SERVER_PORT: "22" FOLDER: ./ SERVER_IP: ${{ secrets.SSH_HOST }} USERNAME: ${{ secrets.SSH_USERNAME }} SERVER_DESTINATION: /root/gdsharebot - name: Restart server uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.DEPLOY_KEY }} script: | screen -ls | egrep "^\s*[0-9]+.gdsharebot" | awk -F "." '{print $1}' | xargs --no-run-if-empty kill screen -S gdsharebot -dm bash -c "cd /root/gdsharebot; python3 main.py" exit