使用 GitHub Actions 构建 CI/CD 流水线
初入公司的时候,所经历项目用的 CI/CD 的工具都是 Jenkins。后来慢慢的,发现用 GitHub Actions 实现 CI/CD 的项目越来越多了。
一直对这个东西有点好奇,但也没系统的研究它的应用。巧在,现有项目上有机会让自己从头配置 CI/CD,也就掀开了我对 GitHub Actions 的“神秘面纱”。
仅以此博客分享如何使用 GitHub Actions 构建 CI/CD 流水线以及遇到过的坑和解决办法 。
GitHub Actions 的简单介绍
GitHub Actions 是 GitHub 的自动化平台,它支持各种语言和框架。通过编写 YAML 文件, 用户可以定义在代码库中发生特定事件(比如:Push、Tag等) 时所触发的工作流程,从而帮助用户实现自动化的 CI/CD。
添加 Runner 主机
Runner 主机是执行 GitHub Actions 的核心。为了运行工作流程,我们需要在 Runner 主机。
GitHub Actions 提供了两种类型的 Runner:
托管 Runner:GitHub 提供的 Runner,无需自己维护。
自托管 Runner:在自己的服务器上运行的 Runner,可以根据需要进行定制。
因为自托管 Runner 允许用户在自己的服务器上运行工作流程,提供更多的灵活性和控制。因此我们选择自托管 Runner。
配置 Runner
进入GitHub 仓库的 Settings --> Actions --> Runners --> 点击【New self-hosted-runner】
在该页面,即可看到 Runner 配置流程以及Token, 以 Linux 为例:
$ mkdir actions-runner && cd actions-runner
$ curl -o actions-runner-linux-x64-2.317.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gzCopied!
$ tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz
$ ./config.sh --url https://github.com/your-repo --token YOUR_TOKEN
注意:
这里需要根据系统类型,下载不同的安装包(始终记得在 Linux 系统里下载了 Macos runner,死活跑不起来,排查了半天原因)
在 Config Token 这一步配置最好为当前 Runner 添加额外的 Lables(而不是默认生成),以便于后续存在多个 Runner 时更好区分
运行单个 Runner
如果只有一个 Runner 需要执行,运行如下命令即可:
$ ./run.sh
批量运行多个 Runner
由于项目上一般会存在多个仓库,每个仓库都需要 CI/CD 流水线,因此我们需要在服务器上运行多个 Runner。
为了更好管理,采用 docker-compose 的方式来批量化运行多个 Runner
添加文件夹
mkdir actions-runner && cd actions-runner
在actions-runner/runners 下按照上述步骤为每个仓库添加的 Runner 主机, eg: actions-runner/runners/service-name1、actions-runner/runners/service-name2
$ mkdir runners && cd runners
基于 Action Runner 的基础镜像配置 dockerfile
FROM mattermost/actions-runner:2.313.0-0
# 设置工作目录
WORKDIR /home
USER runner
# 复制应用程序代码到容器中
COPY --chown=runner:runner ./runners /home
RUN sudo chown -R runner:runner /home
ENV PATH="/home/runner/.local/bin:$PATH"
# 定义容器启动时要执行的命令
CMD ["./start-runners.sh"]
基于 dockerfile 构建一个 action-runner 的镜像
docker build -t action-runners .
检查镜像构建成功
docker images | grep action-runners
配置 docker-compose 文件
version: "3"
services:
test_runner1:
image: action-runners
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: ./service-name1/run.sh
test_runner2:
image: action-runners
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: ./service-name2/run.sh
运行 docker-compose 实现批量化运行多个 Runner
docker-compose up -d
查看容器状态
docker ps
当能看到两个 Runner 容器 STATUS 为 Up 时,即代表容器启动成功
配置 Runner 权限
值得注意的是,考虑到安全性和隔离性,我们在 Runner 容器内设置了专门的用户:Runner 用于运行 GitHub Actions Runner。
为了确保 Runner 用户的权限,我们需要确保 Runner 用户属于与 Docker 套接字所关联的组。
进入 rnnner 所在容器
sudo docker exec -it [RUNNER 容器id] bash
创建docker组(如果还没有)
groupadd docker
将runner用户添加到docker组
<