Skip to Content
2️⃣ День 2GitHub Actions

GitHub Actions

GitHub Actions позволяет запускать CI/CD процессы прямо внутри репозитория. Это мощный инструмент, встроенный в GitHub, который позволяет автоматически выполнять задачи при определённых событиях (например, пуш в main-ветку, создание Pull Request и др.).


Подготовка проекта

Создайте базовый Node.js проект со следующими файлами:

📄 package.json

{ "name": "devops-node-starter", "version": "1.0.0", "type": "module", "scripts": { "start": "node src/index.js", "dev": "nodemon src/index.js", "test": "vitest", "lint": "eslint .", "lint:fix": "eslint . --fix" }, "dependencies": { "express": "^4.18.2" }, "devDependencies": { "eslint": "^9.31.0", "globals": "^16.3.0", "nodemon": "^3.1.10", "supertest": "^6.3.3", "vitest": "^3.2.0" } }

📄 src/index.js

import express from 'express'; const app = express(); const PORT = process.env.PORT || 4545; app.get('/ping', (req, res) => { res.send({ message: 'pong' }); }); app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`); }); export default app;

📄 tests/ping.test.js

import { describe, it, expect } from 'vitest'; import request from 'supertest'; import app from '../src/index.js'; describe('GET /ping', () => { it('should return pong', async () => { const res = await request(app).get('/ping'); expect(res.statusCode).toBe(200); expect(res.body.message).toBe('pong'); }); });

📄 eslint.config.js

import globals from "globals"; import { defineConfig } from "eslint/config"; export default defineConfig([ { ignores: [ "node_modules/**", "dist/**", "build/**", "coverage/**", "*.min.js", "package-lock.json" ], files: ["**/*.{js,mjs,cjs}"], languageOptions: { globals: globals.node, ecmaVersion: 2022, sourceType: "module" }, rules: { "no-console": "warn", "no-unused-vars": "warn", "prefer-const": "error" } }, ]);

📄 .gitignore

node_modules .env coverage dist build

Создание пайплайна

Создайте файл .github/workflows/deploy.yml в корне репозитория. Это будет файл конфигурации GitHub Actions.

Пример базовой структуры:

name: CI Pipeline on: push: branches: [main] # Запускать только при пуше в ветку main jobs: build: runs-on: ubuntu-latest # Используем GitHub-hosted runner с Ubuntu steps: - uses: actions/checkout@v3 # Клонирует код из репозитория

Установка зависимостей, линтинг, тесты

Добавим шаги в пайплайн:

- name: Установка зависимостей run: npm ci - name: Линтинг run: npm run lint - name: Запуск тестов run: npm run test

⚠️ Убедитесь, что в вашем package.json определены команды lint и test.


Полный пример

name: CI Pipeline on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Установка зависимостей run: npm ci - name: Линтинг run: npm run lint - name: Запуск тестов run: npm run test

Проверка работы

  1. Закоммитьте изменения и запушьте в ветку main
  2. Перейдите во вкладку Actions в GitHub-репозитории
  3. Убедитесь, что ваш workflow выполняется без ошибок

Теперь у вас есть базовый CI пайплайн, готовый к расширению (например, для деплоя на сервер или в облако).


Workflow для Pull Request

Создайте отдельный workflow .github/workflows/pr-check.yml, который будет запускаться при создании Pull Request. Этот workflow будет проверять код на ошибки линтинга и запускать тесты, прежде чем изменения попадут в main.

name: PR Checks on: pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Установка зависимостей run: npm ci - name: Линтинг run: npm run lint - name: Запуск тестов run: npm run test

✅ Это помогает не сливать в main плохой код. Проверка запускается при каждом новом коммите в PR.

Last updated on