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

起因

接上一篇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
    复制代码
  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
    复制代码
  4. 设置ssh,打开密钥登陆:
    # 编辑 /etc/ssh/sshd_config 文件,进行如下设置
    RSAAuthentication yes 
    PubkeyAuthentication yes
    复制代码

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

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

三、配置git secrets

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

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

四、编写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
复制代码

保存后,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)

猜你喜欢

转载自juejin.im/post/7128403113785950244