通过Github Actions自动化Docker镜像打包和上传

2023-05-17 00:55:02 浏览数 (1)

读完本文大概需要5分钟

可以了解到docker构建多架构镜像相关的信息和Github Actions的使用

Github Actions解决什么问题

Docker是个很好用的东西,很多项目直接拉个镜像下来就可以跑了,不用再像之前一样卡在各种环境问题里出不来。非常方便,但是有个问题,如果代码更新比较频繁的话,怎么能让我的镜像总是保持最新呢,手动去更新是个很费力的事情。今天介绍的Github Actions就是解决这个问题的利器。

怎么解决

贴一段官方的介绍,GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。想了解更多细节可以点击传送门。

简单的说就是可以定义一个工作流,然后在满足一些条件的时候运行一些任务(job)。比如下面定义了一个构建Docker镜像的任务,在dev分支、v2*分支和v*tag的代码有push操作的时候进行新镜像的构建

代码语言:javascript复制
name: "Build Docker Image"

on:
  push:
    branches:
      - dev
      - v2*
    tags:
      - v*

一步一步实现打包镜像并上传dockerhub

项目:https://github.com/apache/incubator-streampark

问题1

我想用docker把上面的项目在我的mac电脑上跑起来,不幸的是官方镜像只有linux/amd64的,只能自己动手了

简单搜了下,docker本身对多架构镜像的构建支持非常好,基本上配置一下就行了,在简单折腾之后打包成功,然后有了新问题

问题2

怎么把我构建的镜像分享给其他人,答案是上传dockerhub,但是怎么自动化呢,主角登场了,用github Actions

怎么做

从0开始学当然是没问题的,但是有点慢,我们先看看项目里是怎么用的。

简单分析一下,

1.定义了镜像构建的触发时机,指定分支push的时候和每天的0:10分

2.有一个if判断

3.构建的环境是ubuntu-latest的基础镜像,然后是一些项目代码编译打包配置

4.配置了Docker Hub的登录信息、空间信息

5.Docker镜像构建和推送

代码语言:yaml复制
name: "Build Docker Image"

on:
  schedule:
    - cron: '0 10 * * *'
  push:
    branches:
      - dev
      - release-*
    tags:
      - v*

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build_image:
    runs-on: ubuntu-latest
    if: ${{ github.repository == 'apache/incubator-streampark' }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Setup Java and Scala
        uses: olafurpg/setup-scala@v13
        with:
          java-version: adopt@1.8

      - uses: actions/setup-node@v3
        with:
          node-version: '16'

      - name: Cache local Maven repository
        uses: actions/cache@v3
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build project release package
        run: |
          ./mvnw clean install -DskipTests -Pscala-2.12,shaded,dist,webapp

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: apache/streampark
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,event=tag
            type=ref,event=branch

      - name: Build and push streampark
        uses: docker/build-push-action@v3
        with:
          context: .
          file: deploy/docker/Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

流程搞清楚了,下面开始实操

多架构镜像打包

只需要增加几行配置就行,像下面这样

1.打包环境需要QEMU,一种虚拟化技术

2.设置Buildx

代码语言:javascript复制
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

3.增加架构配置

代码语言:javascript复制
platforms: linux/amd64,linux/arm64/v8

arm64有v8也有其他版本,不过差异比较小,可以先忽略

推送Docker Hub

1.首先当然是申请账号,然后在Account setting、security下面有个AccessToken,生成一个

2.然后在github项目的setting=>security下,找到secrets and variables

3.配置上DOCKERHUB_USER和DOCKERHUB_TOKEN

4.将dockerhub的image namespace改为自己的,因为官方的账号我们没有权限推送,只能推自己账号下的空间

修改触发配置

新增一个分支v2.1.0,push的时候触发

代码语言:javascript复制
on:
  push:
    branches:
      - v2*

修改完成后的配置

代码语言:javascript复制
name: "Build Docker Image"

on:
  push:
    branches:
      - v2*
    tags:
      - v*

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build_image:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Setup Java and Scala
        uses: olafurpg/setup-scala@v13
        with:
          java-version: adopt@1.8

      - uses: actions/setup-node@v3
        with:
          node-version: '16'

      - name: Cache local Maven repository
        uses: actions/cache@v3
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build project release package
        run: |
          ./mvnw clean install -DskipTests -Pshaded,dist,webapp

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: delik8shub/streampark
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,event=tag
            type=ref,event=branch

      - name: Build and push streampark
        uses: docker/build-push-action@v3
        with:
          context: .
          file: deploy/docker/Dockerfile
          platforms: linux/amd64,linux/arm64/v8
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

触发构建

1.把上面新建的v2.1.0分支先push到github

2.然后随便增加个空格啥的,再push

去actions里看,开始编译了

推送DockerHub

如果一切正常的话就能得到arm架构的镜像了

全文完

0 人点赞