İçeriğe geç

Runner'ı CI hattına ekleme

Analiz, kodunuzun zaten bulunduğu CI hattında çalışır - kaynak kodunuz altyapınızdan çıkmaz. Aşağıdaki örneklerde runner, projeye özel token ile çağrılır.

Tüm örnekler imajı AppArch Hub’dan çeker; kimlik doğrulama, dil eşleştirme ve sık hatalar için o sayfaya bakın.

.github/workflows/apparch.yml
name: AppArch
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # the target branch is then in the clone: the change's own files and its merge base
- run: |
echo "$APPARCH_INSTALLATION_KEY" | docker login hub.apparch.io -u "$APPARCH_INSTALLATION_ID" --password-stdin
docker run --rm -v "$PWD:/workspace:ro" \
-e APPARCH_Collector__Token="$APPARCH_TOKEN" \
-e APPARCH_Collector__ApiUrl="https://api.yourdomain.com" \
-e GITHUB_EVENT_NAME -e GITHUB_REF -e GITHUB_REPOSITORY \
-e GITHUB_SERVER_URL -e GITHUB_BASE_REF -e GITHUB_SHA \
hub.apparch.io/collectors/dotnet:latest /workspace
env:
APPARCH_TOKEN: ${{ secrets.APPARCH_TOKEN }}
APPARCH_INSTALLATION_ID: ${{ secrets.APPARCH_INSTALLATION_ID }}
APPARCH_INSTALLATION_KEY: ${{ secrets.APPARCH_INSTALLATION_KEY }}
# Image pulls are authorized with your INSTALLATION credential, not the project token
# (Settings → CI/CD → Variables):
# DOCKER_AUTH_CONFIG = {"auths":{"hub.apparch.io":{"auth":"base64(<installation-id>:<installation-key>)"}}}
archpilot:
image: hub.apparch.io/collectors/dotnet:latest
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
variables:
APPARCH_Collector__Token: "$APPARCH_TOKEN"
APPARCH_Collector__ApiUrl: "https://api.yourdomain.com"
script:
# Optional flags: --modules archpilot,archscan (pin what runs)
# Yalnızca --modules archpilot verilirse SADECE MR'ın değişen dosyaları okunur - MR
# pipeline'ı için hızlı seçenek; archscan / archsecurity depo raporudur, her şeyi okur.
# --fail-on critical (fail this step when findings at/above the level exist)
- apparch "$CI_PROJECT_DIR"
pipelines:
pull-requests:
'**':
- step:
image:
name: hub.apparch.io/collectors/dotnet:latest
username: $APPARCH_INSTALLATION_ID
password: $APPARCH_INSTALLATION_KEY
run-as-user: 0 # the clone belongs to root; a PR run fetches the target branch into it
script:
- export APPARCH_Collector__Token="$APPARCH_TOKEN"
- export APPARCH_Collector__ApiUrl="https://api.yourdomain.com"
- apparch "$BITBUCKET_CLONE_DIR"
trigger: none
pr: ['*']
pool: { vmImage: ubuntu-latest }
steps:
- checkout: self
fetchDepth: 0 # the target branch is then in the clone: the change's own files and its merge base
- script: |
echo "$(APPARCH_INSTALLATION_KEY)" | docker login hub.apparch.io -u "$(APPARCH_INSTALLATION_ID)" --password-stdin
docker run --rm -v "$(Build.SourcesDirectory):/workspace:ro" \
-e APPARCH_Collector__Token="$(APPARCH_TOKEN)" \
-e APPARCH_Collector__ApiUrl="https://api.yourdomain.com" \
-e SYSTEM_PULLREQUEST_PULLREQUESTID="$(System.PullRequest.PullRequestId)" \
-e SYSTEM_PULLREQUEST_TARGETBRANCH="$(System.PullRequest.TargetBranch)" \
-e SYSTEM_TEAMPROJECT="$(System.TeamProject)" \
-e BUILD_REPOSITORY_NAME="$(Build.Repository.Name)" \
-e SYSTEM_COLLECTIONURI="$(System.CollectionUri)" \
-e BUILD_SOURCEVERSION="$(Build.SourceVersion)" \
hub.apparch.io/collectors/dotnet:latest /workspace
pipeline {
agent { docker { image 'hub.apparch.io/collectors/dotnet:latest' registryUrl 'https://hub.apparch.io' registryCredentialsId 'apparch-hub' } }
environment {
APPARCH_Collector__Token = credentials('APPARCH_TOKEN')
APPARCH_Collector__ApiUrl = 'https://api.yourdomain.com'
// PR review (ArchPilot) needs the MR context set explicitly; without these the run is a full scan (ArchScan).
APPARCH_Collector__Provider__Type = 'gitlab' // gitlab | github | bitbucket | azuredevops
APPARCH_Collector__Provider__ProjectId = 'group/project'
APPARCH_Collector__Provider__PullRequestId = "${env.CHANGE_ID}"
}
stages {
stage('AppArch') {
steps {
sh 'apparch "$WORKSPACE"'
}
}
}
}

Bir sonraki PR/MR açıldığında ArchPilot satır satır yorum bırakır. Runner modu otomatik seçer: MR/PR pipeline’ında hızlı inceleme (ArchPilot), push pipeline’ında tam tarama (ArchScan) çalışır.

Collector imajları root olmayan bir kullanıcıyla (uid 10001) çalışır ve başka bir kullanıcıya ait olabilen checkout’u yalnızca okur. Pull request’te collector değişikliği hedef dalla karşılaştırır (değişikliğin kendi dosyaları, merge base’i); bu yüzden o dal klonda bulunmalıdır:

  • GitHub Actions ve Azure DevOps: örnekler tüm geçmişi checkout eder (fetch-depth: 0, fetchDepth: 0); hedef dal zaten oradadır ve hiçbir şey yazılmaz.
  • GitLab CI ve Jenkins: olduğu gibi çalışır (GitLab’ın klonu job’a yazılabilir, Jenkins konteyneri kendi kullanıcısıyla çalıştırır).
  • Bitbucket Pipelines: klon her zaman root’a aittir ve collector hedef dalı bu klona çeker; bu yüzden örnek adımı root olarak çalıştırır (run-as-user: 0).

Bunlar olmadan koşu yine geçer, ama değişikliğin bulguları yerine bütün bulguları inceler ve hedef dalla karşılaştıran kontrolleri (kaldırılan yetkilendirme, yeni bağımlılık döngüsü) atlar. Runner’ınız başka bir yerde root’ta ısrar ediyorsa bunu açıkça belirtin: docker run --user 0 ..., Kubernetes’te securityContext.runAsUser: 0.

AppArch kurulumunuz CI runner’ın güvenmediği bir sertifikayla sunuluyorsa - iç CA ya da self-signed - koşu, kural çekme adımında TLS hatasıyla düşer. İki çıkış yolu var, tercih sırasıyla:

  1. CA’yı runner imajında güvenilir yapın. Sertifika o zaman her sertifika gibi doğrulanır ve collector tarafında hiçbir şey değişmez.
  2. Doğrulamayı SslVerify ile kapatın:
Terminal window
SslVerify=false # ya da SSL_VERIFY, ya da APPARCH_Collector__SslVerify

false, 0, no ve off kapatır; bunun dışında kalan her şey - boş dahil - açık bırakır. .NET collector ayrıca --no-ssl-verify bayrağını kabul eder. Her koşu açılış bloğunda ssl verify on ya da ssl verify OFF - server certificate not checked yazar; yani doğrulamayı zayıflatan bir pipeline bunu kendi log’unda söyler.