Github Actions 中 Service Container 的使用

Github Actions 中 Service Container 的使用

Intro

之前写过一个 StackExchange.Redis 的一个扩展,测试项目依赖 redis,所以之前测试一直只是在本地跑一下,最近通过 Github Action 中的 Service Container 来通过 CI 来跑测试,分享一下如何使用 service container 来跑测试,不仅仅是 Redis,数据库等依赖也可以使用这样的方式来测试

Redis Service Container Sample

jobs:  # Label of the runner job  runner-job:    # You must use a Linux environment when using service containers or container jobs    runs-on: ubuntu-latest    # Service containers to run with `runner-job`    services:      # Label used to access the service container      redis:        # Docker image        image: redis:alpine        # Set health checks to wait until redis has started        options: >-          --health-cmd "redis-cli ping"          --health-interval 10s          --health-timeout 5s          --health-retries 5        ports:          # Maps port 6379 on service container to the host          - 6379:6379

上面是一个 redis service container 配置示例的一部分,需要注意的是使用 service container 的时候必须要使用 Linux 环境,因为 service container 的本质就是 docker run 了一个 container,通过一定的规则配置来实现在跑 CI 的环境可以访问的这个 service

上面的示例配置了一个 redis 的 service container,并将容器服务的 6379 端口映射到 host 的 6379 端口,这样 host 上的服务就可以通过 127.0.0.1:6379/localhost:6379 访问到使用 docker 跑起来的 redis 服务(redis service container)了

steps:  # Downloads a copy of the code in your repository before running CI tests  - name: Check out repository code    uses: actions/checkout@v2  # Performs a clean installation of all dependencies in the `package.json` file  # For more information, see https://docs.npmjs.com/cli/ci.html  - name: Install dependencies    run: npm ci  - name: Connect to Redis    # Runs a script that creates a Redis client, populates    # the client with data, and retrieves data    run: node client.js    # Environment variable used by the `client.js` script to create    # a new Redis client.    env:      # The hostname used to communicate with the Redis service container      REDIS_HOST: localhost      # The default Redis port      REDIS_PORT: 6379

Container Job Sample

上面的这种形式是在 host 上跑的,也就是直接在跑 CI 的服务器上跑的,有些情况下环境的配置比较麻烦的情况下也可以直接在指定的 docker 镜像为基础的 docker container 里跑 CI,需要注意的是 docker container 里跑 CI 的时候和直接在 host 上跑 CI 网络上有区别, host 可能就是直接访问 localhost,container 访问就是 service 名称,来看下面的 container 的一个示例:

jobs:  # Label of the container job  container-job:    # Containers must run in Linux based operating systems    runs-on: ubuntu-latest    # Docker Hub image that `container-job` executes in    container: node:10.18-jessie    # Service containers to run with `container-job`    services:      # Label used to access the service container      redis:        # Docker Hub image        image: redis        # Set health checks to wait until redis has started        options: >-          --health-cmd "redis-cli ping"          --health-interval 10s          --health-timeout 5s          --health-retries 5

可以看到大部分是一样的,只是多了一个 container 的配置,这样实际的 CI 就是在这个 container 里执行的,创建的执行 CI 的 container 和 service container 是在同一个 network 下,可以直接通过服务名称来访问

steps:  # Downloads a copy of the code in your repository before running CI tests  - name: Check out repository code    uses: actions/checkout@v2  # Performs a clean installation of all dependencies in the `package.json` file  # For more information, see https://docs.npmjs.com/cli/ci.html  - name: Install dependencies    run: npm ci  - name: Connect to Redis    # Runs a script that creates a Redis client, populates    # the client with data, and retrieves data    run: node client.js    # Environment variable used by the `client.js` script to create a new Redis client.    env:      # The hostname used to communicate with the Redis service container      REDIS_HOST: redis      # The default Redis port      REDIS_PORT: 6379

Sample

提供一个我目前在用的一个 service container,和上面的示例基本是类似的,有需要的可以参考一下:

