写点什么

最佳实践 - 使用 Github Actions 来构建跨平台容器镜像

作者:EquatorCoco
  • 2023-11-15
    福建
  • 本文字数:2186 字

    阅读完需:约 7 分钟

概述


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


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


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


以上是 GitHub 的官方介绍,其实就是有一个类似于Jenkinspipeline,支持手动或者代码等方式触发,支持 pipeline 运行在 Linux、Windows 和 macOS 等虚拟机中,下面是一个示意图



GitHub 的 pipeline 使用 yaml 进行维护,同时内置了很多现成的组件,拿来即用,下面就以具体的一个实例进行介绍,如何使用


我们将做什么?


我们会构建一个前端工程的 docker 镜像,并推送此镜像至 DockerHub 仓库,同时在 k8s 中拉取并运行验证



1. 创建一个前端项目


工程已经创建好,地址:https://github.com/dongweizhao/frontend



其中为了方便部署,前端资源都存放在工程的dist目录


2. 编写 Dockerfile


引用 nginx 镜像,同时拷贝dist目录下资源值容器的/frontend,同时拷贝nginx.conf覆盖nginx镜像默认的配置文件,以下文件工程中都已经涵盖 nginx.conf


server{    listen 80;    server_name localhost;     root  /frontend;     index index.html index.htm;
location /login { try_files $uri $uri/ /login.html; }}
复制代码


Dockerfile


from nginxcopy ./dist /frontendrun chown nginx.nginx /frontend -Rcopy nginx.conf /etc/nginx/conf.d/default.conf
复制代码


3. Actions 配置


配置 DockerHub 账号密码



点击New repository secret按钮,创建对应的变量。


例如,我要创建DOCKER_HUB_USERNAME变量,值为root,配置如下:



创建 worfkflow 文件点击Actions



Actions 内置了很多模版,拿过来配置下即可,这里我们用Publish Docker Container,选择其他也行,最终改成以下下文件


#workflow名称name: ci# 触发条件on:#github页面手动触发  workflow_dispatch: #打tag触发,必须是v开头的  push:    tags:      - "v*.*"#变量配置      env:  #镜像名称  IMAGE_NAME: frontend  #dockerHub仓库名称  DOCKER_REGISTRY: dweizhaojobs:  build-image:    #运行的环境      runs-on: ubuntu-latest    env:      TZ: Asia/Shanghai    outputs:      tags: ${{ steps.output-id.outputs.v }}    steps:      # 拉取代码,同时获取tag,如果获取不到则默认值为edge,并赋值给v变量      - uses: actions/checkout@v3      - id: output-id        run: |          VERSION=edge          if [[ $GITHUB_REF == refs/tags/* ]]; then            VERSION=${GITHUB_REF#refs/tags/v}          fi          echo "v=${VERSION}" >> $GITHUB_OUTPUT     # Docker配置多平台环境      - name: Set up Docker BuildX        uses: docker/setup-buildx-action@v2                # 登录镜像仓库      - name: Login Docker Hub        uses: docker/login-action@v1        with:        #这里引用的变量为上一步配置的变量          username: ${{ secrets.DOCKER_HUB_USERNAME }}          password: ${{ secrets.DOCKER_HUB_PWD }}           # 打包构建并推送      - name: Build and push        uses: docker/build-push-action@v4        with:          context: .          file: ./Dockerfile          platforms: |            linux/amd64            linux/arm64          #推送到镜像仓库            push: true          # 这里会构建两个版本镜像,          # 1.dweizhao/backend:latest          # 2.  output-id步骤中获取的v,构建dweizhao/backend:edge或者dweizhao/backend:对应tag值          tags: |            ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.output-id.outputs.v }}            ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
复制代码


以上文件创建完成,会在工程目录下创建一个.github 的目录,保存有我们配置的文件



同时再次点击Actions按钮会出现,以下界面



这里的ci就是配置的 workflow 的name名称


4. 镜像构建并发布


我们测试两种方式,分别如下:


手动触发构建



根据箭头表示,点击run wofkflow按钮,执行任务



点击 ci 可以查看任务执行详情,可以看到任务执行步骤以及对应状态以及相关日志



以上结果表明,执行成功,查看 dockerhub 镜像仓库,可以看到推送已经成功,由于是手动触发获取不到 tag,所以构建了edgetag 的镜像



创建 tag 触发构建创建了一个v1.0.0



自动触发构建



可以镜像仓库在同一时间,构建了latest1.0.0tag 镜像



5. 容器部署验证


下面我们在 k8s 环境中拉取frontent前端镜像,验证是否部署成功。


我们创建了 frontenddeployment,同时指定了镜像为dweizhao/frontend:latest



可以看到镜像启动成功



结论


如果你用的是 mac 的 m 系列芯片,可以尝试使用 Github Actions 来构建你的镜像,前提是你自己的个人项目,Github Actions 功能很强大,如果感兴趣可以继续去研究。


文章转载自:架构成长指南

原文链接:https://www.cnblogs.com/waldron/p/17833569.html

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
最佳实践-使用Github Actions来构建跨平台容器镜像_GitHub_EquatorCoco_InfoQ写作社区