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


    概述

    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

    1. server{
    2. listen 80;
    3. server_name localhost;
    4. root /frontend;
    5. index index.html index.htm;
    6. location /login {
    7. try_files $uri $uri/ /login.html;
    8. }
    9. }

    Dockerfile

    1. from nginx
    2. copy ./dist /frontend
    3. run chown nginx.nginx /frontend -R
    4. copy nginx.conf /etc/nginx/conf.d/default.conf

    3. Actions配置

    配置DockerHub账号密码

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

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

    创建worfkflow文件点击Actions

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

    1. #workflow名称
    2. name: ci
    3. # 触发条件
    4. on:
    5. #github页面手动触发
    6. workflow_dispatch:
    7. #打tag触发,必须是v开头的
    8. push:
    9. tags:
    10. - "v*.*"
    11. #变量配置
    12. env:
    13. #镜像名称
    14. IMAGE_NAME: frontend
    15. #dockerHub仓库名称
    16. DOCKER_REGISTRY: dweizhao
    17. jobs:
    18. build-image:
    19. #运行的环境
    20. runs-on: ubuntu-latest
    21. env:
    22. TZ: Asia/Shanghai
    23. outputs:
    24. tags: ${{ steps.output-id.outputs.v }}
    25. steps:
    26. # 拉取代码,同时获取tag,如果获取不到则默认值为edge,并赋值给v变量
    27. - uses: actions/checkout@v3
    28. - id: output-id
    29. run: |
    30. VERSION=edge
    31. if [[ $GITHUB_REF == refs/tags/* ]]; then
    32. VERSION=${GITHUB_REF#refs/tags/v}
    33. fi
    34. echo "v=${VERSION}" >> $GITHUB_OUTPUT
    35. # Docker配置多平台环境
    36. - name: Set up Docker BuildX
    37. uses: docker/setup-buildx-action@v2
    38. # 登录镜像仓库
    39. - name: Login Docker Hub
    40. uses: docker/login-action@v1
    41. with:
    42. #这里引用的变量为上一步配置的变量
    43. username: ${{ secrets.DOCKER_HUB_USERNAME }}
    44. password: ${{ secrets.DOCKER_HUB_PWD }}
    45. # 打包构建并推送
    46. - name: Build and push
    47. uses: docker/build-push-action@v4
    48. with:
    49. context: .
    50. file: ./Dockerfile
    51. platforms: |
    52. linux/amd64
    53. linux/arm64
    54. #推送到镜像仓库
    55. push: true
    56. # 这里会构建两个版本镜像,
    57. # 1.dweizhao/backend:latest
    58. # 2. output-id步骤中获取的v,构建dweizhao/backend:edge或者dweizhao/backend:对应tag值
    59. tags: |
    60. ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.output-id.outputs.v }}
    61. ${{ 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

  • 相关阅读:
    知识头条-大脑
    React数据管理Redux和thunk异步操作
    多普勒效应与多普勒频移
    ThinkPHP+基于ThinkPHP的图书馆管理系统 毕业设计-附源码311833
    从中间件团队窃取了这个组件,见识到了编码能力的天花板!!
    安全和便捷:如何将运营商二要素API应用于实名制管理中
    pyinstaller 操作以及常见问题解决
    Python学习 -- logging模块
    Biotin-Cy2 Conjugate,生物素-Cy2 偶联物_Cy2 生物素偶联物
    国腾GM系列,GM8284DD(GM8284DR,LT8218A)、 GM8285C、GM7123C,LVDSTTL转TTL,TTL转成单路LVDS
  • 原文地址:https://blog.csdn.net/sdgfafg_25/article/details/134424383