将GitHub CI用于Elixir项目

10月, Github启动了一些操作 ,使您无需离开存储此代码的收银台就可以执行CI 。 真的很方便。 一旦有人发送拉取请求 ,或简单地将新更改上传到服务器,或其他特殊事件(可以在官方文档中找到可以固定操作的事件列表),程序集即会开始。 还支持计划的定期任务( 基于cron )。


您可以创建称为工作流的操作管道。 除文档外,所有这些都是美丽的,并且看起来前景光明。


我花了一个多小时才弄清楚如何用第三方服务创建一个容器来测试应用程序。 这是我设法找到的。 请注意,官方文档坦率地讲笨拙,不完整,并且常常只是错误的。


标准CI 操作使用配置文件,其语法与CircleCI使用的语法非常相似。 这只是旧的YAML ,它允许您配置目标操作系统,环境,要执行的命令等。这些动作本身会接收唯一的名称 ,这使您可以引用其他动作并依赖它们。


此外,该配置还允许您指定services 。 服务必须在云中的某个地方运行,并且GH将根据配置将容器端口映射到这些服务公开的端口。 官方文档中很少涵盖此部分,甚至所描述的内容也包含错误。


这是需要RabbitMQRedis服务进行测试的Elixir项目的有效配置示例。


 name: Tests for My Project on: [push, pull_request] jobs: build: runs-on: ubuntu-latest container: image: elixir:1.9.1-slim services: rabbitmq: image: rabbitmq ports: - 5672:5672 env: RABBITMQ_USER: guest RABBITMQ_PASSWORD: guest RABBITMQ_VHOST: "/" redis: image: redis ports: - 6379:6379 steps: - uses: actions/checkout@v1 - name: Install Dependencies run: | MIX_ENV=ci mix local.rebar --force MIX_ENV=ci mix local.hex --force MIX_ENV=ci mix deps.get - name: Run All Tests run: | MIX_ENV=ci mix test env: RABBITMQ_HOST: rabbitmq RABBITMQ_PORT: ${{ job.services.rabbitmq.ports[5672] }} REDIS_HOST: redis REDIS_PORT: ${{ job.services.redis.ports[6379] }} 

如您所见,这些测试将在使用Elixir v1.9.1的 Ubuntu上运行 服务在关键服务下进行描述,这里开始一个纯粹的侦探故事。 容器引擎在运行时会随机选择将服务端口绑定到的物理端口,并将其存储在名为job.services.rabbitmq.ports[5672]的内部Shell变量中。 Rabbitmq是服务的名称,如该文件在“ 服务”部分中所述,而5672是源端口。 内部变量的语法为$ {{foo}},并传递给环境变量RABBITMQ_PORT (最后一个设置块,在键env )。 在RABBITMQ_HOST -您需要输入服务名称,就像在服务密钥下一样。 现在,应用程序可以照常读取环境变量,并且端口将被正确滚动。


这就是我们从环境中读取这些环境变量的方式(这是Elixir的配置,对于其他语言,会有一些非常相似的东西)。


 import Config config :my_app, rabbitmq: [ host: System.get_env("RABBITMQ_HOST"), password: "guest", port: String.to_integer(System.get_env("RABBITMQ_PORT", "5672")), username: "guest", virtual_host: "/", x_message_ttl: "4000" ] 

在项目文件中,我创建一个特殊的环境:ci ,以区分在本地环境中执行的测试的配置与在云中某处执行的相同测试的配置。


另外,在CI管道中,我在源上运行dialyzer 。 由于它在容器中运行,因此该任务需要花费一些时间,因为您每次都必须从头开始重新plts 。 这就是为什么我每天使用schedule配置选项执行此操作的原因。


 name: Dialyzer for My Project on: schedule: - cron: "0 1 * * *" jobs: build: runs-on: ubuntu-latest container: image: elixir:1.9.1-slim steps: - uses: actions/checkout@v1 - name: Install Dependencies run: | MIX_ENV=ci mix local.rebar --force MIX_ENV=ci mix local.hex --force MIX_ENV=ci mix deps.get - name: Run All Tests run: | MIX_ENV=ci mix code_quality 

这里code_quality是在mix.exs声明的任务别名


 defp aliases do [ code_quality: ["format", "credo --strict", "dialyzer"] ] end 

通常,这里是在新的Github工作流程中对具有外部依赖性的项目进行满意的测试所需要的。


成功的持续整合!

Source: https://habr.com/ru/post/zh-CN481846/


All Articles