Рубрики
Uncategorized

Создание, тестирование и публикация вашего Java Project с помощью GitHub Actions.

Вступление Я собираюсь создать рабочий процесс непрерывной интеграции (CI) для строительства, тестирования и … с меткой Java, тестирования, GitHub, DevOps.

Вступление

Я собираюсь создать рабочий процесс непрерывной интеграции (CI) для создания, тестирования и публикации проекта в пакетах GitHub.

Проект:

  • Весенний ботинок с Maven

  • База данных Postgres с таблицей Пользователи Анкет

  • Одна конечная точка /пользователи Это возвращает список пользователей. В примере у меня просто есть пользователь Джонатан с id 1 Анкет Мой интеграционный тест будет проверять/пользователи возвращают список размера 1.

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List findAll() {
        return userService.findAll();
    }
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class UserEndpointIT {
    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    protected DatabaseService databaseService;

    @LocalServerPort
    private int port;

    @BeforeAll
    public void initDatabase(){
        databaseService.fill();
    }

    @Test
    public void user_endpoint_should_return_all_users() {
        HttpHeaders headers = new HttpHeaders();
        HttpEntity entity = new HttpEntity(headers);

        ResponseEntity> response = this.restTemplate.exchange(createUrlWith("/users"), HttpMethod.GET, entity, new ParameterizedTypeReference>() {
        });
        int EXPECTED_USERS = 1;

        assertEquals(EXPECTED_USERS, response.getBody().size());
    }

    private String createUrlWith(String endpoint) {
        return "http://localhost:" + port + endpoint;
    }
}
  • Пролетать как инструмент миграции базы данных. (Проверьте мой post о Flyway, если вы не знаете об этом)

  • Следующий плагин Maven (Docker-Maven-Plugin) в моем pom.xml для запуска контейнера Docker Postgres для моих интеграционных тестов.

...

   io.fabric8
   docker-maven-plugin
   ${docker-maven-plugin.version}
   
      
         
            ${it.postgresql.image}
            
               
                  ${it.postgresql.port}:5432
               
               
                  ${it.postgresql.username}
                  ${it.postgresql.password}
                  ${it.postgresql.db}
               
               
                  database system is ready to accept connections
               
            
         
      
   
   
      
         start
         pre-integration-test
         
            start
         
      
      
         stop
         post-integration-test
         
            stop
         
      
   

...

Действия GitHub позволяют нам непрерывную интеграцию (CI) и непрерывное развертывание (CD) из наших репозитории GitHub. Как это работает? Событие запускает рабочий процесс , например, толчок к мастер -ветви или запрос на притяжение, и этот рабочий процесс может иметь другой рабочие места . У нас может быть работа, чтобы запустить наши тесты и еще одну работу по развертыванию приложения. Каждая работа использует шаги Это имеет разные задачи или более известные как действия . Мы можем создать свои собственные действия или использовать те, которые созданы сообществом. Нам также разрешено назвать каждое действие и дать краткое описание того, что оно делает, используя название ключ. Важно отметить, что по умолчанию задания будут работать параллельно, если мы не настроем их для запуска последовательно (возможно, любая работа зависит от другой).

Создание рабочего процесса

Прежде всего, нам нужно создать файл рабочего процесса в каталоге .github/Workflows.

