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Проверка работы
- Закоммитьте изменения и запушьте в ветку
main - Перейдите во вкладку Actions в GitHub-репозитории
- Убедитесь, что ваш 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.