Я розкажу як можна автоматизувати роботу використовуючи можливості GitHub.
Implement CI for dotnet
Для створення СI ми будемо використовувати функціональність GitHub Actions. GitHub actions - надає можливість автоматизації процесів розробки. GitHub Actions оперує концепцією workflow, що є по-суті одиницею автоматизації. Workflow запускається подіями (push, pull_request, cron та інші). GitHub Actions, як і більшість CI систем використовує .yml
синтаксис для опису одиниць автоматизації. Є два способи як можна створити workflow:
- Вручну
- Безпосередньо з GitHub
Для створення CI необхідно вибрати свій репозиторій в GitHub перейти на вкладку Actions далі New workflow і обрати NET. Після цього залишилось тільки зробити commit обраного файлу.
name: .NET
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Test
run: dotnet test --no-build --verbosity normal
Описана автоматизація запускається кожного разу коли ми робимо pull_request чи push в гілку master і збирає наш проект потім запускає тести. Щоб трохи покращити наш процес GitHub має функцію Branch protection rule, яка дозволяє налаштувати правила для наших pull_request. Для нас є цікавою опція Require status checks to pass before merging, за допомогою якої можна заборонити merge коли наш build workflow виконався неуспішно.
Якщо нам необхідно додати нову автоматизацію, то вона має знаходитися в папці .github\workflows
. І нашою вишенькою буде badge
який ми можемо додати до нашого репозиторія про результат виконання. Для цього необхідно перейти на вкладку Actions вибрати наш Action - Build та в меню обрати Create status badge.
В загальному досить зручний інструмент, зіткнувся тільки з однією проблемою, я створював тестовий
workflows
, який я потім видалив з репозиторія, але він залишився у вкладці Actions, щоб видалити його звідти необхідно видалити всі запуски цієї одиниці автоматизації.
Add Sonarсloud
Sonarсloud - статичний аналізатор коду, що надає інформацію про покриття тестами, дублювання, підтримуваність та безпеку коду. Він має хорошу інтеграцію з GitHub. Для того щоб додати наш репозиторій до Sonarсloud необхідно зробити наступні кроки:
- Логуємось в https://sonarcloud.io/ використовуючи GitHub і обираємо репозиторій який ми хочемо проаналізувати.
- Вибираємо CI GitHab Actions і записуємо
SONAR_TOKEN
в GitHub Secrets - Далі вибираємо
NET
і копіюємо згенерований.yml
до нашого репозиторію. Необхідно тільки замінити<your clean build command>
на наші команди для побудовиdotnet build
.
Аналізатор коду готовий до роботи і можна використовувати badge
для метрик. Щоб додати покриття тестами необхідно згенерувати результат запуску тестів в зрозумілому для sonarcloud форматі це наприклад opencover. Для цього необхідно додати конфігурацію для opencover
run: |
.\.sonar\scanner\dotnet-sonarscanner begin /k:"ohalay_TestSonarCloud" /o:"ohalay" /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.language="cs" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml"
dotnet build
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
.\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}"
Даний інструмент хороший тим, що дозволяє знайти проблеми в коді, що вже в нашому репозиторії та в коді, який ще не потрапив в наш репозиторій (pull_request). Також працюючи з sonarcloud наткнувся на проблему, коли тести виконуються не успішно, а сам запуск одиниці автоматизації залишається успішним, щоб це виправити необхідно перенести запуск тестів в окремий крок.
Add Dependabot
Dependabot - функціонал GitHub який автоматично моніторить і оновлює версії пакетів створюючи pull_request для цього. Щоб додати цей функціонал до реопзиторія необхідно перейти на вкладку Settings вибрати Security & analysis і ввімкнути Dependabot security updates.
Після цього залишається тільки додати файл конфігурації до нашого репозиторія .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
target-branch: "master"
schedule:
interval: "daily"
- package-ecosystem: "nuget"
directory: "/"
target-branch: "master"
schedule:
interval: "daily"
Зараз в нашому репозиторію версії
nuget
таgithub-actions
пакетів оновлюються автоматично. Важливо є те, щоdependabot.yml
обов'язково має знаходитись в master гілці. І щоб dependabot мав доступ завантажувати результати аналізу в sonatcloud, то необхідно додати йомуSONAR_TOKEN
. Також зіткнувся з проблемою, коли хотів налаштувати автоматичне оновлення пакетів лиши minor версії, поки цей функціонал ще в розробці єдиний варіант для кожного пакету вказати максимальну версію до якої можна оновлювати.
Add CodeQL
CodeQL - семантичний аналізатор коду, який дозволяє виявити потенційні вразливості в коді. Додати його можна перейшовши на вкладку Security вибрати Code scanning alerts і додати одиницю автоматизації для цього.
Конфігурація виглядає наступним чином
name: CodeQL
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: github/codeql-action/init@v1
with:
languages: csharp
- uses: github/codeql-action/autobuild@v1
- uses: github/codeql-action/analyze@v1
Summary
Перевагою такого підходу є те що всі налаштування знаходяться в одному місці, в нашому репозиторії і таким чином їх зручно підтримувати.
Трохи про ціни:
- GitHub Actions - 2000 безкоштовних хвилин в місяць для приватних репозиторіїв з free GitHub plan (публічні безкоштовно)
- SonarCloud - безкоштовний для публічних проектів
- Dependabot - безкоштовний, зараз є частиною GitHub
- CodeQL - використовує хвилини з GitHub Actions
Приклад GitHub проекту, який містить описану вище конфігурацію
Top comments (1)
Круто, Олег! Я сам користуюсь Github Actions для власних проєктів, але про Dependabot і CodeQL навіть не знав. Продовжуй в тому ж дусі!