name: dotnetcoreon: [push]jobs:  # Label of the container job  redis-integration-test:    # Containers must run in Linux based operating systems    runs-on: ubuntu-latest    # # Docker image that `job` executes in    # container: mcr.microsoft.com/dotnet/sdk:5.0    # Service containers to run with `container-job`    # https://docs.github.com/en/free-pro-team@latest/actions/guides/creating-redis-service-containers    services:      # Label used to access the service container      redis:        # Docker Hub image        image: redis:alpine        # Set health checks to wait until redis has started        options: >-          --health-cmd "redis-cli ping"          --health-interval 10s          --health-timeout 5s          --health-retries 5        ports:          # Maps port 6379 on service container to the host          - 6379:6379    steps:    - uses: actions/checkout@v1    - name: Setup .NET Core      uses: actions/setup-dotnet@v1      with:        dotnet-version: 5.0.x    - name: dotnet info      run: dotnet --info    - name: build      run: bash build.sh --target=test

CI 执行日志:

从日志上我们可以看出来比普通的 CI 执行会多出两个步骤,一个是初始化 container,一个是清理 container

完整的CI 日志可以在这里看到:https://github.com/WeihanLi/WeihanLi.Redis/runs/1400006789?check_suite_focus=true

More

虽然我的场景是 redis,但是不仅仅是 redis,很多应用外的依赖比如说数据库,甚至MQ等都是可以通过 service container 来做一个完善的集成测试,没有尝试过的快去试试吧~~

References

(0)

相关推荐

  • 是时候跟Docker说再见了

    在容器的远古时代 (差不多就是 4 年前),Docker 是这场游戏的唯一玩家.但现在情况已经不一样了,Docker 不再是唯一玩家,而只是一个容器引擎而已.我们可以用 Docker 构建.运行.拉取 ...

  • Using C++ with Docker Engine

    Using C++ with Docker Engine Posted by Deepak Vohra 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.5 ...

  • .NET 中的 Worker Service 入门介绍

    dotNET跨平台 今天 以下文章来源于技术译站 ,作者技术译民 翻译自 Steve Gordon 2020年3月30日的文章 <WHAT ARE .NET WORKER SERVICES?&g ...

  • 太秀了!那个在 GitHub 用文言文编程的小哥,竟从 28 万行唐诗中找出了对称矩阵

    来自量子位 下面这张图,你能看出来,这首诗妙在哪里吗? 其实,横着读是一首诗,竖着读还是这首诗! 而且,这首诗可不是乱编的,其中的诗句都来自<全唐诗>,读起来也颇有意境. 创造这个奇妙组合 ...

  • VBA中访问Web Service

    该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来.文章中的图片地址仍然是链接到博客园的.特此说 ...

  • Sql server reporting service下 LogFiles中日志不断添加,特别是mdmp超过100M的大文件不停增加解决办法

    前些天一直因磁盘被LogFiles中日志文件太大,导致笔记本的磁盘不够用了.详情可见http://www.360doc.com/content/21/0327/00/17987244_96917987 ...

  • colab的副本保存到github中

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/colab的副本保存到github中 作者:融水公子 rsgz Colab教程 Colab教程 http://www.rsgz.top/post/ ...

  • Github中的fork作用 是否同步原仓库 怎么同步

    Github中的fork作用 GitHub中Fork 是 服务端的代码仓库克隆(即 新克隆出来的代码仓库在远程服务端),包含了原来的仓库(即upstream repository,上游仓库)所有内容, ...

  • 推荐一款插件轻松查看github中的变量

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/推荐一款插件轻松查看github中的变量 作者:融水公子 rsgz Git$github教程 Git$github教程 http://www.rs ...

  • linux中服务(service)管理

    一.介绍 服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql , sshd 防火墙等),因此我们又称为守护进程,是Linux 中非常重 ...

  • Android中的Service,潜在的服务者。

    前言年前因为疫情以及个人原因辞职以后,很久没有工作了.终于在休息了大半年后,准备回到手敲代码的生活中去,开始着手准备自己的简历和面试等等.在面试过程中,被面试官问到了最基本的问题:"介绍一下 ...