利用Github实现CI/CD:从构建镜像到容器自动部署CI篇

973 阅读4分钟

引言

本文转载自本人的个人公众号:代码之外的程序员

在现代软件开发中,持续集成(CI)和持续交付(CD)已经成为提高开发效率和代码质量的关键实践。本文将介绍什么是CI/CD,以及如何利用Github Action 通过CI/CD把我们的应用从代码库中自动集成到K8S上。主要涉及如下知识点:

  1. CI/CD介绍。
  2. Github Action介绍和使用。
  3. 利用GitHub Action制作镜像,并推送到Github Packages上。
  4. 配置K8S集群,对外提供控制服务,让Github Action 把镜像部署到K8S上。
  5. 彻底解决国内集群访问国外镜像服务的限速问题,把镜像推送到国内云商仓库中(华为云为例)。

每个知识点都相对独立,大家可以按需阅读。

1. 什么是CI/CD

持续集成(Continuous Integration,CI)是一种软件开发实践。简单来说,就是日常开发的时候,我们通过了Merge Request后,自动触发的一个构建流水线,一般会有如下步骤:

  • 启动自动化测试
  • 编译和构建出对应的产物
  • 把构建产物托管到指定的平台上,如:maven,镜像仓库等

持续交付(Continuous Delivery,CD)是在 CI 的基础上进一步扩展,确保代码在任何时间点都可以安全地发布到生产环境。其主要目的是缩短开发周期,提高软件质量和交付速度。一般会有如下步骤:

  • 登录到目标容器
  • 触发目标容器启动部署任务
  • 目标容器自动拉取CI生成的镜像进行部署。

2. Github Action是什么?

Github Actions 是 Github 提供的一种 CI/CD 工具,它允许开发者在代码库中创建工作流,自动化构建、测试和部署任务。通过定义简单的 YAML 文件,开发者可以轻松地配置并运行各种自动化任务。大大降低了CI/CD的使用门槛。

3. Github Action使用

在介绍前,先看看了解下完整的CI/CD流程。

Untitled.svg

  • 这里有个地方需要注意,大部分需要部署到服务器的项目中,CD流程是不会把构建产物直接推送到目标容器中的。一般来说,CI会把构建产物推送到镜像仓库(Maven)中,然后CD触发时,会触发容器从镜像仓库中拉取我们CI构建的镜像,再进行部署。

3.1. 在对应的仓库中配置Github Action Secret

在使用前,需要先对Github Action进行配置,步骤如下:

  • 登录Github进入账号设置页
  • 拉到底部点击Developer settings
  • 展开Personal access tokens

Untitled1.png

  • 点击tokens

Untitled2.png

  • 点击Generate new token(classic)创建token Scopes勾选参考下图

Untitled4.png

创建成功后,看到新创建的密钥,这里要注意的是,密钥只会在创建的时候能看到,后面就无法再次查询,需要注意保存。如下图:

Untitled6.png

  • 打开需要使用Github Action仓库的Setting页面 点击Secrets and variables下面的Actions选项,然后把刚刚生成的token拷贝进去, 单机Ad secret即可。

Untitled7.png

到这里我们已经配置好我们的环境了。

3.2. 使用Github Action 触发CI流程

3.2.1. 创建dockerfile

FROM openjdk:17-jdk-slim

COPY /build/libs/HelloGithubAction-1.0-SNAPSHOT.jar /hello-github-action.jar

EXPOSE 8080

CMD ["java", "-jar", "/hello-github-action.jar"]

3.2.2. 创建deploy.yml文件

打开你的项目,在根目录下创建文件.github/workflows/deploy.yml文件。

name: CI/CD for hello-github-action
on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build_and_deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          java-version: '17'
          distribution: 'adopt'

      - name: Build with Gradle
        run: |
          ./gradlew build

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to Github Container Register
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
        # password 这里的HELLO_GITHUB_ACTION_SECRET需要改成你刚刚创建的secret key
          password: ${{ secrets.HELLO_GITHUB_ACTION_SECRET }}
      - name: Build and push Docker image
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository}}:latest
          platforms: linux/amd64,linux/arm64

3.3.3. 触发CI流程

保存代码后,直接push到main分支就会自动触发Github Action的构建了。如下图:

Untitled8.png

构建完成后,我们可以在Github package仓库中找到我们刚刚推送的镜像。在仓库中,点击右下角的packages项。

Untitled10.png

查看你的镜像

  • ps: 如果刚点进去没看到有镜像的话,可以点击下Clear current search query, filters, and sorts项,清空筛选条件就会出来了,这可能是Github的一个BUG,

4. 小结

到这里,我们就学会使用了Github Action中的CI流程了。限于篇幅Github CD流程会在下一篇文章中介绍,敬请期待~