As nossas várias ferramentas de track são publicadas como imagens Docker.
Cada ferramenta exige um Dockerfile, que especifica como a máquina é construída.
Deve ficar no diretório raiz do teu repositório e deve chamar-se Dockerfile.
O Dockerfile deve criar a imagem mínima necessária para que as ferramentas funcionem corretamente e com rapidez. A nossa página de Boas Práticas tem muitas dicas para te ajudar a alcançar esse objetivo.
O test runner tem 100% de CPU com 3GB de memória durante uma janela de 20 segundos por solução. Após 20 segundos, o processo é interrompido e reporta um timeout com o código de erro 408.
Recomendamos vivamente que sigas o nosso documento de Boas Práticas de Desempenho para reduzir a probabilidade de timeouts.
Uma execução das ferramentas pode produzir, no máximo, um megabyte de stdout e stderr. Se produzir mais, será terminada com o código de erro 413.
O conteúdo de stdout e stderr de cada execução será guardado em ficheiros.
Podes escrever um ficheiro results.out no diretório de saída, que contém informação de depuração.
Neste momento, não é possível que os responsáveis pela manutenção vejam o conteúdo destes ficheiros.
O ficheiro de resultados não pode ter mais de 500 kilobytes (incluindo quaisquer stack traces, etc.). Se o ficheiro for maior do que isto, a execução das ferramentas será terminada com o código de erro 460.
Cada solução recebe 100% dos recursos da máquina durante uma janela de vinte segundos. Após 20 segundos, o processo é interrompido e a execução é assinalada como um timeout.
Algumas ferramentas exigem (pequenos) desvios à configuração predefinida.
Nesse caso, são configuradas no ficheiro tools.json do repositório Tooling Invoker.
As ferramentas são executadas sem acesso à internet. Podes usar duas configurações diferentes:
none. Desativa o dispositivo de rede dentro do contentor.internal. Adiciona um dispositivo de rede dentro do contentor, mas a rede não tem acesso a nada externo.Linguagens diferentes têm um desempenho melhor ou pior consoante a configuração (por exemplo, o Ruby é 2x mais rápido com none. O Elixir é 12x mais rápido com internal.
Podes experimentar localmente usando a opção --network ao executar o teu docker. --network none é suportado por predefinição.
Para usar a rede interna, executa primeiro docker network create --internal internal para criar a rede e depois usa --network internal ao executar o contentor.
As linguagens podem definir a memória máxima que precisam de usar para executar as suas tarefas. Definir este valor o mais baixo possível permite-nos executar mais tarefas em paralelo e mais depressa. Também significa que quem tente abusar da memória não vai conseguir. Linguagens diferentes precisam de valores de memória máxima radicalmente diferentes. É aconselhável, e agradecemos, que avalies o desempenho da execução de um docker run para determinar a memória máxima que utiliza.
A memória deve ser especificada através do número com o sufixo b, k, m ou g, para indicar bytes, kilobytes, megabytes ou gigabytes.
Podes testar as definições acima com este comando:
docker container run -v /path/to/job:/mnt/exercism-iteration --network none -m 1GB exercism/ruby-test-runner lasagna /mnt/exercism-iteration/ /mnt/exercism-iteration/
Todas as alterações a Dockerfiles exigem uma revisão de PR por parte da equipa @exercism/maintainers-admin, para evitar a introdução de vulnerabilidades de segurança.