{"id":18839519,"url":"https://github.com/aserg-ufmg/demo-ci","last_synced_at":"2025-04-04T10:04:02.108Z","repository":{"id":37355983,"uuid":"341740720","full_name":"aserg-ufmg/demo-ci","owner":"aserg-ufmg","description":"Aula prática sobre servidores de Integração Contínua","archived":false,"fork":false,"pushed_at":"2024-07-08T21:31:50.000Z","size":149,"stargazers_count":23,"open_issues_count":68,"forks_count":671,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-27T21:57:40.309Z","etag":null,"topics":["continuous-integration","github-actions"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aserg-ufmg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-24T01:22:45.000Z","updated_at":"2024-11-17T05:56:29.000Z","dependencies_parsed_at":"2024-11-08T02:43:31.355Z","dependency_job_id":"f55282c7-2622-450f-8242-99edb0fa4d5a","html_url":"https://github.com/aserg-ufmg/demo-ci","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aserg-ufmg%2Fdemo-ci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aserg-ufmg%2Fdemo-ci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aserg-ufmg%2Fdemo-ci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aserg-ufmg%2Fdemo-ci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aserg-ufmg","download_url":"https://codeload.github.com/aserg-ufmg/demo-ci/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247157108,"owners_count":20893215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["continuous-integration","github-actions"],"created_at":"2024-11-08T02:43:19.849Z","updated_at":"2025-04-04T10:04:02.085Z","avatar_url":"https://github.com/aserg-ufmg.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Demo-CI: Aula Prática sobre Servidores de Integração Contínua\n\nEste repositório descreve um roteiro prático para configuração e uso de um **Servidor de Integração Contínua**. O objetivo é proporcionar ao aluno um primeiro contato real com essa prática de desenvolvimento de software.\n\nSe você ainda não sabe o que é **Integração Contínua** e também não entende o papel desempenhado por servidores de CI, recomendamos antes ler o [Capítulo 10](https://engsoftmoderna.info/cap10.html) do nosso livro texto ([Engenharia de Software Moderna](https://engsoftmoderna.info/cap10.html)).\n\nApesar de existirem diversos servidores de integração contínua, neste roteiro iremos usar um recurso nativo do GitHub, chamado **GitHub Actions**, para configurar um servidor de CI.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"70%\" src=\"https://user-images.githubusercontent.com/7620947/109080916-232f8200-76e0-11eb-8d02-9ca9f518cea2.png\" /\u003e\n\u003c/p\u003e\n\nO Github Actions permite executar programas externos assim que determinados eventos forem detectados em um repositório GitHub. Como nosso intuito é configurar um servidor CI, iremos usar o GitHub Actions para compilar todo o código (_build_) do projeto e rodar seus testes de unidade quando um Pull Request (PR) for aberto no repositório, conforme ilustrado a seguir.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"70%\" src=\"https://user-images.githubusercontent.com/7620947/110053018-50f77500-7d37-11eb-9ca1-3de609b93584.png\" /\u003e\n\u003c/p\u003e\n\n## Programa de Exemplo\n\nPara ilustrar o uso do servidor de CI, vamos usar um programa Java muito simples, que já foi criado e está disponível neste mesmo repositório ([Calculadora.java](https://github.com/aserg-ufmg/demo-ci/blob/main/src/main/java/br/ufmg/dcc/Calculadora.java)):\n\n```java\npublic class Calculadora {\n\n  public int soma(int x, int y) {\n    return x + y;\n  }\n\n  public int subtrai(int x, int y) {\n    return x - y;\n  }\n}\n```\n\nQuando chegar um PR no repositório, o servidor de CI vai automaticamente realizar um _build_ desse programa e rodar o seguinte teste de unidade (também já disponível no repositório, veja em [CalculadoraTest.java](https://github.com/aserg-ufmg/demo-ci/blob/main/src/test/java/br/ufmg/dcc/CalculadoraTest.java)):\n\n```java\npublic class CalculadoraTest {\n\n  @Test\n  public void testeSoma1() {\n    Calculadora calc = new Calculadora();\n    int resultadoEsperado = 5;\n    int resultadoRetornado = calc.soma(2,3);\n    assertEquals(resultadoEsperado, resultadoRetornado);\n  }\n\n  @Test\n  public void testeSoma2() {\n    Calculadora calc = new Calculadora();\n    assertEquals(10, calc.soma(4,6));\n  }\n}\n```\n\n## Tarefa #1: Configurar o GitHub Actions\n\n#### Passo 1\n\nAntes de mais nada realize um fork deste repositório. Para isso, basta clicar no botão **Fork** no canto superior direito desta página.\n\nOu seja, você irá configurar um servidor de CI na sua própria cópia do repositório.\n\n#### Passo 2\n\nClone o repositório para sua máquina local, usando o seguinte comando (onde `\u003cUSER\u003e` deve ser substituído pelo seu usuário no GitHub):\n\n```bash\ngit clone https://github.com/\u003cUSER\u003e/demo-ci.git\n```\n\nEm seguida, copie o código a seguir para um arquivo com o seguinte nome: `.github/workflows/actions.yaml`. Isto é, crie diretórios `.github` e depois `workflows` e salve o código abaixo no arquivo `actions.yaml`.\n\n```yaml\nname: Github CI\non:\n  # Configura servidor de CI para executar o pipeline de tarefas abaixo (jobs) quando \n  # um push ou pull request for realizado tendo como alvo a branch main\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\njobs:\n  pipeline:\n    runs-on: ubuntu-latest # Os comandos serão executados em um sistema operacional Linux\n\n    steps:\n      - name: Git Checkout\n        uses: actions/checkout@v2 # Faz o checkout do código recebido\n\n      - name: Set up JDK 1.8\n        uses: actions/setup-java@v1 # Configura o Java 1.8\n        with:\n          java-version: 1.8\n\n      - name: Build\n        run: mvn package -Dmaven.test.skip=true # Compila o código fonte\n\n      - name: Unit Test\n        run: mvn test # Executada os testes de unidade\n```\n\nEsse arquivo ativa e configura o GitHub Actions para -- toda vez que ocorrer um evento `push` ou `pull_request` tendo como alvo a branch principal do repositório -- realizar três tarefas (jobs):\n\n- realizar o checkout do código;\n- realizar um build;\n- rodar os testes de unidade.\n\n#### Passo 3\n\nRealize um `commit` e um `git push`, isto é:\n\n```bash\ngit add --all\ngit commit -m \"Configurando GitHub Actions\"\ngit push origin main\n```\n\n#### Passo 4\n\nQuando o `push` chegar no repositório principal, o GitHub Actions iniciará automaticamente o fluxo de tarefas configurado no arquivo `actions.yaml` (isto é, build + testes).\n\nVocê pode acompanhar o status dessa execução clicando na aba Actions do seu repositório.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"80%\" src=\"https://user-images.githubusercontent.com/7620947/110059807-b8b3bd00-7d43-11eb-9e57-e6ba1fa3457a.png\" /\u003e\n\u003c/p\u003e\n\n## Tarefa #2: Criando um PR com bug\n\nPara finalizar, vamos introduzir um pequeno bug no programa de exemplo e enviar um PR, para mostrar que ele será \"barrado\" pelo processo de integração (isto, o nosso teste vai \"detectar\" o bug e falhar).\n\n#### Passo 1\n\nIntroduza um pequeno bug na função `soma` do arquivo [src/main/java/br/ufmg/dcc/Calculadora.java](https://github.com/rodrigo-brito/roteiro-github-actions/blob/main/src/main/java/br/ufmg/dcc/Calculadora.java). Por exemplo, basta alterar a linha 6, alterando o retorno da função para `x + y + 1`, como apresentado abaixo.\n\n```diff\n--- a/src/main/java/br/ufmg/dcc/Calculadora.java\n+++ b/src/main/java/br/ufmg/dcc/Calculadora.java\n@@ -3,7 +3,7 @@ package br.ufmg.dcc;\n public class Calculadora {\n\n   public int soma(int x, int y) {\n-    return x + y;\n+    return x + y + 1;\n   }\n\n   public int subtrai(int x, int y) {\n```\n\n#### Passo 2\n\nApós modificar o código, você deve criar um novo branch, realizar um `commit` e `push`:\n\n```bash\ngit checkout -b bug\ngit add --all\ngit commit -m \"Incluindo alterações na função soma\"\ngit push origin bug\n```\n\n#### Passo 3\n\nEm seguida, crie um Pull Request (PR) com sua modificação. Para isso, basta acessar a seguinte URL em seu navegador: `https://github.com/\u003cUSER\u003e/demo-ci/compare/main...bug`, onde `\u003cUSER\u003e` deve ser substituido pelo seu usuário no GitHub. Nessa janela, você pode conferir as modificações feitas e incluir uma pequena descrição no PR.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"70%\" src=\"https://user-images.githubusercontent.com/7620947/111704705-5b793a80-881e-11eb-8422-22d51bde6b19.png\" /\u003e\n\u003c/p\u003e\n\nApós finalizar a criação do Pull Request, será iniciada nossa pipeline, ou seja, o próprio GitHub vai fazer o build do sistema e rodar seus testes (como na tarefa #1). Porém, dessa vez os testes não vão passar, como mostrado abaixo:\n\n\u003cp align=\"center\"\u003e\n    \u003cimg width=\"70%\" src=\"https://user-images.githubusercontent.com/7620947/111704932-a85d1100-881e-11eb-8d3b-31f34bafa986.png\" /\u003e\n\u003c/p\u003e\n\n**RESUMINDO**: O Servidor de CI conseguiu alertar, de forma automática, tanto o autor do PR como o integrador de que existe um problema no código submetido, o que impede que ele seja integrado no branch principal do repositório.\n\n## Créditos\n\nEste roteiro foi elaborado por **Rodrigo Brito**, aluno de mestrado do DCC/UFMG, como parte das suas atividades na disciplina Estágio em Docência, cursada em 2020/2, sob orientação do **Prof. Marco Tulio Valente**.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faserg-ufmg%2Fdemo-ci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faserg-ufmg%2Fdemo-ci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faserg-ufmg%2Fdemo-ci/lists"}