В предыдущей статье мы обсуждали Как улучшить свой CI/CD Рабочий процесс с использованием действий GitHub. Сегодня мы идем на шаг вперед. Мы будем работать с некоторыми дополнительными действиями для проверки нашей заявки, прежде чем отправить изображение Docker и отправить уведомление на канал Slack.
Во -первых, нам нужно создать ваше действие GitHub, используя путь «Наш repository_name»/ .github / рабочие процессы / и создайте наш файл рабочего процесса. Для этого урока мы собираемся развернуть приложение Node.js, поэтому мы начнем с выбора шаблона Node.js для работы, как показано ниже.
После нажатия на Установите этот рабочий процесс новый файл nodejs.yml создан в нашем репозитории со следующим контентом:
name: Node.js CI on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [8.x, 10.x, 12.x] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: npm install - run: npm run build --if-present - run: npm test env: CI: true
По умолчанию он собирается построить три разных версии, используя 8.x, 10.x и 12.x, работающий на Ubuntu, и поиск нашего Package.json в корневом каталоге.
Мы собираемся сохранить путь по умолчанию и построим приложение с помощью версии 13.x вместе с установкой Jest для целей тестирования. Другие строки останутся неизменными, за исключением имени действия Node.js тест, строить и уведомлять
:
name: Node.js Test, Build and Notify on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [13.x] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: npm install jest --save-dev - run: npm run build --if-present - run: npm test env: CI: true
Если у вас есть собственный код приложения Node.js, вам придется изменить тестовую строку в раздел Scripts для «Тест»: «шутка»
на вашем package.json
В нашем примере Package.json это окончательный код:
{ "name": "docker-githubactions", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "jest" }, "author": "Pablo Ponce", "license": "ISC", "dependencies": { "express": "^4.17.1" } }
Далее нам придется создать наши тестовые файлы. Согласно требованиям, мы собираемся создать тестовые файлы, используя filename.spec.js и хранить их в SRC / тест /
Мы собираемся установить глупая чек Для демонстрационных целей оценка, если два числа равны. Мы назвали файл test.spec.js Но соответствующая точка — путь (все файлы тестирования должны быть включены в src / test / )
describe("Testing our nodeJS app", () => { it("Testing using Github Actions", () => { expect(2).toBe(2); }); });
Если тест будет успешным, мы добавим новый шаг в наше действие, чтобы создать собственное изображение Docker. Нам понадобится Dockerfile, определенный в нашем корневом каталоге, чтобы построить наше приложение с помощью Docker на основе Node.js 13:
FROM node:13 EXPOSE 3000 WORKDIR /usr/src/app COPY package.json package.json RUN npm install COPY --chown=node:node . . CMD [ "node", "index.js" ]
Хотя наше приложение node.js является файлом index.js, вы должны адаптировать Dockerfile с вашими собственными требованиями:
//Load express module with `require` directive var express = require('express') var app = express() //Define request response in root URL (/) app.get('/', function (req, res) { res.send('It works!') }) //Launch listening server on port 3000 app.listen(3000, function () { console.log('Keep working!') })
После этого мы можем отредактировать наш nodejs.yml и добавьте действие Docker, сделанное Elgohr Анкет Важным моментом является установка условного «если», чтобы гарантировать выполнение, только если предыдущий шаг был успешным:
- name: Publish Docker if: success() uses: elgohr/Publish-Docker-Github-Action@2.11 with: # The name of the image you would like to push name: cloudblog/nodejs_githubactions # The login username for the registry username: ${{ secrets.DOCKERHUB_USER }} # The login password for the registry password: ${{ secrets.DOCKERHUB_PASS }}
Примечание: вам нужно переименовать изображение, используя формат yourdockeruser/image_name_of_your_app
Если все работает нормально, у нас должен быть новый репозиторий на нашем концентраторе Docker с нашим изображением контейнера:
Кроме того, нам нужно было бы отправить уведомление на слабый канал, когда сборка завершена и завершена правильно. Та же процедура, что и раньше, нам нужно включить новый шаг, который будет выполнен только в том случае, если предыдущий шаг был завершен без ошибок.
Для уведомления о Slack нам нужно использовать входящие веб -крючки для приложения Slack в нашем рабочем пространстве. Мы также можем переопределить конфигурацию по умолчанию из веб -крючка, как связанный канал.
Здесь мы используем настройки по умолчанию, когда создали WebHook, но записываем конкретное сообщение, которое будет отправлено на наш #General Channel с текстом «Новая версия вашего приложения Node.js была построена»
- name: GitHub Action for Slack if: success() env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} uses: Ilshidur/action-slack@1.6.2 with: args: 'A new version of your Node.js app has been built'
После выполнения этот вывод отправляется на наш канал Slack #General:
Это сообщение будет отправлено только тогда, когда все предыдущие шаги будут выполнены без ошибок. Когда тесты в нашем коде успешно пройдут, мы получаем что -то вроде:
Включая все настроенные тесты, прошедшие как и ожидалось:
Однако обратите внимание, что даже если один тест не пройдет, рабочий процесс прекращается, и дальнейшие действия не будут выполнены. Если мы изменим наш образцы тестирования для оценки 3 против 2, тест пройдет сбой, и, следовательно, следующие шаги — сборка Docker, загрузить в Docker Hub и уведомление канала Slack — не будет выполнено.
Здесь мы можем увидеть, как дальнейшие шаги не выполняются после сбоя теста:
Причина неудачного теста ясна, мы ожидали «2», но мы получаем «3» от нашей функции:
Наш последний nodejs.yml Файл будет выглядеть так же, как это:
name: Node.js Test, Build and Notify on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [13.x] steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: npm install jest --save-dev - run: npm run build --if-present - run: npm test env: CI: true - name: Publish Docker if: success() uses: elgohr/Publish-Docker-Github-Action@2.11 with: # The name of the image you would like to push name: cloudblog/nodejs_githubactions # The login username for the registry username: ${{ secrets.DOCKERHUB_USER }} # The login password for the registry password: ${{ secrets.DOCKERHUB_PASS }} - name: GitHub Action for Slack if: success() env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} uses: Ilshidur/action-slack@1.6.2 with: args: 'A new version of your Node.js app has been built'
Подобные действия могут быть выполнены с использованием других языков, и, следовательно, не только связаны с Node.js. Тестирование вашего кода (синтаксис или реальный вывод) до продолжения дополнительных действий — это действительно хорошая практика для поддержания здоровья вашего конвейера CI/CD. Продолжайте копать на рынке GitHub, чтобы обнаружить больше шагов, которые должны быть включены в ваш рабочий процесс.
Оригинал: «https://dev.to/appfleet/github-actions-testing-building-and-notifying-52c1»