作者本人也是刚入坑 Gitea Action,在语法方面,处于一边学习一边实践的状态,对于工作流文件的编写上比较粗糙,欢迎在文章下方进行交流。

一、前情回顾

在上一篇 【Gitea Action 第一篇】上手体验 中,我们成功运行了官方 Gitea Action 示例,主要介绍了基础设施的搭建,本篇将在第一篇的基础上,着重于 Action 步骤文件的编写,实现项目的持续构建。

二、预览

作者主要从事 Java 开发,本文中的持续构建将介绍使用 MavenSpringBoot 工程打包,并使用 Docker 构建镜像,最终推送到私服,流程如下所示:

推送到master或main分支
检出代码
设置 Docker BuildX
登录 Harbor
安装 JDK
安装 Maven
使用 Maven 打包 Jar
Docker 镜像构建并推送 Harbor

环境介绍:

  • centos 7.9 虚拟机

  • Gitea 1.19.3

  • Docker Engine - Community 24.0.2

  • Harbor v2.7.1-6015b3ef(尚未部署 Https)

三、编写 Action 文件

在工程 ./gitea/workflows/ 目录下新建 release.yaml 文件,并编写工作流。

简洁版

简洁版运行条件比较苛刻,需要网络环境顺畅(能流畅访问 Github、docker hub 等服务商),并且要求部署的 Harbor 私服支持 Https 访问,否则最后一个推送镜像步骤将失败。

# 触发条件,只在 master 或 main 分支发送推送时触发
on:
  push:
    branches: [ master, main ]

# 工作流的名称
name: release

# 作业,工作流运行由一个或多个 jobs 组成,默认情况下并行运行
jobs:
  # job ID
  release:
    # 定义要运行作业的计算机类型
    runs-on: ubuntu-latest
    # 指定容器映像,默认使用的是一个基于Node的镜像,没有内置docker
    container: catthehacker/ubuntu:act-latest
    # 作业任务
    steps:
      # 检出代码
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      # 设置 Docker BuildX
      - name: Set up Docker BuildX
        uses: docker/setup-buildx-action@v2.6.0

      # 登录 Harbor
      - name: Login to Harbor
        uses: docker/login-action@v2
        with:
          registry: ${{ secrets.HARBOR_REGISTRY }}
          username: ${{ secrets.HARBOR_USERNAME }}
          password: ${{ secrets.HARBOR_PASSWORD }}

      # 安装 JDK
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          distribution: 'oracle'
          java-version: 17

      # 安装 Maven
      - name: Setup maven
        uses: actions/setup-maven@v4.5
        with:
          maven-version: 3.8.4

      # Maven 打包
      - name: Maven package
        run: mvn clean package

      # 构建并推送 Docker 镜像
      - name: Build and push docker image
        uses: docker/build-push-action@v4
        env:
          ACTIONS_RUNTIME_TOKEN: ''
        with:
          context: .
          push: true
          tags: 192.168.1.44:18123/temp/action-demo:latest
调整版

调整版是基于本地环境做出的调整,可供参考,做了以下几项调整:

  • catthehacker/ubuntu:act-latest 镜像预下载(开梯子下)并重新 tag 发布到私服
  • jobs.steps 中用到的仓库本地化,使用 Gitea 将用到的 GitHub 仓库镜像到本地
  • 配置支持使用 Http 访问 Harbor 私服

修改后,最终内容如下:

# 触发条件
on:
  push:
    branches: [ master, main ]

# 工作流的名称
name: release

# 作业,工作流运行由一个或多个 jobs 组成,默认情况下并行运行
jobs:
  # job ID
  release:
    # 定义要运行作业的计算机类型
    runs-on: ubuntu-latest
    # 从私服 Harbor 上下载指定容器映像
    container: 192.168.1.44:18123/tool/ubuntu:act-latest
    # 作业任务
    steps:
      # 检出代码
      - name: Checkout
      	# 从本地 Gitea 上加载插件仓库
        uses: http://192.168.1.43:3000/actions/checkout@v3
        with:
          fetch-depth: 0

      # 设置 Docker BuildX
      - name: Set up Docker BuildX
        uses: http://192.168.1.43:3000/actions/setup-buildx-action@v2.6.0
        with:
          # 配置支持使用 Http 访问 Harbor 私服 & 添加阿里云镜像代理(下文的镜像代理请修改为你自己的) 
          # 官方说明参考 https://docs.docker.com/build/ci/github-actions/configure-builder/#registry-mirror
          config-inline: |
            [registry."docker.io"]
              mirrors = ["xxxxxxx.mirror.aliyuncs.com"]
            
            [registry."192.168.1.44:18123"]
              http = true
              insecure = true

      # 登录 Harbor
      - name: Login to Harbor
      	# 从本地 Gitea 上加载插件仓库
        uses: http://192.168.1.43:3000/actions/login-action@v2
        # 下面的秘钥配置需加入到 Gitea 组织或仓库配置中
        with:
          registry: ${{ secrets.HARBOR_REGISTRY }}
          username: ${{ secrets.HARBOR_USERNAME }}
          password: ${{ secrets.HARBOR_PASSWORD }}

      # 安装 JDK
      - name: Set up JDK 17
        uses: http://192.168.1.43:3000/actions/setup-java@v3
        with:
          distribution: 'oracle'
          java-version: 17

      # 安装 Maven
      - name: Setup maven
        uses: http://192.168.1.43:3000/actions/setup-maven@v4.5
        with:
          maven-version: 3.8.4

      # Maven 打包
      - name: Maven package
        run: mvn clean package -DskipTests

      # 构建并推送 Docker 镜像
      - name: Build and push docker image
        uses: http://192.168.1.43:3000/actions/build-push-action@v4
        env:
          # 必需有且置空,查看官方文档解释:https://docs.gitea.com/zh-cn/next/usage/actions/comparison?_highlight=build&_highlight=push&_highlight=action#dockerbuild-push-actionv4
          ACTIONS_RUNTIME_TOKEN: ''
        with:
          context: .
          push: true
          tags: 192.168.1.44:18123/temp/action-demo:latest
  • 192.168.1.44:18123 为本地 Harbor 私服访问地址
  • Set up Docker BuildX 步骤中增加了镜像加速代理以及对 192.168.1.44:18123 地址的安全信任
  • Build and push docker image 步骤中手动增加环境变量 ACTIONS_RUNTIME_TOKEN ,且值为空

四、Gitea 添加变量

上文中使用到的 HARBOR_REGISTRYHARBOR_USERNAMEHARBOR_PASSWORD 需要配置到 Gitea 中,否则会报错。已知可配置在组织或者仓库下,配置位置的不同,作用域也不同,本文我选择配置到组织中。

  • HARBOR_REGISTRY:Harbor 访问地址,例:192.168.1.44:18123
  • HARBOR_USERNAME:Harbor 用户名,例:admin
  • HARBOR_PASSWORD :Harbor 密码,例:admin

在这里插入图片描述

五、运行测试

提交并推送代码,观察运行结果。

在这里插入图片描述

六、常见问题 FAQ

Q:如何将 jobs.steps 中用到的仓库本地化?

开个梯子,并为 Gitea 配置代理,然后导入外部镜像仓库,通过 github Url 导入。

Q:如何重新 tag 镜像并发布到私服?

使用 docker 命令,例子如下:

# 192.168.1.44:18123 是我私服地址,temp 是Harbor项目
# 重新tag标记
docker tag catthehacker/ubuntu:act-latest 192.168.1.44:18123/temp/ubuntu:act-latest
# 推送
docker push 192.168.1.44:18123/temp/ubuntu:act-latest
Q:Maven 有私服下载需求以及能否加速?

可以,本文演示的是一个干净的 SpringBoot 工程构建,涉及的依赖不多且都为公共依赖,但也从上图发现运行时间很长。关于如何配置,目前没找到一个优雅的方式,只能通过一些偏方解决,将单独写一遍解决文档,请关注。

七、总结

希望这篇文章对您理解和使用 Gitea Action 提供了一些帮助。如果您对 Gitea Action 有任何疑问或想要讨论更多相关话题,欢迎在下方留言,我们可以互相学习和分享经验。祝您在使用 Gitea Action 进行 CI/CD 工作流时取得成功!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