-
-
Notifications
You must be signed in to change notification settings - Fork 293
164 lines (152 loc) · 6.63 KB
/
deploy-DEV-linters.yml
File metadata and controls
164 lines (152 loc) · 6.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
---
#########################
#########################
## Deploy Docker Image Linters ##
#########################
#########################
# Documentation:
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
#
#######################################
# Start the job on all push to main #
#######################################
name: "Build & Deploy - DEV linters"
on:
pull_request:
###############
# Set the Job #
###############
concurrency:
group: ${{ github.ref_name }}-${{ github.workflow }}
cancel-in-progress: true
jobs:
get-linters-matrix:
name: Get Linters Matrix
runs-on: ubuntu-latest
outputs:
linters: ${{ steps.set-matrix.outputs.linters }}
steps:
- name: Checkout Code
uses: actions/checkout@v6
- name: Get PR title or commit message
id: get-title
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "title=${{ github.event.pull_request.title }}" >> $GITHUB_OUTPUT
else
echo "title=${{ github.event.head_commit.message }}" >> $GITHUB_OUTPUT
fi
- name: Read linters_matrix.json and filter
id: set-matrix
run: |
extract_pkg() {
# Extract after 'upgrade', 'update dependency', 'update docker tag', etc.
pkg=$(echo "$1" | sed -E 's/^chore\(deps\): (upgrade|update dependency|update docker tag|update .* plugin|update .* docker tag) ([^ ]+).*/\2/i')
# If not found, try generic extraction for dependency lines
if [ -z "$pkg" ]; then
pkg=$(echo "$1" | sed -E 's/^chore\(deps\): update dependency ([^ ]+).*/\1/i')
fi
# Extract last segment after / or @ (e.g., friendsofphp/php-cs-fixer -> php-cs-fixer, @salesforce/plugin-packaging -> plugin-packaging)
pkg=$(echo "$pkg" | sed -E 's/^.*[\/@]//')
# Normalize: replace - and / with _, lowercase
pkg=$(echo "$pkg" | sed 's/@//g; s/[-\/]/_/g' | tr '[:upper:]' '[:lower:]')
echo "$pkg"
}
title="${{ steps.get-title.outputs.title }}"
echo "title=$title"
matrix=$(cat .automation/generated/linters_matrix.json | jq -c)
pkg=$(extract_pkg "$title")
echo "Extracted package: $pkg"
if [ -n "$pkg" ] && echo "$title" | grep -iq '^chore(deps)'; then
matches=$(echo "$matrix" | jq -c --arg pkg "$pkg" '[.[] | select(tostring | match($pkg;"i"))]')
if [ "$(echo "$matches" | jq 'length')" -gt 0 ]; then
echo "Filtered linters: $matches"
echo "linters=$matches" >> $GITHUB_OUTPUT
exit 0
fi
fi
# Default: return all
echo "No specific package found or not a chore(deps) commit, using all linters."
echo "linters=$matrix" >> $GITHUB_OUTPUT
build:
# Name the Job
name: DEV/Linters
# Set the agent to run on
runs-on: ubuntu-latest
needs: get-linters-matrix
permissions: read-all
strategy:
fail-fast: false
max-parallel: 18
matrix:
linter: ${{ fromJson(needs.get-linters-matrix.outputs.linters) }}
platform: ["linux/amd64"]
# Only run this on the main repo
if: |
(
(github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) ||
(github.event_name == 'push' && github.repository == 'oxsecurity/megalinter')
)
&& !contains(github.event.head_commit.message, 'skip deploy')
&& !contains(github.event.head_commit.message, 'skip linters')
##################
# Load all steps #
##################
steps:
- name: Checkout Code
uses: actions/checkout@v6
- name: Docker Metadata action
uses: docker/metadata-action@v6
id: meta
with:
images: |
${{ github.repository }}-only-${{ matrix.linter }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
if: ${{ ( ( runner.arch != 'X64' || runner.os != 'Linux' ) && matrix.platform == 'linux/amd64' ) || matrix.platform != 'linux/amd64' }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build Image
uses: docker/build-push-action@v7
with:
context: .
file: linters/${{ matrix.linter }}/Dockerfile
platforms: ${{ matrix.platform }}
build-args: |
BUILD_DATE=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
BUILD_VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
BUILD_REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
load: true
push: false
secrets: |
GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
tags: ${{ steps.meta.outputs.tags }}
#####################################
# Run Linter test cases #
#####################################
- name: Run Test Cases
shell: bash
run: |
GITHUB_REPOSITORY=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.event.pull_request.head.repo.full_name }}" || echo "${{ github.repository }}")
GITHUB_BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}")
TEST_KEYWORDS_TO_USE_UPPER="${{ matrix.linter }}"
TEST_KEYWORDS_TO_USE="${TEST_KEYWORDS_TO_USE_UPPER,,}"
docker image ls
docker run -e TEST_CASE_RUN=true -e OUTPUT_FORMAT=text -e OUTPUT_FOLDER=${{ github.sha }} -e OUTPUT_DETAIL=detailed -e GITHUB_SHA=${{ github.sha }} -e GITHUB_REPOSITORY=${GITHUB_REPOSITORY} -e GITHUB_BRANCH=${GITHUB_BRANCH} -e GITHUB_TOKEN="${{ secrets.GITHUB_TOKEN }}" -e TEST_KEYWORDS="${TEST_KEYWORDS_TO_USE}" -e MEGALINTER_VOLUME_ROOT="${GITHUB_WORKSPACE}" -v "/var/run/docker.sock:/var/run/docker.sock:rw" -v ${GITHUB_WORKSPACE}:/tmp/lint ${{ fromJson(steps.meta.outputs.json).tags[0]}}
timeout-minutes: 30
##############################################
# Check Docker image security with Trivy #
##############################################
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
with:
image-ref: "${{ fromJson(steps.meta.outputs.json).tags[0] }}"
format: "table"
exit-code: "1"
ignore-unfixed: true
scanners: vuln
vuln-type: "os,library"
severity: "CRITICAL,HIGH"
timeout: 10m0s
env:
ACTIONS_RUNTIME_TOKEN: ${{ secrets.GITHUB_TOKEN }}