云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

16|自动构建:如何使用 GitHub Action 构建镜像?

你好,我是王炜。
前面几节课,我们一起学习了容器化的最佳实践。从本质上来说,我们一直都在学习编写 Dockerfile 的技巧,以及如何构建出更适合生产环境的镜像。
在之前的课程中,我们编写完 Dockerfile 之后,会在本地通过 docker build 命令来构建镜像,然后把它推送到 Docker Hub 的镜像仓库中。不过实际上,在完整的 GitOps 的环节中,我们并不会用这种手动的方式来构建镜像,通常我们会使用工具完成自动构建。
如果你熟悉 DevOps 流程,会知道在提交代码之后会触发一个自动化流程,它就是我们常说的 CI (Continuous integration),持续集成。持续集成会自动帮助我们做一些编译、构建、测试和打包工作。在将业务进行容器化改造之后,我们会有更多构建 Docker 镜像的工作,所以为了提高效率,在 GitOps 工作流中,我们同样可以在持续集成的阶段实现自动化的镜像构建。
所以,从这节课开始,我将带你学习 GitOps 工作流中的第一个自动化阶段:自动构建镜像。
这节课我会以 K8s 极简实战中的示例应用为例,带你从零开始配置 GitHub Action 自动构建镜像的工作流,它是组成 GitOps 工作流中的重要的一环
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用 GitHub Action 自动构建镜像的方法,以及相关的配置步骤和操作流程。作者首先介绍了 GitHub Action 的基本概念,包括 Workflow、Event、Job 和 Step,并通过实际示例应用展示了如何创建自动构建镜像的工作流。在操作实践中,读者可以学习到如何创建 build.yaml 文件来定义 GitHub Action 工作流,以及如何配置 Docker Hub Secret 以提供推送镜像的权限。通过触发 GitHub Action Workflow,读者可以了解工作流的运行状态及日志输出,并在 Docker Hub 中查看自动构建并推送的新版本镜像。最终实现效果是,当向 main 分支提交代码时,GitHub 工作流将自动构建镜像,并且每一个 commit id 对应一个镜像版本。文章还提出了思考题,鼓励读者尝试改造 build.yaml,使其同时支持构建不同平台的镜像。整体而言,本文是一篇非常实用的技术文章,适合想要学习 GitOps 工作流中自动化阶段的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • GAC·DU
    老师,您在日常工作中,镜像版本是如何定义的?有特殊的规范吗?

    作者回复: 我们的实践是生产镜像用一个特殊的 prefix 标识,比如 release-v1.0.0,其他的用 commit id 作为 tag。 这里固定的规范,结合 CI 和自动化,选择适合团队的实践就可以了。

    2023-01-13归属地:北京
    6
  • 农民园丁
    跟着老师的教程做了实验,发现生成了2个镜像,分别是linux/amd64和linux/arm64,这是怎么做到的?

    作者回复: 我的课程源码里构建了两个平台的镜像,你可以尝试删除.github/workflows/build.yaml 文件里定义的 platforms 字段,这样就只会构建单个平台的镜像了。

    2023-01-13归属地:内蒙古
    2
  • jeffery
    应该需要这个platforms: linux/amd64,linux/arm64。 官网地址:https://docs.docker.com/build/ci/github-actions/examples/#multi-platform-images 不知道这块... with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} 是不是写错了 with: username: ${{ env.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} name: ci on: push: branches: - "main" jobs: docker: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v3 with: context: . platforms: linux/amd64,linux/arm64 push: true tags: user/app:latest

    作者回复: 回答正确👍🏻 USERNAME 可以从 env 里读取,也可以配置 github secret 读取。 在这个例子中我们是用 env 读的。

    2023-01-13归属地:陕西
    2
  • dva
    老师你好,能详细解释一下这个语句是什么意思吗?双冒号是什么特殊写法? run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"

    作者回复: 在阶段中输出 sha_short 变量,以便在后续阶段可以通过表达式 ${{ steps.vars.outputs.sha_short }} 来获取这个值。 此外,你还可以用这个写法来在阶段中输出值:https://docs.github.com/en/actions/using-jobs/defining-outputs-for-jobs

    2023-02-28归属地:广东
    2
    1
  • gyl1989113
    @v2 @v3是啥意思呢。。插件版本嘛

    作者回复: 是的。

    2023-02-07归属地:四川
  • 怎么读取 默认的环境变量? 使用 ${{env. GITHUB_REPOSITORY}} 读取不到

    作者回复: 可以用 ${{ github.repositoryUrl }} 获取,另外所有可用的内置变量可以在这个文档里查询:https://docs.github.com/en/actions/learn-github-actions/contexts

    2023-01-14归属地:广东
  • 无名无姓
    这个在gitlab上面可以使用么?

    作者回复: Gitlab 自动构建在下一节课会介绍哦。

    2023-01-13归属地:北京
  • GAC·DU
    name: build on: push: branches: - 'main' env: DOCKERHUB_USERNAME: lyzhang1999 jobs: docker: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Set outputs id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ env.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build backend and push uses: docker/build-push-action@v3 with: context: backend platforms: linux/amd64,linux/arm64 push: true tags: ${{ env.DOCKERHUB_USERNAME }}/backend:${{ steps.vars.outputs.sha_short }} - name: Build frontend and push uses: docker/build-push-action@v3 with: context: frontend platforms: linux/amd64,linux/arm64 push: true tags: ${{ env.DOCKERHUB_USERNAME }}/frontend:${{ steps.vars.outputs.sha_short }}

    作者回复: 回答正确,两个镜像都配置了不同的平台👍🏻

    2023-01-13归属地:北京
  • 哈尔
    name: build on: push: branches: - 'main' env: DOCKERHUB_USERNAME: lyzhang1999 jobs: docker: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Set outputs id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" - name: Set up QEMU uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ env.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build backend and push uses: docker/build-push-action@v3 with: context: backend platforms: linux/amd64,linux/arm64 push: true tags: ${{ env.DOCKERHUB_USERNAME }}/backend:${{ steps.vars.outputs.sha_short }} - name: Build frontend and push uses: docker/build-push-action@v3 with: context: frontend platforms: linux/amd64,linux/arm64 push: true tags: ${{ env.DOCKERHUB_USERNAME }}/frontend:${{ steps.vars.outputs.sha_short }}
    2024-03-14归属地:中国香港
  • BertGeek
    github action 自动化就是方便,但构建镜像慢,小项目还好, 大项目,仓库多,维护起来也费劲
    2023-10-17归属地:陕西
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部