首页 > 其他分享 >最佳实践-使用Github Actions来构建跨平台容器镜像

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

时间:2023-11-15 12:57:09浏览次数:35  
标签:Github frontend 创建 Actions nginx 跨平台 构建 镜像

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

前言

最近在写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,frontend,创建,Actions,nginx,跨平台,构建,镜像
From: https://www.cnblogs.com/waldron/p/17833569.html

相关文章

  • 如果我有一个项目,我git如何恢复到3个月前的日志,然后再强推到github项目上,但是项目的
       要将Git项目恢复到3个月前的状态,并将最新内容强制推送到GitHub项目上,可以按照以下步骤进行操作:首先,获取项目的提交历史。使用以下命令查看所有的提交记录:bashCopyCodegitlog复制你想要恢复到的目标提交的commithash(提交哈希值)。切换到一个全新的分支......
  • GitHub Universe 2023:AI 技术引领软件开发创新浪潮
    GitHub是全球领先的软件开发和协作平台,数百万开发者和企业在此分享、学习和创建卓越的软件。同时GitHub处在AI技术前沿,通过其先进的AI技术增强开发者体验并赋能未来软件开发的使命。在今天的文章中,我们将一起看看在GitHub年度大会上都有哪些更新。 GitHub2023九大更......
  • 如何快速访问GitHub
    原理计算机在访问远程网站时,输入的是诸如baidu.com的域名,但实际访问的是IP地址,这就需要一个解析器将域名解析为IP地址。计算机的策略如下:寻找本机的hosts文件,根据里面的映射规则进行映射。如果1找不到,那么就请求最近的DNS解析器(全球官方提供),从而获取网站的IP地址。我们访问G......
  • git、github、gitee、gitlab的区别
    git是一种版本控制系统,是一个命令,是一种工具。github是一个基于git实现在线代码托管的仓库,向互联网开放,企业版要收钱。gitlab类似github,一般用于在企业内搭建git私服,要自己搭环境。gitee即码云,是oschina免费给企业用的,不用自己搭建环境。git-ce是社区版,gitlab-ee是企......
  • 2023 年度 10 月份 GitHubJava 项目排行榜 Top 10
    1.mall项目地址:https://github.com/macrozheng/mallmall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心......
  • Programming abstractions in C阅读笔记:p184-p195
    《ProgrammingAbstractionsInC》学习第61天,p184-p195总结。一、技术总结1.mutualrecursion2.naturalnumber(1)定义p184,Ifyoulimitthedomainofpossiblevaluestothesetofnaturalnumbers,whicharedefinedsimplyasthesetofnonnegativeintegers.3.最大公约......
  • Programming Abstractions in C阅读笔记:p196
    《ProgrammingAbstractionsinC》学习第63天,p196总结。涉及到编程之外的知识,依然是读起来很费劲,需要了解作者在书中提到的人物(EdouardLucas)、地点(Benares)、神话传说(Brahma)等等。虽然深知自己做不到对人文知识,历史知识精通,但也希望能记住,从而在下次遇到的时候能够阅读下去......
  • 使用 npm config set script-shell 实现跨平台的脚本执行需求
    npmconfigsetscript-shellC:\\app\\Git20180223\\bin\\bash.exe这个命令的准确含义是设置npm的脚本(shell)执行环境为"C:\app\Git20180223\bin\bash.exe"。这个命令用于修改npm的配置,具体来说,它修改了npm的一个配置项,该配置项用于指定在执行npm脚本时使用的shell程序。在这个......
  • IDEA中github的remote不见了怎么办?
    情况是:本来已经和github建立连接了,并且也上传了一些数据。然后我有在其他文件加拉了一下分支代码,结果该文件夹下的和remote的仓库记录消失了。 记录一下。......
  • CodeDesk-一个新款跨平台桌面开发框架
     CodeDesk的灵感来自Electron和Photino。这是一个基于.NET的开源项目。CodeDesk的目标是使开发人员能够在跨平台的本机应用程序中使用WebUI(HTML、JavaScript、CSS等)无论是Html,Blazor,Vue,React还是Angular等前端框架,都可以与CodeDesk一起使用,而不是学习特定于平台的......