公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。

前言

最近在写K8s的相关系列文章,因为有涉及到镜像构建,发现在Mac m1的Arm架构下构建的部分镜像,没法在X86架构下使用,不兼容。

尝试网上介绍的各种方式,都已失败告终,效果如下:

最终还是GithubActions拯救了我,下面介绍一下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

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

Dockerfile

from nginx
copy ./dist /frontend
run chown nginx.nginx /frontend -R
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,选择其他也行,最终改成以下下文件

#workflow名称
name: ci
# 触发条件
on:
#github页面手动触发
workflow_dispatch:
#打tag触发,必须是v开头的
push:
tags:
- "v*.*"
#变量配置
env:
#镜像名称
IMAGE_NAME: frontend
#dockerHub仓库名称
DOCKER_REGISTRY: dweizhao
jobs:
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功能很强大,如果感兴趣可以继续去研究。

最佳实践-使用Github Actions来构建跨平台容器镜像的更多相关文章

  1. 云原生之旅 - 12)使用 Kaniko 在 Kubernetes上构建 Docker 容器镜像

    前言 前一篇文章[云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents]有讲到在 Kubernetes Pod (Jenkins build agent ...

  2. 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)

    我们已经学会构建自己的镜像了.接下来的问题是如何在多个 Docker Host 上使用镜像. 这里有几种可用的方法: 用相同的 Dockerfile 在其他 host 构建镜像. 将镜像上传到公共 R ...

  3. Jenkins + Github持续集成构建Docker容器,维基百科&人工自能(AI)模块

    本文分两部分,第一部分是手动计划任务的方式构建Github上的Docker程序,第二部分是用Github webhook Trigger一个自动构建任务. Jenkins采用2.5版本Docker采用 ...

  4. 运行容器的最佳实践 - 每天5分钟玩转 Docker 容器技术(24)

    按用途容器大致可分为两类:服务类容器和工具类的容器. 1. 服务类容器以 daemon 的形式运行,对外提供服务.比如 web server,数据库等.通过 -d 以后台方式启动这类容器是非常合适的. ...

  5. 验证Kubernetes YAML的最佳实践和策略

    本文来自Rancher Labs Kubernetes工作负载最常见的定义是YAML格式的文件.使用YAML所面临的挑战之一是,它相当难以表达manifest文件之间的约束或关系. 如果你想检查所有部 ...

  6. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器

    最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...

  7. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

  8. 生产环境容器落地最佳实践 --JFrog 内部K8s落地旅程

    引言 Kubernetes已经成为市场上事实上领先的编配工具,不仅对技术公司如此,对所有公司都是如此,因为它允许您快速且可预测地部署应用程序.动态地伸缩应用程序.无缝地推出新特性,同时有效地利用硬件资 ...

  9. 使用DataStax Java驱动程序的最佳实践

    引言 如果您想开始建立自己的基于Cassandra的Java程序,欢迎! 也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的 ...

  10. Kubernetes 服务部署最佳实践(一) ——如何更好地设置 Request 与 Limit

    如何为容器配置 Request 与 Limit? 这是一个即常见又棘手的问题,这个根据服务类型,需求与场景的不同而不同,没有固定的答案,这里结合生产经验总结了一些最佳实践,可以作为参考. 所有容器都应 ...

随机推荐

  1. os模块常用操作

    作者:Simon0903 链接:https://www.jianshu.com/u/2b4bc3b5e6fc 來源:简书 os.getcwd() #返回当前工作目录 os.chdir(path) #改 ...

  2. 桌面应用打包:pyinstaller

    1 背景 在使用python开发一些小工具时,如果其他人电脑中没有python环境或者没有安装相应的第三方库,是没办法运行的,而要求对方安装又不现实,尤其是对方不是技术人员,因此如何将一个独立的pyt ...

  3. Unity 编辑器资源导入处理函数 OnPreprocessTexture:深入解析与实用案例

    Unity 编辑器资源导入处理函数 OnPreprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中,我们可以使用编辑器资源导入处理函数(OnPreprocessTexture ...

  4. 代替forever下一个部署node的持久化工具---pm2

    最近有个后端项目,用的是node,在持久化的时候会挂掉,详细了解到用的是nohup,然后先详细了解了一下nohup nohup是一个Linux命令,用于在系统后台不挂断地运行命令,退出终端不会影响程序 ...

  5. PHP写一个 Api接口需要注意哪些?考虑哪些?

    随着互联网的飞速发展,前后端分离的开发模式越来越流行.编写一个稳定.可靠和易于使用的 API 接口是现代互联网应用程序的关键.本文将介绍在使用 thinkphp6 框架开发 API 接口时需要注意的要 ...

  6. 《Python魔法大冒险》008 石像怪的挑战:运算符之旅

    小鱼和魔法师继续深入魔法森林.不久,他们来到了一个巨大的魔法石圈旁边.石圈中心有一个闪闪发光的魔法水晶,周围则是一些神秘的符号.但令人意外的是,水晶的旁边还有一个巨大的石像怪,它的眼睛散发着红色的光芒 ...

  7. ssm框架的事物控制

    事物控制统一在逻辑层的实现类中以注解的形式添加,例如:对UserServiceImpl中的addUser方法需要进行事物控制,操作如下: 1.此方法必须为public2.在方法名上边加入@Transa ...

  8. Solution -「九省联考 2018」IIIDX

    Description Link. 给出一个堆,然后让你填数进去,使得其满足小根堆的性质,并使编号靠前的点的数最大. Solution 考虑贪心,把原数列降序排序,然后因为这个东西是整除分块的形式,所 ...

  9. 洛谷P2433 小学数学 N 合一

    写完了这道题结果脑子断电把浏览器关了......打开一看 没保存 寄 传送门:[深基1-2]小学数学 N 合一 - 洛谷 第一题 第二题 第三题 这几道题没啥好说的,直接输出就彳亍了 cout < ...

  10. Chiplet解决芯片技术发展瓶颈

    这是IC男奋斗史的第38篇原创 本文1776字,预计阅读4分钟. Chiplet封装是什么 介绍Chiplet前,先说下SOC.Chiplet和SOC是两个相互对立的概念,刚好可以用来互为参照. SO ...