Github Actions CI 实践

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

一、前言

上节中,我们使用 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 <[email protected]>
# 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/[email protected]
        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/[email protected]
        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 测试环境,部署已创建镜像,对外提供服务。

猜你喜欢

转载自juejin.im/post/7052889711618031624