Github Actions CI 实践

1,261 阅读3分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

一、前言

上节中,我们使用 Spring Boot 搭建了简单的 Web 应用,本节中我们将代码上传至 Github,并利用 Github Actions 快速完成自动化打包上传镜像的功能。

二、制作 Dockerfile 文件构建镜像

Dockerfile 是一个用来构建镜像的文本文件

我们在上一节项目的根目录下创建一个 Dockerfile 文件

image.png

Dockerfile 文件中我们定义了基础镜像的版本,以及如何运行 Jar 包,开放那个端口等信息,此处只是简单实例,还有很多可自动以的配置项

# Docker image for springboot file run
# VERSION 0.0.1
# Author: sdp
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER sdp <xxx@xxx.com>
# VOLUME 指定了临时文件目录为/tmp。
# 效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为common-mail-service.jar
ADD target/common-mail-service-0.0.1-SNAPSHOT.jar /common-mail-service.jar
# 运行jar包
RUN bash -c 'touch /common-mail-service.jar'
ENV TZ 'Asia/Shanghai'
EXPOSE 8089
ENTRYPOINT ["java","-jar","/common-mail-service.jar"]

三、上传代码

熟悉了解 Git 的盆友,可以直接跳过该步骤

1. 创建代码仓库并获取代码仓库地址

特殊说明: 下图中三项内容,如果本地项目已存在,创建 Repo 时就先不要勾选,避免出现项目文件冲突的情况出现

image.png

2. 上传代码

完整步骤 FYI :
echo "# mail-service" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com/xxx/mail-service.git
git push -u origin master

四、获取 DockerHub 镜像仓库配置

docker hub 官网地址

因为我们使用 Github Actions 来自动化的将项目代码打成镜像,并上传到镜像仓库中。所以我们需要准备一个镜像仓库,本文中注册账户并开通了一个开放的 DockerHub 镜像仓库存放镜像。本文中以公有的 DockerHub 镜像仓库为例,如已有私库或阿里云等云平台的镜像仓库,也可直接使用。

1. 创建镜像仓库

创建自定义的镜像仓库

image.png

2. 设置 access_token

自动化推送镜像需要账户和 access_token 信息,可以在 Accout Settings->Security 中新建一个 access_token 作为凭据。

image.png

提醒:access_token 创建后,弹窗中会显示并有复制按钮,请务必将 access_token 复制保存下来,这个界面关闭后就无法看到 access_token

五、配置 Github Actions

下面开启 Github Actions 功能,编写工作流自定义配置文件

1. 开启 Github Acitons 功能,如下图:

image.png

image.png

2. 创建 Github Acitons 所需的密钥参数

推送镜像到 DockerHub 镜像仓库,需要用到上面创建的 DockerHub 账户和 access_token 凭证。在 Settings->SecretsNew repository secret 创建所需密钥键值对。

  • DOCKER_HUB_USER 值为 DockerHub 账户

  • DOCKER_HUB_TOKEN 值上步骤中 DockerHub 下创建的 access_token 凭证

image.png

image.png

完成上述步骤,下一步我们开始定义 CI 文件

3. 创建 docker_push.yml 自定义CI流程

name: Build and Publish Docker Image

# refer to https://github.com/actions/starter-workflows/blob/main/ci/docker-push.yml 

on:
  # push 时触发,分支为 master
  push:
    branches:
      - master

env:
  # Use docker.io for Docker Hub if empty
  REGISTRY: docker.io
  # <repo>
  IMAGE_NAME: candy-common-mail-service


jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
        
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Cache Maven packages
        uses: actions/cache@v2.1.4
        with:
          path: ~/.m2
          key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-m2
    
      # 编译打包      
      - name: Build with Maven
        run: mvn package -Dmaven.test.skip=true
      
      # Login against a Docker registry except on PR
      # https://github.com/docker/login-action
      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.DOCKER_HUB_USER }}
          password: ${{ secrets.DOCKER_HUB_TOKEN }}

      # Extract metadata (tags, labels) for Docker
      # https://github.com/docker/metadata-action
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v3
        with:
          images: ${{ env.REGISTRY }}/${{ secrets.DOCKER_HUB_USER }}/${{ env.IMAGE_NAME }}

      - name: Get Time
        id: time
        uses: nanzm/get-time-action@v1.1
        with:
          timeZone: 8
          format: 'YYYY-MM-DD-HH-mm-ss'

      # Build and push Docker image with Buildx (don't push on PR)
      # https://github.com/docker/build-push-action
      - name: Build and push Docker image
        uses: docker/build-push-action@v2
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}-${{ steps.time.outputs.time }}
          labels: ${{ steps.meta.outputs.labels }}

4. 完成上述步骤,点击 Actions 可以看到已经触发的工作流

image.png

image.png

5. DockerHub 镜像仓库上检查镜像

看到已经成功上传了新的镜像 ~~~ ✿✿ヽ(°▽°)ノ✿

image.png

小结

本节我们创建了镜像文件 Dockerfile,在 Github 上配置了 Github Actions 功能,在推送代码的同时自动化的打包镜像,上传至 DockerHub 镜像仓库中。

下节预告

本节我们已经成功打包了镜像,下一步我们会在本地配置一个 K8S 测试环境,部署已创建镜像,对外提供服务。