后端云网站部署CICD升级

CICD方案升级

过去博客更新的方式是:执行hexo g -d进行编译部署到阿里云,git版本管理push到Github。

自从上次试用过Github Action后,觉得应该紧跟技术趋势,用Github Action完成CICD自动化。其实事后效率也没提升,反而下降了,因为hexo g -d编译加部署一共一两秒。换成新流程只是省去了hexo g -d这一步,只剩下push到Github,但是Github Action自动执行这个过程大约需要30秒到60秒。

原来2秒就能看到博客更新的效果,现在要近1分钟才能看到。就是从方便程度,效率上没有优化,但是流程方式是极大升级的。该CICD思想用在大型项目上优势及其明显。且本地可以不用node环境,不需要装hexo。

自动化方案CICD流程升级:

  • Hexo代码仓库CI流程:监控到有push到静态目录public,则用rsync同步阿里云的nginx html目录。这种方案还需要本地执行hexo g

  • Hexo代码仓库CI流程:监控到源文件文件夹有push,则部署node环境,安装hexo,安装本地包,执行hexo g -d,通过hexo rsync部署到阿里云的nginx html目录。

  • 终极方案,双代码仓库,hexo代码仓库和静态网页代码仓库。Hexo代码仓库CI流程:监控到源文件文件夹有push,则部署node环境,安装hexo,安装本地包,执行hexo g -d,通过hexo git部署到Github静态网页仓库并触发静态网页仓库的CI流程:通过rsync部署到阿里云的nginx html目录。

  • 因为方案3已经包含了1和2的所有实现,所以就介绍下方案3。

    Hexo代码仓库CICD配置

    name: HEXO CI

    #Invalid workflow file: .github/workflows/ci.yml#L1
    # you may only define one of `paths` and `paths-ignore` for a single event
    on:
    push:
    branches:
    - master # 只在master上push触发部署
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
    - README.md
    - LICENSE
    # paths: # 这里是用来指定哪个文件更改,才会触发的
    # - './source/_posts/**'

    jobs:
    build:
    runs-on: ubuntu-latest
    strategy:
    matrix:
    node-version: [16.x]

    steps:
    - uses: actions/checkout@v1

    - name: Use Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v1
    with:
    node-version: ${{ matrix.node-version }}

    - name: Configuration environment
    env:
    HEXO_DEPLOY_PRI: ${{ secrets.DEPLOY_KEY }}
    run: |
    mkdir -p ~/.ssh/
    echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
    chmod 600 ~/.ssh/id_rsa
    ssh-keyscan github.com >> ~/.ssh/known_hosts
    git config --global user.name "hanwei" git config --global user.email "backendcloud@gmail.com" - name: Install dependencies
    run: |
    npm i -g hexo-cli
    npm i npm install hexo-deployer-git --save - name: Deploy hexo
    run: |
    hexo clean && hexo generate
    mkdir -p ./public/.github/workflows
    cp ./backendcloud.github.io.ci.yml ./public/.github/workflows/ci.yml hexo deploy
    language-yaml复制代码

    静态网页代码仓库CICD配置

    name: Deploy site files

    on:
    push:
    branches:
    - master # 只在master上push触发部署
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
    - README.md
    - LICENSE

    jobs:
    deploy:
    runs-on: ubuntu-latest # 使用ubuntu系统镜像运行自动化脚本

    steps: # 自动化步骤
    - uses: actions/checkout@v2 # 第一步,下载代码仓库

    - name: Deploy to Server # 第二步,rsync推文件
    uses: AEnterprise/rsync-deploy@v1.0 # 使用别人包装好的步骤镜像
    env:
    DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # 引用配置,SSH私钥
    ARGS: -avz --delete --exclude='*.pyc' # rsync参数,排除.pyc文件
    SERVER_PORT: "22" # SSH端口
    FOLDER: ./ # 要推送的文件夹,路径相对于代码仓库的根目录
    SERVER_IP: ${{ secrets.SSH_HOST }} # 引用配置,服务器的host名(IP或者域名domain.com)
    USERNAME: root # 引用配置,服务器登录名
    SERVER_DESTINATION: /usr/share/nginx/html/backendcloud/www/ # 部署到目标文件夹
    - name: Restart server # 第三步,重启服务
    uses: appleboy/ssh-action@master
    with:
    host: ${{ secrets.SSH_HOST }} # 下面三个配置与上一步类似
    username: root
    key: ${{ secrets.DEPLOY_KEY }}
    # 重启的脚本,根据自身情况做相应改动,一般要做的是migrate数据库以及重启服务器
    script: |
    rm -rf /usr/share/nginx/html/backendcloud/www/.git*
    language-yaml复制代码

    Hexo git deploy配置

    deploy:
    type: git
    repo: git@github.com:backendcloud/backendcloud.github.io.git
    # example, https://github.com/hexojs/hexojs.github.io
    branch: master
    ignore_hidden:
    public: false #public文件夹不忽略隐藏文件
    language-yaml复制代码

    跑通整个流程一路上遇到的坑

    paths-ignore 和 paths 不能同时存在。

    on:
    push:
    branches:
    - master # 只在master上push触发部署
    paths-ignore: # 下列文件的变更不触发部署,可以自行添加
    - README.md
    - LICENSE
    paths: # 这里是用来指定哪个文件更改,才会触发的
    - './source/_posts/**'
    language-yaml复制代码

    /images/blog-cicd

    Invalid workflow file: .github/workflows/ci.yml#L1
    you may only define one of `paths` and `paths-ignore` for a single event
    复制代码

    rsync use市场里选错了开源组件

    burnett01/rsync-deployments@5.2 这个不知道哪里有问题

    use换了一个:AEnterprise/rsync-deploy@v1.0 立马正常。

    hexo git找不到

    需要在

    - name: Install dependencies
    run: |
    npm i -g hexo-cli npm i - name: Deploy hexo
    run: |
    hexo clean && hexo generate
    language-yaml复制代码

    加一条npm install hexo-deployer-git --save

    - name: Install dependencies
    run: |
    npm i -g hexo-cli
    npm i npm install hexo-deployer-git --save - name: Deploy hexo
    run: |
    hexo clean && hexo generate
    language-yaml复制代码

    推送到静态网页仓库没有权限

    需要在静态网页的Github仓库的Settings标签里,配置下公钥,该公钥需要和github action中的容器里的私钥一致。

    推送到静态网页仓库正常,Github能看到最新的推送的代码仓库,但是该仓库的CI配置文件总是找不到

    - name: Deploy hexo
    run: |
    hexo clean && hexo generate
    mkdir -p ./public/.github/workflows
    cp ./backendcloud.github.io.ci.yml ./public/.github/workflows/ci.yml hexo deploy
    language-yaml复制代码

    Hexo代码仓库的CI配置文件有写拷贝的命令,但是静态网页代码仓库总是找不到。调试了几次,确认了代码没有问题。调试后发现非隐藏文件就能看到,隐藏文件就看不到。想到会不会hexo git默认就是不推送给隐藏文件的。去开源的hexo git查了下,果然。

    https://github.com/hexojs/hexo-deployer-git

    Hexo git deploy配置从下面的

    deploy:
    type: git
    repo: git@github.com:backendcloud/backendcloud.github.io.git
    # example, https://github.com/hexojs/hexojs.github.io
    branch: master
    language-yaml复制代码

    改成

    deploy:
    type: git
    repo: git@github.com:backendcloud/backendcloud.github.io.git
    # example, https://github.com/hexojs/hexojs.github.io
    branch: master
    ignore_hidden:
    public: false #public文件夹不忽略隐藏文件
    language-yaml复制代码

    一切正常。
    另外有个地方踩了个小坑:这两句

    mkdir -p ./public/.github/workflows
    cp ./backendcloud.github.io.ci.yml ./public/.github/workflows/ci.yml
    复制代码

    不能放在hexo clean && hexo generate之前,只能放在之后。因为hexo clean会清空public文件夹。

    至此,双代码仓库的 三 Github Action CICD流程完全跑通。

    欢迎订阅微信公众号“后端云”!

    ©著作权归作者所有,转载或内容合作请联系作者
    平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

    推荐阅读更多精彩内容