使用 Github Actions 实现 Docker 应用的自动更新和发布

anpho

发布于368天前
还没想好签名

建议本篇作为移植 Docker 应用的标准化操作指南。

image.png
Hi,如上图,目前我已经在懒猫微服上发布了多款应用,并实现了自动更新、提交审核。

本文的前置需求如下:

  1. 有 Github 账号
  2. 有懒猫开发者账号
  3. 已经安装了 lzc-cli (npm/nodejs)开发工具
  4. 已经移植了至少1款 Docker 应用

闲言少叙,以下是具体步骤。

一、Github Repo 配置

创建 Git Repo 以后,需要在设置里配置一下你的懒猫开发者用户名和密码,位置在:

image.png

此处使用的是USERNAMEPASSWORD

该配置的主要用途是 copy-image 和提交审核时的身份认证。

二、调整 manifest

为了便于发布时的自动设置,将 manifest 中的 image 字段改为占位符,如下:

services:
  resilio:
    image: ##
    # 上面一行修改为##,或者其他占位符
    binds:
      - /lzcapp/var/data:/mnt/sync
      - /lzcapp/run/mnt/home/ResilioSync:/mnt/mounted_folders/LazyCat

三、编写 Action

在 Actions 中新建一个空白 Action 模板,然后进行修改。下面以我写的 action 为例,说明一下每一段代码,参考注释。

name: LoadAndPack

# Action的运行时机
on:
  schedule:
    - cron: '0 0 */7 * *'  # 每 7 天执行一次 UTC 时间
    
  # 当 master 分支被 commit 或者 PR 时触发
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

  # 允许手动触发
  workflow_dispatch:
    

jobs:
  build:
    runs-on: ubuntu-latest
    # 使用 ubuntu 作为运行环境

    steps:
      # 把库克隆到 $GITHUB_WORKSPACE
      - uses: actions/checkout@v4

      # 安装 Node JS
      - uses: actions/setup-node@v3.9.1

      # 安装 docker CE
      - uses: docker/setup-docker-action@v4.3.0
      
      # 配置 lzc-cli,并登录
      - name: Prepare env etc.
        env: # 这里的两个 secret 就是在第1步中设置的用户名和密码
          USERNAME: ${{ secrets.USERNAME }}
          PASSWORD: ${{ secrets.PASSWORD }}
        run: |
          npm install -g @lazycatcloud/lzc-cli # 安装lzc-cli
          sudo apt install expect curl -y # 安装 expect 和 curl 
          expect -f ./int.exp "$USERNAME" "$PASSWORD" # 使用 expect 实现 lzc-cli 的登录时的用户名和密码输入
          
          TAGS=$(docker run --rm gcr.io/go-containerregistry/crane:latest ls resilio/sync) # 使用 Docker 获取最新的 tag
          echo "TAGS: $TAGS" # 把 tag 打在公屏上
          LATEST_TAG=$(echo "$TAGS" | grep -v 'latest\|master\|rel' | sort -V | tail -n1) # 取一下最新的 tag,每个开发者的习惯不同,这里取的是纯数字
          echo "Latest: $LATEST_TAG" # 把最后获取到的 tag 打在公屏上
          sed -i "s/^version: .*/version: $LATEST_TAG/I" lzc-manifest.yml # 替换 manifest 里的 version 字段。
          # 懒猫更新后,这个 version 必须使用 1.2.3 这样的字段,不能用字母,不能有前缀0,而且提交时需要大于已经上架的版本。
      
      # 替换 image
      - name: fetch image
        run: |
          last_part=$(lzc-cli appstore copy-image resilio/sync | tail -n 1 | awk '{print $NF}') # 调用 copy-image,把 docker 镜像复制到懒猫的服务器
          function escape_sed() {
            echo "$1" | sed 's/[&/\]/\\&/g'
          }
          last_part_escaped=$(escape_sed "$last_part") # 取一下最后一行输出的最后一段字符串。
          sed -i "s/##/$last_part_escaped/" lzc-manifest.yml # 替换掉 manifest 里的占位符,之前改成了##

        
      # 打包
      - name: build
        run: |
          lzc-cli project build # 构建应用
          TAGS=$(docker run --rm gcr.io/go-containerregistry/crane:latest ls resilio/sync)
          LATEST_TAG=$(echo "$TAGS" | grep -v 'latest\|master\|wv' | sort -V | tail -n1)
          lzc-cli appstore publish ./*.lpk -c "Auto Submit: $LATEST_TAG" # 提交应用
      
      # 上传 artifact,会出现在 action 运行的记录里
      - uses: actions/upload-artifact@v4.6.2
        with:
          path: ./*.lpk

最后上传的 artifact 位置在:

image.png

这样即可实现该应用的自动提交。

四、关于 expect

因为懒猫需要在终端里输入用户名和密码,没办法直接以参数传入,所以用了 expect,并编写了 expect 的脚本如下:

#!/usr/bin/expect

set username [lindex $argv 0]
set password [lindex $argv 1]
set cmd "/usr/local/bin/lzc-cli"

set timeout 20
match_max 100000

spawn $cmd  appstore login

expect {
    "请输入登录用户名" { send "$username\r" }
    timeout { puts "Timeout waiting for username prompt"; exit 1 }
}

expect {
    "请输入登录密码" { send "$password\r" }
    timeout { puts "Timeout waiting for password prompt"; exit 1 }
}

expect {
    "登录成功" { puts "Login successful!" }
    "错误" { puts "Login failed!"; exit 1 }
    timeout { puts "Login completed with unknown result." }
}
interact

看不懂没关系,直接用即可。

五、其他

以下是可供参考的库:

名称地址
SyncGithub/resilo-sync
TelegramGithub/telegram
ChromiumGithub/chromium

评论

4
liu257天前

很厉害的样子。👍

忘机山人366天前

lzc-cli appstore publish 命令行提交怎么标注原创呢?求问

anpho回复忘机山人366天前

先在开发者控制台里建好app,这个时候可以设置,控制台这边只是提交新版本审核。

忘机山人回复anpho365天前

明白了

说点什么呢~
收藏
3
4
0