Build Pipeline (пајплајн изградње) — је низ аутоматизованих фаза кроз које код пролази од тренутка комита до артефакта спремног за примену. Пајплајн укључује компајлирање, покретање тестова, статичку анализу и припрему издања. Према подацима Google Cloud DORA, 2025, тимови са добро подешеним пајплајном постижу 440 пута бржу испоруку промена у поређењу са тимовима без аутоматизације.
Главно
Build Pipeline (пајплајн изградње) — је формализовани низ корака који се аутоматски извршавају при свакој промени кода. Сваки корак проверава одређени аспект квалитета: компајлирање, исправност тестова, одсуство рањивости, усклађеност са код-стилом. Ако било који корак заврши грешком, пајплајн се зауставља.
Концепт пајплајна потиче из производне линије — као у фабрици, где свака станица додаје вредност производу. У развоју софтвера, свака фаза додаје сигурност да је код спреман за издање. Модерни пајплајни се дефинишу као код (Pipeline as Code) и чувају се у Git репозиторијуму заједно са пројектом.
Према Continuous Delivery Foundation, 2025, зрео build pipeline смањује време од комита до издања са недеља на минуте. Ово се постиже потпуном аутоматизацијом и паралелним извршавањем независних фаза.
Уместо подешавања преко веб интерфејса, модерни пајплајн се описује у YAML или Groovy датотекама. Jenkinsfile, `.gitlab-ci.yml`, `.github/workflows/build.yml` — примери Pipeline as Code. Предности: верзионисање, code review, репродуцибилност.
У Jenkins-у постоје две синтаксе. Декларативни — једноставнији, са јасном структуром stages/steps. Скриптни — флексибилнији, заснован на Groovy-ју. За већину пројеката се препоручује декларативни приступ као читљивији и предвидљивији.
Типичан build pipeline за мобилну апликацију укључује неколико кључних фаза. Свака фаза обавља своју функцију и филтрира потенцијалне проблеме у раној фази.
Пајплајн почиње клонирањем репозиторијума. Затим се инсталирају зависности: Gradle/Maven пакети, CocoaPods, SPM (Swift Package Manager), npm пакети. Коришћење кеша у овој фази убрзава касније изградње за 50-70%.
Пре компајлирања покрећу се алати за контролу квалитета кода: Detekt или ktlint за Kotlin, SwiftLint за Swift, ESLint за JavaScript. Они проверавају усклађеност са код-стилом и проналазе потенцијалне грешке на нивоу анализе кода.
Код се компајлира у бинарни облик, а истовремено се покрећу јединични тестови. За Android је то `./gradlew testDebugUnitTest`, за iOS — `xcodebuild test -scheme App -destination 'platform=iOS Simulator'`. Неуспех тестова одмах зауставља пајплајн.
name: Mobile Build Pipeline
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew detekt
unit-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew testDebugUnitTest
- run: ./gradlew jacocoTestReport
build-release:
needs: [lint, unit-tests]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./gradlew assembleRelease
- uses: actions/upload-artifact@v4
with:
name: release-apk
path: app/build/outputs/apk/release/app-release.apk
Након успешног компајлирања, извршавају се тестови који захтевају покретање апликације: Espresso за Android, XCTest/XCUITest за iOS, Detox за React Native. У овој фази артефакт се поставља на симулатор или стварни уређај преко farm услуга (Firebase Test Lab, BrowserStack, Sauce Labs).
Правилна конфигурација пајплајна одређује ефикасност целог CI/CD процеса. Конфигурација укључује избор окидача, дефинисање паралелних и секвенцијалних фаза, параметризацију и интеграцију са спољним услугама.
Главни окидачи: push у репозиторијум, pull request (посебно за code review са аутоматским проверама), креирање Git ознаке (за издање), распоред (nightly build). Pull request окидач — најпрактичнији за тимски рад, јер открива проблеме пре спајања кода.
Независне фазе (линтинг, тестирање на различитим верзијама ОС) треба извршавати паралелно ради убрзања. Зависне — секвенцијално. Модерни CI системи аутоматски управљају паралелним задацима, распоређујући их међу доступним агентима.
Дуг пајплајн успорава развојни циклус и смањује мотивацију тима. Оптимизација времена изградње — један од главних задатака DevOps инжењера при раду са build pipeline-ом.
Gradle Build Cache чува резултате претходних компајлирања. Ако се изворни код модула није променио, он се не прекомпајлира. Слично ради инкрементално компајлирање у Swift и Kotlin. Величина кеша може достићи гигабајте, али уштеда времена је од 30% до 70%.
Јединични тестови се могу покретати на више агената истовремено, распоређујући тест класе. Sharding — техника поделе тестова у групе (shard-ове). GitHub Actions подржава `strategy.matrix`, Jenkins — Parallel Test Executor, Gradle — `--parallel --max-workers`.
Свака додатна фаза додаје време. Анализирајте пајплајн редовно: које фазе се могу спојити? На пример, линтинг се може покренути паралелно са компајлирањем, а не пре њега. Интеграциони тестови — само за pull request, не за сваки комит.
pipeline {
agent any
options {
timestamps()
timeout(time: 30, unit: 'MINUTES')
}
stages {
stage('Parallel Checks') {
parallel {
stage('Lint') {
steps { sh './gradlew detekt' }
}
stage('Unit Tests') {
steps { sh './gradlew test' }
}
}
}
stage('Build') {
steps { sh './gradlew assembleRelease' }
}
}
}
Build pipeline — критични елемент ланца снабдевања софтвером и његова безбедност се не сме занемарити. Компромитација пајплајна може довести до уношења злонамерног кода у издање, што ће утицати на све кориснике апликације.
Познати напади: SolarWinds (2020), Codecov (2021), 3CX (2023) — сви су искоришћавали рањивости у CI/CD пајплајновима. Заједнички вектор — нападач добија приступ акредитивима сервера за изградњу и мења код у фази изградње. Резултат — злонамерно издање потписано легитимним сертификатом.
Никада не чувајте кључеве за потписивање, API токене и лозинке у репозиторијуму или променљивим окружења CI система у отвореном облику. Користите тајне CI система (GitHub Secrets, GitLab CI Variables), HashiCorp Vault, AWS Secrets Manager. Минимизирајте приступ тајнама — сваки пајплајн треба да добије само кључеве потребне за његове конкретне кораке.
Сваки артефакт који излази из пајплајна треба да буде криптографски потписан и да садржи атестацију — доказ о пореклу (provenance). Алати: SLSA framework, in-toto attestation, cosign за потписивање контејнера. Провера потписа треба да се изврши пре примене у било које окружење.
name: Secure Build Pipeline
on: [push]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Scan dependencies
run: ./gradlew dependencyCheckAnalyze
- name: SAST scan
run: ./gradlew detekt
sign-attest:
needs: security-scan
runs-on: ubuntu-latest
steps:
- run: ./gradlew assembleRelease
- name: Sign APK
run: jarsigner -keystore ${{ secrets.KEYSTORE }} \
app-release.apk ${{ secrets.KEY_ALIAS }}
- name: Generate provenance
uses: actions/attest-build-provenance@v1
Build pipeline — сложен систем који захтева стално праћење. Без метрика немогуће је утврдити да ли се пајплајн успорио и која фаза је постала уско грло.
Пратите: време проласка (total pipeline duration), време сваке фазе, учесталост падова (build failure rate), време чекања у реду (queue time). За велики тим (>20 програмера) препоручује се подешавање dashboard-а у Grafana или Datadog са агрегираном статистиком за недељу/месец.
Сваки пад пајплајна захтева реакцију. Подесите обавештења у месенџере (Slack, Telegram, Discord) са линком на лог грешке и назнаком аутора комита. За критичне падове — PagerDuty или Opsgenie са ескалацијом.
Алати попут Act (за GitHub Actions) или Jenkins Pipeline Unit Test омогућавају покретање пајплајна локално без комита. Ово убрзава развој и отклањање грешака пајплајнова, посебно при додавању нових фаза или промени конфигурације.
Често постављана питања
Build pipeline је део CI/CD pipeline-а, одговоран за компајлирање и припрему артефакта. CI/CD pipeline је шири: укључује примену, праћење након издања и инфраструктурне провере.
При сваком push-у у репозиторијум. За pull request — обавезно пре спајања. Nightly build — за дугачке тестове (e2e, performance) који нису обавезни за сваки комит.
За нове пројекте — YAML (GitHub Actions, GitLab CI, Bitrise). Читљив је и једноставан. Groovy (Jenkins) је моћнији, али тежи за одржавање. Избор зависи од коришћеног CI система.
Главне методе: кеширање зависности, паралелно извршавање независних фаза, sharding тестова, искључивање дугих тестова из пајплајна за сваки комит, коришћење снажних агената за изградњу.
Анализирајте логове: који тачно тест је пао и зашто. Ако је тест flaky — додајте retry механизам. Ако је стварна грешка — поправите код, не искључујте тест. Искључивање тестова је последње средство.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође