夜猫的小站

gitea action 的配置实践

Published on
阅读时间:6分钟1005

前言

本文主要是关于gite action的一些使用和配置记录。我的博客改动以后基于gitea action构建镜像,再使用docker compose 部署新的服务。

一、背景

原本博客使用k3sargocd部署,经历一年的运行后,出现网络崩溃的情况。由于我的技术比较菜,花了一个月才把原本的服务全都部署回去。经过深思熟虑,决定还是使用最简单一点方式进行部署。我决定基于gitea action构建镜像,在使用docker compose 部署新的服务。

二、使用gitea action步骤

gitea 只是一个仓库,提供构建功能的是另外的容器,叫做gitea runner

1.设置runner 配置文件config.yaml

https://docs.gitea.com/zh-cn/usage/actions/act-runner 这个也是在官方文档上有的,当然如果你和我一样使用docker compose部署的话,可以参考我的写法。

首先使用act_runner生成config.yaml(这个如果是用docker的话,要用docker镜像内的生成)。如以下配置。

config.yaml
log:
  level: info
runner:
  file: .runner
  capacity: 1
  envs:
    A_TEST_ENV_NAME_1: a_test_env_value_1
    A_TEST_ENV_NAME_2: a_test_env_value_2
  env_file: .env
  timeout: 3h
  shutdown_timeout: 0s
  insecure: false
  fetch_timeout: 5s
  fetch_interval: 2s
  labels:
    - "ubuntu-latest:docker://gitea/runner-images:ubuntu-latest"
    - "ubuntu-22.04:docker://gitea/runner-images:ubuntu-22.04"
    - "ubuntu-20.04:docker://gitea/runner-images:ubuntu-20.04"

# 开启构建镜像的缓存设置
cache:
  enabled: true
  dir: ""
  # 这里很重要 这个对应的是本机ip,比如我的docker所在的本机ip是192.xxx.xxx.xxx
  host: "192.xxx.xxx.xxx"
  # 本机端口
  port: 18088
  external_server: ""

container:
  network: ""
  privileged: false
  options:
  workdir_parent:
  valid_volumes: []
  docker_host: ""
  force_pull: true
  force_rebuild: false

host:
  workdir_parent:

2.使用运行gitea-runner

docker-compose.yaml 如下,其中GITEA_RUNNER_REGISTRATION_TOKEN 在目标gitea的管理后台-Actions-Runners中,只要创建Runner就会分配一个。

docker-compose.yml
services:
  runner:
    image: gitea/act_runner:nightly
    environment:
      CONFIG_FILE: /config.yaml
      GITEA_INSTANCE_URL: "https://gitea.xxx.cc"
      GITEA_RUNNER_REGISTRATION_TOKEN: "token"
      GITEA_RUNNER_NAME: "nas-runner"
      GITEA_RUNNER_LABELS: "nas-worker-runner"
    volumes:
      - ./config.yaml:/config.yaml
      - /root/app/gitea-runner/act_cache:/root/.cache 
      - /root/app/gitea-runner/data:/data
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped
    ports:
      - "18088:8088"

官方例子中其实没有将ports导出,这里加上其实是为了让缓存生效,这里的端口其实就是runner的端口。

# 开启构建镜像的缓存设置
cache:
  enabled: true
  dir: ""
  # 这里很重要 这个对应的是本机ip,比如我的docker所在的本机ip是192.xxx.xxx.xxx
  host: "192.xxx.xxx.xxx"
  # runner端口
  port: 18088
  external_server: ""

运行runner以后,如果联通成功,在管理后台-Actions-Runners上就能看到运行的runner。

3.设置gitea仓库

首先需要再gitea 仓库中,在设置页上将项目的action开启。

4.git项目配置

官方例子文档: https://docs.gitea.com/zh-cn/usage/actions/quickstart?_highlight=gitea&_highlight=event_name#%E4%BD%BF%E7%94%A8actions

新建一个.yaml为后缀的文件,放在.gitea/workflows/目录中。 比如我的博客中是build-docker.yaml 这里例子的作用是在项目打下tag的时候,会触发构建镜像的逻辑,并获取tag版本,构建对应tag的镜像。

build-docker.yaml
name: Build Docker Image
run-name: ${{ gitea.actor }} build Docker Image
on:
  push:
    tags:
      - '*'

jobs:
  Build-Docker-Image:
    runs-on: ubuntu-latest
    steps:
      # 打印触发信息
      - name: Print trigger information
        run: |
          echo "🎉 Triggered by a ${{ gitea.event_name }} event."
          echo "🐧 Running on a ${{ runner.os }} server."
          echo "🔎 Branch ${{ gitea.ref }}, Repository ${{ gitea.repository }}."

      # 检出代码
      - name: Check out repository code
        uses: actions/checkout@v4

      # 设置 Docker 缓存
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      # 我用的docker register,所以不需要登录到docker hub
      # - name: Log in to Docker Hub
      #   uses: docker/login-action@v2
      #   with:
      #     username: ${{ secrets.DOCKER_USERNAME }}
      #     password: ${{ secrets.DOCKER_PASSWORD }}

      # 构建 Docker 镜像
      - name: Build Docker image
        run: |
          docker build -t 192.168.54.232:5134/remix-blog:latest .

      # 标记 Docker 镜像
      - name: Tag Docker image
        run: |
          docker tag 192.168.54.232:5134/remix-blog:latest 192.168.54.232:5134/remix-blog:${{ gitea.ref_name }}

      # 推送 Docker 镜像
      - name: Push Docker image
        run: |
          docker push 192.168.54.232:5134/remix-blog:latest
          docker push 192.168.54.232:5134/remix-blog:${{ gitea.ref_name }}

      # 清理本地环境
      - name: Clean up Docker environment
        run: |
          docker rmi 192.168.54.232:5134/remix-blog:latest
          docker rmi 192.168.54.232:5134/remix-blog:${{ gitea.ref_name }}

按照上面的例子就可以在仓库推送以后触发构建了

注意

runner每次构建都需要拉取ubuntu-latest,这个镜像还挺大的,由于网络的原因,经常会卡在拉取镜像的部分,所以最好让runner 处在能自由拉取镜像的环境。只要成功一次以后,那么之后的镜像都会从缓存中获取。