前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用GitHub Actions制作Docker镜像

用GitHub Actions制作Docker镜像

原创
作者头像
程序员欣宸
修改2021-10-15 10:26:57
2.3K0
修改2021-10-15 10:26:57
举报
文章被收录于专栏:实战docker

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

关于GitHub Actions

  • GitHub Actions 是 GitHub 的持续集成服务,执行持续集成所需的计算机资源是GitHub免费提供的,对一个Java程序员来说,他只要专心写代码然后提交到GitHub,提交后**自动触发**云端编译构建这个代码仓库,并生成各种持续集成结果,基本流程如下图:
在这里插入图片描述
在这里插入图片描述
  • 众所周知,欣宸是个穷人,买不起好的电脑更租不起服务器,于是将本地java代码做成docker镜像的过程中会因为穷遇到各种问题,例如下载jar包慢、编译构建慢、上传docker镜像慢都是常态,如今有了GitHub Actions,效率提升了一大截,下图是一次云端构建的时间统计:
在这里插入图片描述
在这里插入图片描述
  • 不提那些伤心事了,穷很难改变,**习惯了就好**,但是GitHub Actions还是要掌握的...
  • 本篇文章由以下章节顺序组成:
  • 介绍用于制作镜像的java项目
  • 说明如何编写GitHub Actions的脚本文件
  • 在GitHub上执行GitHub Actions
  • 验证结果,看镜像是否构建成功,能不能正常使用

前提

为了确保GitHub上的项目可以顺利制作成镜像并推送到hub.docker.com,您需要做好以下准备:

  1. 可用的GitHub帐号;
  2. 可用的hub.docker.com帐号,也可以用其他镜像仓库如阿里云;

关于java项目

  • 用于本次实战的项目,是个典型的父子结构的gradle工程,有一个模块是springboot工程,咱们今天要做的就是将此工程编译构建制作成docker镜像;
  • 这个java工程的详细内容请参考《SpringBoot(2.4)应用制作Docker镜像(Gradle版官方方案)》,这里不再赘述,只挑出几个关键地方说一下;
  • 如下图,demowebapp是个springboot应用,内部已经准备好了Dockerfile文件,只要用此文件即可将编译结果做成docker镜像:
在这里插入图片描述
在这里插入图片描述
  • demowebapp项目内部有个controller类,提供web接口,用于验证功能是否正常;

设置环境变量

  • 在推送镜像到hub.docker.com时,需要用到该网站的帐号和密码,这些信息自然不能写在GithHub仓库的代码中,如下图,在页面上按照下面红框的顺序新增两个secret类型的环境变量,稍后在GitHub Actions脚本中用变量名就能使用具体的帐号和密码了:
在这里插入图片描述
在这里插入图片描述

编写GitHub Actions脚本

  • 这里我选择了在线编辑GitHub Actions脚本(您也可以在本地编辑后提交推送到GitHub),如下图红框,在Github项目页面上点击Actions
在这里插入图片描述
在这里插入图片描述
  • 如果该项目未曾添加过Actions脚本,您会看到一些脚本模板的推荐,如下图,选择红框中的Gradle模板:
在这里插入图片描述
在这里插入图片描述
  • 如下图,此时出现在线编辑脚本的页面,可见GitHub已在线生成了一些脚本:
在这里插入图片描述
在这里插入图片描述
  • 将脚本内容替换为以下内容,已添加了详细的注释,就不多赘述了,唯一要提醒的是镜像的TAG等于每次GitHub提交的commid:
代码语言:txt
复制
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: 构建docker镜像

on:
  # main分支的push操作会触发当前脚本的执行
  push:
    branches: [ main ]
  # main分支的pr操作会触发当前脚本的执行
  pull_request:
    branches: [ main ]

