рдЕрдореГрдд тАЛтАЛрдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП GitHub CI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЕрдХреНрдЯреВрдмрд░ рдореЗрдВ, Github рдиреЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХреА рдЬреЛ рдЖрдкрдХреЛ рдХреИрд╢ рдбреЗрд╕реНрдХ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕реАрдЖрдИ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХреЛрдб рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдпрд╛ рдмрд╕ рд╕рд░реНрд╡рд░ рдореЗрдВ рдирдП рдкрд░рд┐рд╡рд░реНрддрди рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рдФрд░ рд╡рд┐рд╢реЗрд╖ (рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдЕрд╕реЗрдВрдмрд▓реА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЕрдиреБрд╕реВрдЪрд┐рдд рдЖрд╡рд░реНрддреА рдХрд╛рд░реНрдп ( рдХреНрд░реЛрди-рдЖрдзрд╛рд░рд┐рдд ) рднреА рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред


рдЖрдк рд╡рд░реНрдХрдлреНрд▓реЛ рдирд╛рдордХ рдПрдХреНрд╢рди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╕рдм рд╕реБрдВрджрд░ рд╣реИ, рдФрд░ рдПрдХ рдЙрдЬреНрдЬреНрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ - рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рдеред


рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛ред рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдЬреАрдм, рдЕрдзреВрд░рд╛ рд╣реИ, рдФрд░ рдЕрдХреНрд╕рд░ рдмрд╕ рдЧрд▓рдд рд╣реИред


рдорд╛рдирдХ CI рдХреНрд░рд┐рдпрд╛, рд╕рд░реНрдХрд┐рд▓ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ ред рдпрд╣ рд╕рд┐рд░реНрдл рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ YAML рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ рд▓рдХреНрд╖реНрдп рдУрдПрд╕, рдкрд░реНрдпрд╛рд╡рд░рдг, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдЖрджрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреНрд░рд┐рдпрд╛рдПрдБ рд╕реНрд╡рдпрдВ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрдкрдХреЛ рд╕реЗрд╡рд╛рдПрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдХрд╣реАрдВ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬреАрдПрдЪ рдХрдВрдЯреЗрдирд░ рдкреЛрд░реНрдЯ рдХреЛ рдЙрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рддрдХ рдореИрдк рдХрд░реЗрдЧрд╛, рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреЛ рд╡рд░реНрдгрд┐рдд рд╣реИ рдЙрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред


рдпрд╣рд╛рдБ рдПрдХ рдЕрдореГрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╡рд┐рдиреНрдпрд╛рд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП RabbitMQ рдФрд░ Redis рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 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] }} 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдпреВрдирд┐рдХреНрд╕ рдЕрдореГрдд v1.9.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдмрдВрдЯреВ рдкрд░ рдЪрд▓реЗрдВрдЧреЗ ред рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдореБрдЦреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рддрд╣рдд рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рд╢реБрджреНрдз рдЬрд╛рд╕реВрд╕реА рдХрд╣рд╛рдиреА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЬрд┐рд╕ рднреМрддрд┐рдХ рдкреЛрд░реНрдЯ рдкрд░ рд╕рд░реНрд╡рд┐рд╕ рдкреЛрд░реНрдЯ рдмрд╛рдЙрдВрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрд╕реЗ рдХрдВрдЯреЗрдирд░ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд░рди рдЯрд╛рдЗрдо рдкрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ job.services.rabbitmq.ports[5672] рдирд╛рдордХ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╢реЗрд▓ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред rabbitmq рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕реЗрд╡рд╛ рдЦрдВрдб рдореЗрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ 5672 рд╕реНрд░реЛрдд рдкреЛрд░реНрдЯ рд╣реИред рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ $ {{foo}} рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ RABBITMQ_PORT (рдЕрдВрддрд┐рдо рд╕реЗрдЯрд┐рдВрдЧ рдмреНрд▓реЙрдХ, рдХреБрдВрдЬреА env рддрд╣рдд) рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред RABBITMQ_HOST - рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдХреБрдВрдЬреА рдХреЗ рдиреАрдЪреЗред рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдпрд╣ рд╣рдо рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рдЗрди рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдкрдврд╝реЗрдВрдЧреЗ (рдпрд╣ рдЕрдореГрдд тАЛтАЛрдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛)ред


 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 , рдФрд░ рд╕рдорд╛рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдХрд╣реАрдВ рдмрд╛рд╣рд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, CI рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд░реЛрддреЛрдВ рдкрд░ dialyzer рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдп рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдЦрд░реЛрдВрдЪ рд╕реЗ plts рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ 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 рдореЗрдВ рдШреЛрд╖рд┐рдд рдПрдХ рдХрд╛рд░реНрдп рдЙрдкрдирд╛рдо рд╣реИ


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

рдпрд╣рд╛рдБ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рд╕рднреА рдХреЛ рдирдП Github рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реБрдЦрдж рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред


рд╕рдлрд▓ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг!

Source: https://habr.com/ru/post/hi481846/


All Articles