• hexo博客使用docker自动化部署阿里云


    alt

    起因

    接上一篇hexo博客docker部署阿里云的一点心得 之后,第二次上传文章的时候发现,从dockerhub仓库拉取自己的镜像非常慢,而且基本都是timeout拉不下来,尝试改镜像源什么的没啥效果。

    在修改镜像源的过程中发现了阿里云容器镜像服务,发现它个人版还是免费的,经测试,拉取镜像速度很快,于是就用上了它。

    又想到,每次发文章都要push代码,然后登陆ecs再用docker pull下来,然后再run起来.......是不是太麻烦了,是不是可以一步到位,只要push完代码就行了,其他的交给git action。

    自己在本地登录ecs是需要输入密码的,在gitaction上是通过脚本执行,怎么做呢?在网上找了后发现也有教程案例,那就是使用ssh密钥来登陆ecs,然后执行登陆后的操作。

    思路

    1. push代码
    2. 触发git action
    3. 使用阿里云容器镜像服务保存镜像
    4. 使用ssh远程登录ecs,从阿里云的镜像上pull镜像,然后run

    过程

    一、使用阿里云容器镜像服务

    登陆阿里云,搜索容器镜像服务,创建一个个人版镜像仓库,记住命名空间和仓库名称,选择类型时选择公开。

    仓库管理--访问凭证设置一个固定密码。

    至此,这里需要用到:

    • 容器镜像用户名(阿里账户全名)
    • 容器镜像密码(设置好的固定密码)
    • 个人镜像的命名空间
    • 镜像仓库名称

    二、在ecs上建立ssh密钥

    登陆可以使用密码登陆,也可以使用ssh密钥登陆,为了安全,使用ssh密钥。

    1. 登陆ecs,执行
      mkdir -p ~/.ssh && cd ~/.ssh
      ssh-keygen -t rsa
      • 1
    2. 执行命令,一路回车,得到id_rsa和id_rsa.pub,其中id_rsa是私钥,id_rsa.pub是公钥
    3. 在服务器上安装公钥,设置好权限:
      cat id_rsa.pub >> authorized_keys
      chmod 600 authorized_keys
      chmod 700 ~/.ssh
      • 1
    4. 设置ssh,打开密钥登陆:
      # 编辑 /etc/ssh/sshd_config 文件,进行如下设置
      RSAAuthentication yes
      PubkeyAuthentication yes
      • 1

    后面两步验证即可,后面也是查了才知道,默认情况下都是正确的。

    查看私钥文件,复制备用。

    三、配置git secrets

    在github上打开项目目录,Settings -> Secrets -> actions,添加好需要用到的参数:

    • REGISTRY_USERNAME :镜像仓库用户名
    • REGISTRY_PASSWORD:镜像仓库密码
    • SERVER_HOST:服务器地址
    • SERVER_USER:服务器用户名
    • SERVER_TOKEN:ssh私钥
    alt

    四、编写git actions

    actions中新建一个action动作,选择nodejs模版,然后编写内容:

    # deploy.yml
    name: deploy blog to dockerhub
    on:
    push:
    branches:
    - hexo # 上传到此分支触发
    jobs:
    build:
    runs-on: ubuntu-latest
    steps:
    # 检查代码
    - name: Checkout # 将仓库内master分支的内容下载到工作目录
    uses: actions/checkout@v2 # 脚本来自 https://github.com/actions/checkout
    # 发布
    - name: Login to Aliyun Container Registry (ACR)
    uses: aliyun/acr-login@v1 # 使用阿里云镜像服务action
    with:
    login-server: registry.cn-shenzhen.aliyuncs.com # 务必正确填写镜像容器服务的登录地址
    region-id: cn-shenzhen # 务必正确填写镜像容器服务的登录地址
    username: "${{ secrets.REGISTRY_USERNAME }}" # 引用GitHub repo设置的镜像容器服务用户名
    password: "${{ secrets.REGISTRY_PASSWORD }}" # 引用GitHub repo设置的镜像容器服务密码
    - name: Build and Push Docker Image
    env:
    app_name: "my-blog"
    app_space: "maya1900"
    app_url: "registry.cn-shenzhen.aliyuncs.com"
    run: |
    docker build -t $app_url/$app_space/$app_name:latest .
    docker push $app_url/$app_space/$app_name:latest
    # 部署
    - name: Login aliEcs
    uses: appleboy/ssh-action@master
    env:
    app_name: "my-blog"
    app_space: "maya1900"
    app_url: "registry.cn-shenzhen.aliyuncs.com"
    with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SERVER_TOKEN }}
    port: 22
    script: |-
    app_name="my-blog"
    app_space="maya1900"
    if test -n "$(docker ps -a |grep $app_name)"; then
    echo "停止并且删除容器和上版本镜像"
    docker stop $app_name
    docker rm $app_name
    docker rmi registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
    else
    echo "未检查到$app_name容器运行"
    fi

    echo "获取最新的镜像"
    docker pull registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
    echo "启动服务"
    docker run --name $app_name -p 8082:80 -d registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
    • 1

    保存后,action就应该第一次启动了(当然我试了n次才成功...)。

    以后push完代码就可以等代码部署到网站了。(里面使用到的docker命令与上一篇文章有关,有兴趣可自行查看)

    遇到的坑:

    1. 镜像推到阿里云上,拉取不下来?
      1. 把仓库设置为公开
      2. 拉取路径有问题,先在本地尝试
    2. 使用了阿里镜像服务,执行时还在dockerhub上拉取?
      1. 因为上一篇中使用了docker-compose,pull完后就docker-compose up,执行docker-compose里的指令,这里其实设置images时使用阿里镜像的地址,一样使用docker-compose,为了直接使用脚本,就不另外建文件了
    3. linux使用变量总是出错?
      1. 在给镜像地址一个变量时(这里是registry.cn-shenzhen.aliyuncs.com),总是出错,执行app_url="registry.cn-shenzhen.aliyuncs.com"才发现这条出错,于是把它直接写死里面了。。

    发现还需要学的:

    • linux操作学习
    • 脚本语言学习

    最后,感谢前辈们的无私分享,谢谢。

    参考

    1. 使用GitHub Action自动构建和推送Docker镜像_BulletTech2021的博客-CSDN博客_github自动构建docker
    2. Java项目基于github actions、dockerhub、aliyunECS构建CICD流水线 - 掘金 (juejin.cn)
    3. 使用 GitHub Actions 实现博客自动化部署 | Frost's Blog (frostming.com)

    本文由 mdnice 多平台发布

  • 相关阅读:
    路由器基础配置以及静态路由配置
    阶乘分解(筛素数+分解质因数C++)
    手把手教你如何Vue项目打包dist文件并Tomcat发布【超级详细】
    「Windows Bug」Window 系统下双网卡内外网冲突
    极限多标签算法: FastXML 的解析
    CEC2015:动态多目标测试函数之FDA4、FDA5、FDA5_iso、FDA5_dec
    【邻接表特点,邻接表的代码实现】
    历时7天,四名学生将《水浒传》搬到线上!
    小程序+egg来实现获取用户手机号
    前辈经验分享:Linux后台开发调试
  • 原文地址:https://blog.csdn.net/high32/article/details/126186990