jobs:
  build:
    # 当前脚本是在容器中运行的,对应的镜像是ubuntu-latest
    runs-on: ubuntu-latest

    steps:
    # 下载源码
    - uses: actions/checkout@v2
    - name: Set up JDK 1.8
      # 设置jdk环境
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Dump GitHub context
      env:
        GITHUB_CONTEXT: ${{ toJSON(github) }}
      # 将GTIHUB的信息都打印出来,后面的脚本可以使用这些信息,例如后面的镜像TAG用的就是这里面的commitid
      run: echo "Hello ${{ github.event.commits[0].id }}"
    - name: Grant execute permission for gradlew
      # 给gradlew可执行权限
      run: chmod +x gradlew
    - name: Build with Gradle
      # 执行build命令
      run: ./gradlew build
    - name: Extract files from jar
      # 从构建好的jar中提取制作镜像所需的内容,例如依赖jar、class、配置文件等
      run: mkdir -p demowebapp/build/dependency && (cd demowebapp/build/dependency; jar -xf ../libs/*.jar)
    - name: Login docker hub
      env:
        DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}
        DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
      # 指定login命令登录hub.docker.com,帐号和密码已经在GitHub网页中配置好了
      run: |
        echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin
    - name: Set up Docker Buildx
      # 使用buildx来构建镜像,这个工具功能很丰富
      uses: crazy-max/ghaction-docker-buildx@v1
      with:
        buildx-version: latest
    - name: Build dockerfile (with push)
      # 构建镜像,用buildx可以同时构建X86和ARM架构的镜像,然后推送到hub.docker.com
      run: |
        cd demowebapp && \
        fullCommit="${{ github.event.commits[0].id }}" && \
        docker buildx build \
        --platform=linux/amd64,linux/arm/v7,linux/arm64 \
        --output "type=image,push=true" \
        --file ./Dockerfile . \
        --tag bolingcavalry/demowebapp-docker:"${fullCommit: 0: 7}"
  • 脚本写完后点击右上角的Start commit按钮,将脚本提交到GitHub上,此时页面上会提示正在构建:
在这里插入图片描述
在这里插入图片描述
  • 点击上图红框,可以看到执行状态,如下图:
在这里插入图片描述
在这里插入图片描述
  • 点击上图红框中的build,可以看到咱们写的actions脚本的执行详情,如下图:
在这里插入图片描述
在这里插入图片描述
  • 正常情况下actions脚本可以执行成功,记下这次提交的id是ae465b4,登录hub.docker.com网站,可以见到新增的docker镜像已经就绪,tag就是ae465b4
在这里插入图片描述
在这里插入图片描述

Actions操作何时被触发?

前面咱们编写Actions脚本会触发构建操作,实际上您对这个仓库的任何内容的改动提交都会触发Actions脚本被执行,也就是说,之后您修改这个Java项目的代码后,只要一提交,hub.docker.com中就会有最新的镜像产生;

验证

  • 接下来验证一下刚才构建的镜像是否可用
  • 首先,掏出我最值钱的家当:树莓派3B(可想而知,欣宸有多么贫穷):
在这里插入图片描述
在这里插入图片描述
  • 树莓派中有ARM架构的64位Linux操作系统,已经装好了docker,ssh登录后,执行以下命令拉取刚才建好的镜像:
代码语言:txt
复制
docker pull bolingcavalry/demowebapp-docker:ae465b4
  • 下载完毕后创建容器:
代码语言:txt
复制
docker run --rm -p 8080:8080 bolingcavalry/demowebapp-docker:docker:ae465b4
  • 控制台可见启动成功:
在这里插入图片描述
在这里插入图片描述
  • 用浏览器访问,我这里树莓派的IP地址是192.168.50.150,因此URL是http://192.168.50.150:8080/hello,如下图,响应成功,镜像可以正常使用:
在这里插入图片描述
在这里插入图片描述
  • 至此,用GitHub Actions制作Docker镜像的操作就全部完成了,希望能给您带来参考,大家一起体验白嫖微软服务器的快乐,才是真的快乐;

关于容器和镜像的环境

如果您不想自己搭建kubernetes环境,推荐使用腾讯云容器服务TKE:无需自建,即可在腾讯云上使用稳定, 安全,高效,灵活扩展的 Kubernetes 容器平台;

如果您希望自己的镜像可以通过外网上传和下载,推荐腾讯云容器镜像服务TCR:像数据加密存储,大镜像多节点快速分发,跨地域镜像同步

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢迎关注公众号:程序员欣宸

微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 欢迎访问我的GitHub
  • 关于GitHub Actions
  • 前提
  • 关于java项目
  • 设置环境变量
  • 编写GitHub Actions脚本
  • Actions操作何时被触发?
  • 验证
  • 关于容器和镜像的环境
  • 你不孤单,欣宸原创一路相伴
  • 欢迎关注公众号:程序员欣宸
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档