github自动化构建镜像

1、创建仓库

访问github(GitHub: Let’s build from here · GitHub),创建仓库

2、Action配置

GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。

GitHub Actions 不仅仅是 DevOps,还允许您在存储库中发生其他事件时运行工作流程。 例如,您可以运行工作流程,以便在有人在您的存储库中创建新问题时自动添加相应的标签。

GitHub 提供 Linux、Windows 和 macOS 虚拟机来运行工作流程,或者您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。

关于GitHub Actions的详细介绍可以去github官网查看

中文版 GitHub Actions 文档 - GitHub 文档

英文版 GitHub Actions documentation - GitHub Docs

在代码根目录下创建.github文件夹,目录结构如下

以部署java项目为例介绍docker-image.yml,示例如下:

#工作流名称
name: springboot-build
​
#自动触发方式写一种即可
#自动构建触发-方式1:路径触发(src路径下面的代码有变动或Dockerfile有变动时触发自动构建)
on:
  push:
    paths:
      - 'src/**'
      - 'Dockerfile'
​
#自动构建触发-方式2:分之触发(master分支有变动时触发自动构建)
on:
    pull_request:
        branches: [master]
#设置变量
env:
  TZ: Asia/Shanghai
  IMAGE_NAME: springboot-server
​
# 工作流程,可包含多个作业
#如果指定字符串数组,工作流将在与所有指定 runs-on 值匹配的运行器上执行。 例如,此处的作业将仅在具有标签 linux、x64 和 gpu 的自托管运行器上运行:
#runs-on: [self-hosted, linux, x64, gpu]
jobs:
  # 作业1名称
  buildx:
    # 指定的运行器环境
    runs-on: self-hosted
​
    steps:
      # 拉取代码
      - name: Checkout
        uses: actions/checkout@main
        
      # 打包
      - name: Build-28181 
        run: |
          mvn package --file pom.xml
          mv target/xd-pro-2.3.2.jar  target/xd-pro-2.3.2-20230701.jar
​
      # SRS是使用GitHub Actions自动打镜像,并上传到Docker和Aliyun的镜像仓库。
      # setup-qemu 如果您想使用 QEMU 添加仿真支持以便能够针对更多平台进行构建,则 action 会很有用
      - name: Set up QEMU
        uses: docker/setup-qemu-action@master
        
      # setup-buildxaction 将默认使用docker-container 构建器驱动程序创建和引导构建器。非必需
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@master
     # 设置输出
      - name: Set outputs
        id: vars
        run: |
          echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
          echo "image_name=$IMAGE_NAME" >> $GITHUB_OUTPUT
​
      - name: Get current date
        id: date
        run: |
          echo "::set-output name=today::$(date +'%Y-%m-%d')"
          echo  $(date)
​
​
      - name: Build and Push Docker-AMD64
        run: |
          docker build -t registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }} -t registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:latest .
          docker push registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}
          docker push registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:latest
          docker rmi registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}
          docker rmi registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:latest
​
      #推送docker镜像
      - name: Build and Push Docker-ARM64
        uses: docker/build-push-action@master
        with:
          platforms: linux/arm64
          #指定Dockerfile所在位置
          context: .
          push: true
          tags: registry.cn-hongkong.aliyuncs.com/zxiat-arm64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }},registry.cn-hongkong.aliyuncs.com/zxiat-arm64/${{ steps.vars.outputs.image_name }}:latest
​
      #保存镜像到指定服务器
      - name: 1.93_save_image_to_local
        uses: appleboy/ssh-action@v0.1.10
        with:
          host: 192.168.X.X
          username: root
          password: admin 
          port: 22
          script: |
            mkdir -p /data/file_browser/github-actions-dist/${{ steps.vars.outputs.image_name }}
            docker pull registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}
            docker pull --platform=arm64 registry.cn-hongkong.aliyuncs.com/zxiat-arm64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}
            docker save -o /data/file_browser/github-actions-dist/${{ steps.vars.outputs.image_name }}/${{ steps.vars.outputs.image_name }}_amd64_${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}.tar registry.cn-hongkong.aliyuncs.com/zxiat-amd64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}
            docker save -o /data/file_browser/github-actions-dist/${{ steps.vars.outputs.image_name }}/${{ steps.vars.outputs.image_name }}_arm64_${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}.tar registry.cn-hongkong.aliyuncs.com/zxiat-arm64/${{ steps.vars.outputs.image_name }}:${{ steps.date.outputs.today }}-${{ steps.vars.outputs.sha_short }}
​

3、Dockerfile

# 指定构建容器的基础镜像
FROM ubuntu:20.04
​
#暴漏服务端口
EXPOSE 18082/tcp
​
#设置环境变量
ENV LC_ALL zh_CN.UTF-8
ENV TZ Asia/Shanghai
ENV LANG C.UTF-8
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
​
#安装基础环境
RUN export DEBIAN_FRONTEND=noninteractive &&\
        apt-get update && \
        apt-get install -y --no-install-recommends openjdk-8-jre  && \
        apt-get install -y vim && \
        apt-get install -y locales && \
        apt-get clean -y
​
#防止中文乱码
RUN locale-gen zh_CN.UTF-8
#创建所需的文件夹
RUN mkdir -p /data/code/lib/
​
#设置动态库路径
ENV LD_LIBRARY_PATH /data/code/lib/
COPY ./x86_lib /data/code/x86_jni_lib
COPY ./arm_lib /data/code/arm_jni_lib
​
#根据不同环境加载对应动态库
RUN if [ "$(arch)" = "x86_64" ]; \
then mv /data/code/x86_jni_lib/* /data/code/lib/ ; \
else mv /data/code/arm_jni_lib/* /data/code/lib/ ; \
fi
​
#挂载目录
VOLUME ["/data/code/zhyu_crypher"]
​
#指定工作目录
WORKDIR /data/code/zhyu_crypher
​
#执行命令
CMD ["java","-jar","./app-0.0.1-SNAPSHOT.jar","--spring.cloud.bootstrap.location=./config/application.properties"]
​
# CMD 也可以执行shell脚本
#CMD ["sh", "run.sh"]

创建完成后每次更新代码到代码仓,会自动打包镜像并上传到镜像仓库。构建过程在Actions中查看

参考文章Docker + GitHub Actions 持续集成工作流 | 青山依旧 (qscoding.com)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