feat: Contrastive CSI Embedding Model — ADR-024 (all 7 phases) #52
34
.github/workflows/ci.yml
vendored
34
.github/workflows/ci.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
@@ -54,7 +54,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Upload security reports
|
- name: Upload security reports
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: security-reports
|
name: security-reports
|
||||||
@@ -98,7 +98,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
@@ -126,14 +126,14 @@ jobs:
|
|||||||
pytest tests/integration/ -v --junitxml=integration-junit.xml
|
pytest tests/integration/ -v --junitxml=integration-junit.xml
|
||||||
|
|
||||||
- name: Upload coverage reports
|
- name: Upload coverage reports
|
||||||
uses: codecov/codecov-action@v3
|
uses: codecov/codecov-action@v4
|
||||||
with:
|
with:
|
||||||
file: ./coverage.xml
|
file: ./coverage.xml
|
||||||
flags: unittests
|
flags: unittests
|
||||||
name: codecov-umbrella
|
name: codecov-umbrella
|
||||||
|
|
||||||
- name: Upload test results
|
- name: Upload test results
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: test-results-${{ matrix.python-version }}
|
name: test-results-${{ matrix.python-version }}
|
||||||
@@ -153,7 +153,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
@@ -174,7 +174,7 @@ jobs:
|
|||||||
locust -f tests/performance/locustfile.py --headless --users 50 --spawn-rate 5 --run-time 60s --host http://localhost:8000
|
locust -f tests/performance/locustfile.py --headless --users 50 --spawn-rate 5 --run-time 60s --host http://localhost:8000
|
||||||
|
|
||||||
- name: Upload performance results
|
- name: Upload performance results
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: performance-results
|
name: performance-results
|
||||||
path: locust_report.html
|
path: locust_report.html
|
||||||
@@ -236,7 +236,7 @@ jobs:
|
|||||||
output: 'trivy-results.sarif'
|
output: 'trivy-results.sarif'
|
||||||
|
|
||||||
- name: Upload Trivy scan results
|
- name: Upload Trivy scan results
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: 'trivy-results.sarif'
|
sarif_file: 'trivy-results.sarif'
|
||||||
@@ -252,7 +252,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
@@ -272,7 +272,7 @@ jobs:
|
|||||||
"
|
"
|
||||||
|
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
uses: peaceiris/actions-gh-pages@v3
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
publish_dir: ./docs
|
publish_dir: ./docs
|
||||||
@@ -286,7 +286,7 @@ jobs:
|
|||||||
if: always()
|
if: always()
|
||||||
steps:
|
steps:
|
||||||
- name: Notify Slack on success
|
- name: Notify Slack on success
|
||||||
if: ${{ needs.code-quality.result == 'success' && needs.test.result == 'success' && needs.docker-build.result == 'success' }}
|
if: ${{ secrets.SLACK_WEBHOOK_URL != '' && needs.code-quality.result == 'success' && needs.test.result == 'success' && needs.docker-build.result == 'success' }}
|
||||||
uses: 8398a7/action-slack@v3
|
uses: 8398a7/action-slack@v3
|
||||||
with:
|
with:
|
||||||
status: success
|
status: success
|
||||||
@@ -296,7 +296,7 @@ jobs:
|
|||||||
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||||
|
|
||||||
- name: Notify Slack on failure
|
- name: Notify Slack on failure
|
||||||
if: ${{ needs.code-quality.result == 'failure' || needs.test.result == 'failure' || needs.docker-build.result == 'failure' }}
|
if: ${{ secrets.SLACK_WEBHOOK_URL != '' && (needs.code-quality.result == 'failure' || needs.test.result == 'failure' || needs.docker-build.result == 'failure') }}
|
||||||
uses: 8398a7/action-slack@v3
|
uses: 8398a7/action-slack@v3
|
||||||
with:
|
with:
|
||||||
status: failure
|
status: failure
|
||||||
@@ -307,18 +307,16 @@ jobs:
|
|||||||
|
|
||||||
- name: Create GitHub Release
|
- name: Create GitHub Release
|
||||||
if: github.ref == 'refs/heads/main' && needs.docker-build.result == 'success'
|
if: github.ref == 'refs/heads/main' && needs.docker-build.result == 'success'
|
||||||
uses: actions/create-release@v1
|
uses: softprops/action-gh-release@v2
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
with:
|
||||||
tag_name: v${{ github.run_number }}
|
tag_name: v${{ github.run_number }}
|
||||||
release_name: Release v${{ github.run_number }}
|
name: Release v${{ github.run_number }}
|
||||||
body: |
|
body: |
|
||||||
Automated release from CI pipeline
|
Automated release from CI pipeline
|
||||||
|
|
||||||
**Changes:**
|
**Changes:**
|
||||||
${{ github.event.head_commit.message }}
|
${{ github.event.head_commit.message }}
|
||||||
|
|
||||||
**Docker Image:**
|
**Docker Image:**
|
||||||
`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}`
|
`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}`
|
||||||
draft: false
|
draft: false
|
||||||
|
|||||||
43
.github/workflows/security-scan.yml
vendored
43
.github/workflows/security-scan.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
|||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
@@ -46,7 +46,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Upload Bandit results to GitHub Security
|
- name: Upload Bandit results to GitHub Security
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: bandit-results.sarif
|
sarif_file: bandit-results.sarif
|
||||||
@@ -70,7 +70,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Upload Semgrep results to GitHub Security
|
- name: Upload Semgrep results to GitHub Security
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: semgrep.sarif
|
sarif_file: semgrep.sarif
|
||||||
@@ -89,7 +89,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
@@ -119,14 +119,14 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Upload Snyk results to GitHub Security
|
- name: Upload Snyk results to GitHub Security
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: snyk-results.sarif
|
sarif_file: snyk-results.sarif
|
||||||
category: snyk
|
category: snyk
|
||||||
|
|
||||||
- name: Upload vulnerability reports
|
- name: Upload vulnerability reports
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: vulnerability-reports
|
name: vulnerability-reports
|
||||||
@@ -170,7 +170,7 @@ jobs:
|
|||||||
output: 'trivy-results.sarif'
|
output: 'trivy-results.sarif'
|
||||||
|
|
||||||
- name: Upload Trivy results to GitHub Security
|
- name: Upload Trivy results to GitHub Security
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: 'trivy-results.sarif'
|
sarif_file: 'trivy-results.sarif'
|
||||||
@@ -186,7 +186,7 @@ jobs:
|
|||||||
output-format: sarif
|
output-format: sarif
|
||||||
|
|
||||||
- name: Upload Grype results to GitHub Security
|
- name: Upload Grype results to GitHub Security
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: ${{ steps.grype-scan.outputs.sarif }}
|
sarif_file: ${{ steps.grype-scan.outputs.sarif }}
|
||||||
@@ -202,7 +202,7 @@ jobs:
|
|||||||
summary: true
|
summary: true
|
||||||
|
|
||||||
- name: Upload Docker Scout results
|
- name: Upload Docker Scout results
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: scout-results.sarif
|
sarif_file: scout-results.sarif
|
||||||
@@ -231,7 +231,7 @@ jobs:
|
|||||||
soft_fail: true
|
soft_fail: true
|
||||||
|
|
||||||
- name: Upload Checkov results to GitHub Security
|
- name: Upload Checkov results to GitHub Security
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: checkov-results.sarif
|
sarif_file: checkov-results.sarif
|
||||||
@@ -256,7 +256,7 @@ jobs:
|
|||||||
exclude_queries: 'a7ef1e8c-fbf8-4ac1-b8c7-2c3b0e6c6c6c'
|
exclude_queries: 'a7ef1e8c-fbf8-4ac1-b8c7-2c3b0e6c6c6c'
|
||||||
|
|
||||||
- name: Upload KICS results to GitHub Security
|
- name: Upload KICS results to GitHub Security
|
||||||
uses: github/codeql-action/upload-sarif@v2
|
uses: github/codeql-action/upload-sarif@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
sarif_file: kics-results/results.sarif
|
sarif_file: kics-results/results.sarif
|
||||||
@@ -306,7 +306,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
@@ -323,7 +323,7 @@ jobs:
|
|||||||
licensecheck --zero
|
licensecheck --zero
|
||||||
|
|
||||||
- name: Upload license report
|
- name: Upload license report
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: license-report
|
name: license-report
|
||||||
path: licenses.json
|
path: licenses.json
|
||||||
@@ -361,11 +361,14 @@ jobs:
|
|||||||
- name: Validate Kubernetes security contexts
|
- name: Validate Kubernetes security contexts
|
||||||
run: |
|
run: |
|
||||||
# Check for security contexts in Kubernetes manifests
|
# Check for security contexts in Kubernetes manifests
|
||||||
if find k8s/ -name "*.yaml" -exec grep -l "securityContext" {} \; | wc -l | grep -q "^0$"; then
|
if [[ -d "k8s" ]]; then
|
||||||
echo "❌ No security contexts found in Kubernetes manifests"
|
if find k8s/ -name "*.yaml" -exec grep -l "securityContext" {} \; | wc -l | grep -q "^0$"; then
|
||||||
exit 1
|
echo "⚠️ No security contexts found in Kubernetes manifests"
|
||||||
|
else
|
||||||
|
echo "✅ Security contexts found in Kubernetes manifests"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "✅ Security contexts found in Kubernetes manifests"
|
echo "ℹ️ No k8s/ directory found — skipping Kubernetes security context check"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Notification and reporting
|
# Notification and reporting
|
||||||
@@ -376,7 +379,7 @@ jobs:
|
|||||||
if: always()
|
if: always()
|
||||||
steps:
|
steps:
|
||||||
- name: Download all artifacts
|
- name: Download all artifacts
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v4
|
||||||
|
|
||||||
- name: Generate security summary
|
- name: Generate security summary
|
||||||
run: |
|
run: |
|
||||||
@@ -394,13 +397,13 @@ jobs:
|
|||||||
echo "Generated on: $(date)" >> security-summary.md
|
echo "Generated on: $(date)" >> security-summary.md
|
||||||
|
|
||||||
- name: Upload security summary
|
- name: Upload security summary
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: security-summary
|
name: security-summary
|
||||||
path: security-summary.md
|
path: security-summary.md
|
||||||
|
|
||||||
- name: Notify security team on critical findings
|
- name: Notify security team on critical findings
|
||||||
if: needs.sast.result == 'failure' || needs.dependency-scan.result == 'failure' || needs.container-scan.result == 'failure'
|
if: ${{ secrets.SECURITY_SLACK_WEBHOOK_URL != '' && (needs.sast.result == 'failure' || needs.dependency-scan.result == 'failure' || needs.container-scan.result == 'failure') }}
|
||||||
uses: 8398a7/action-slack@v3
|
uses: 8398a7/action-slack@v3
|
||||||
with:
|
with:
|
||||||
status: failure
|
status: failure
|
||||||
|
|||||||
@@ -859,7 +859,10 @@ pub fn info_nce_loss_mined(
|
|||||||
return info_nce_loss(embeddings_a, embeddings_b, temperature);
|
return info_nce_loss(embeddings_a, embeddings_b, temperature);
|
||||||
}
|
}
|
||||||
|
|
||||||
let miner = miner.unwrap();
|
let miner = match miner {
|
||||||
|
Some(m) => m,
|
||||||
|
None => return info_nce_loss(embeddings_a, embeddings_b, temperature),
|
||||||
|
};
|
||||||
|
|
||||||
// Build similarity matrix for mining
|
// Build similarity matrix for mining
|
||||||
let mut sim_matrix = vec![vec![0.0f32; n]; n];
|
let mut sim_matrix = vec![vec![0.0f32; n]; n];
|
||||||
|
|||||||
Reference in New Issue
Block a user