name: my first workflow for a java project
on:
  push:
    branches: [ master ]

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-java@v1
        with:
          java-version: 11
          settings-path: ".m2/"
      - uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-${{ hashFiles('**/pom.xml') }}
      - name: Publish package
        run: mvn $MAVEN_CLI_OPTS clean deploy
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
      - name: Copying target jar
        run: |
          mkdir myTarget
          cp target/*.jar myTarget
      - name: Uploading jar
        uses: actions/upload-artifact@v2
        with:
          name: myPackage
          path: myTarget

Мы начнем с добавления имени для нашего рабочего процесса и установив событие, которое запустит его. В этом случае событие является push моей главной ветви. Теперь нам нужно установить работу для рабочего процесса. Забегает Настройка задания для запуска на виртуальной машине, размещенной GitHub, чтобы быть более точным Ubuntu Linux Runner (Читать дальше здесь ). В приведенном выше примере у меня есть одна работа под названием публиковать это выполняет следующие шаги:

  • Оформление заказа загружает копию нашего репозитория на бегуне.
  • Действие настройки настраивает среду Java. с Ключ позволяет нам указать переменные, которые будут доступны для действия. В примере мы настроили версию JDK и с Настройки Path , мы указываем местоположение для файла настройки.xml.
  • Учитывая работы по размещению бегунов GitHub, начинающихся в чистой виртуальной среде, мы хотим сэкономить время, чтобы зависимости не нужно загружаться каждый раз, когда выполняется работа. В примере я кэширую все банки зависимости. Важно установить ключ так что действие будет попытаться восстановить файлы кэша на основе этого ключа. Чтобы создать ключ, я использую Runner.os Это дает мне, где работа в настоящее время работает, и хэшфиль Функция, которая возвращает хэш для данных файлов (Подробнее здесь ).
  • Я собираюсь опубликовать свой проект в GitHub Packages, поэтому вы видите, что я бегаю MVN Clean Deploy . На этом этапе важно знать, что действие Действия/Setup-Java@v1 Используется ранее, собирается настроить Автоматически A Maven settings.xml Файл Создание аутентификации для сервера, как показано ниже. Чтобы использовать секрет github_token, мы должны ссылаться на его в нашем файле рабочего процесса, как вы видите в моем файле рабочего процесса, я передаю токен в качестве ввода в действие Публикайте пакет Анкет Если мы этого не сделаем, мы сможем увидеть ошибку в журналах (401 несанкционированный).

    
        github
        ${{ secrets.GITHUB_ACTOR }}
        ${{ secrets.GITHUB_TOKEN }}
    

Созданный сервер будет иметь идентификатор GitHub, переменная среды github_actor является нашим именем пользователя, а переменная среды github_token — это наш пароль (эти Env. Переменные существуют в нашем репозитории GitHub по умолчанию). В моем pom.xml мне просто нужно добавить конфигурацию репозитория, где будет загружен пакет.

...

    
        github
        github packages
        https://maven.pkg.github.com//[your_github_username]/[your_repository_name]
    

...

Если мы сделаем толчок, на правой стороне нашего репозитория, мы сможем найти нашу упаковку. Если мы нажмем на него, мы увидим зависимость.

  • Одним из последних шагов является загрузка артефакта. Помните, что артефакт — это файл или коллекция файлов, созданных во время запуска рабочего процесса. Во -первых, то, что я делаю, это создавать Mytarget Папка и скопируйте банку. Последние используемые действия — upload-artifact@v2 Это получает два входа, имя артефакта и файлы, которые будут загружены.

Если мы скачаем mypackage И разкапливаться, мы видим банку.

Когда мы делаем толчок к репозиторию, в Действия Вкладка Мы можем увидеть работа рабочего процесса. Если все в порядке, мы увидим зеленый тик.

Когда мы нажимаем на рабочий процесс, мы можем увидеть подробный список заданий и их шагов. В моем примере у меня просто публиковать работа.

Если мы проверим журнал Публикайте действие пакета , мы видим, как работает мой контейнер с базой данных, контекст весеннего, миграция левши в порядке, и тесты успешно прошли

GitHub Packages

Github Packages — это хостинг, которая позволяет нам размещать наши пакеты в частном или публичном или публично и использовать их в качестве зависимостей в наших проектах. Как мы видели в предыдущем разделе, мы загрузили проект как зависимость от пакетов GitHub. Но как я могу установить зависимость Maven, хранящуюся в реестре пакетов GitHub? Помимо добавления зависимости в pom.xml, мы должны выполнить следующие шаги:

  • В нашем pom.xml нам нужно указать на хранилище, где находится зависимость, которую мы хотим установить.
...

    
        github
        https://maven.pkg.github.com/[github_username]/[repository_name]
    

...
  • Реестр пакетов GitHub доступен через API GitHub и разрешение на потребности, поэтому нам нужно добавить наши учетные данные GitHub в настройки.xml. В моем случае я добавил их в свои глобальные настройки (~/.M2/settings.xml)


    
        
            github
            [your_github_username]
            [your_github_token]
        
    


Чтобы создать токен, мы должны перейти в наш GitHub Настройки> Настройки разработчика> Токены личного доступа и включить Читать: пакеты разрешение.

Как только эти шаги будут выполнены, и если все прошло хорошо, зависимость будет установлена правильно 😃.

Оригинал: «https://dev.to/jhonifaber/building-testing-and-publishing-your-java-project-with-github-actions-3j17»