-
Notifications
You must be signed in to change notification settings - Fork 111
181 lines (152 loc) · 6.78 KB
/
valgrind.yml
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
name: Valgrind
on:
workflow_dispatch:
inputs:
test-file:
description: 'new_test/<test-file>'
required: false
default: ""
use-server-rc:
type: boolean
description: 'Use server release candidate?'
required: true
default: false
server-tag:
required: false
default: latest
massif:
type: boolean
description: 'Use massif for testing memory usage'
required: false
default: false
env:
PYTHON_TAG: cp38
jobs:
look-for-wheel-in-jfrog:
outputs:
num_artifacts_found: ${{ steps.count_num_artifacts_found.outputs.num_artifacts }}
# So we can pass the python tag to a reusable workflow
python-tag: ${{ env.PYTHON_TAG }}
runs-on: ubuntu-22.04
env:
JF_SEARCH_RESULTS_FILE_NAME: wheel_commit_matches.txt
steps:
- uses: jfrog/setup-jfrog-cli@v4
env:
JF_URL: ${{ secrets.JFROG_PLATFORM_URL }}
JF_ACCESS_TOKEN: ${{ secrets.JFROG_ACCESS_TOKEN }}
- name: Get shortened commit hash of this workflow run
# versioningit commit sha is always 8 chars long it seems
run: echo SHORT_GITHUB_SHA=$(echo ${{ github.sha }} | cut -c1-8) >> $GITHUB_ENV
- name: Look for wheel built with default settings in JFrog
# AQL has the option to exclude patterns from search results
# but it doesn't allow regex, so we can't filter out any type of label in a wheel name
# Example: we want to filter out "unoptimized" and "dsym" but in case we add more labels, we want to use regex
# to handle those new labels without updating the regex.
run: jf rt search "${{ vars.JFROG_GENERIC_REPO_NAME }}/${{ github.ref_name }}/*${{ env.SHORT_GITHUB_SHA }}*${{ env.PYTHON_TAG }}*manylinux*x86_64*.whl" > ${{ env.JF_SEARCH_RESULTS_FILE_NAME }}
- name: Show unfiltered results
run: cat ${{ env.JF_SEARCH_RESULTS_FILE_NAME }}
- name: Install sponge
run: sudo apt install -y moreutils
- name: Filter out wheels with labels in results
run: jq 'map(select(.path | test("${{ env.SHORT_GITHUB_SHA }}\\.") | not))' ${{ env.JF_SEARCH_RESULTS_FILE_NAME }} | sponge ${{ env.JF_SEARCH_RESULTS_FILE_NAME }}
shell: bash
- name: Check if artifacts with labels were filtered out
run: cat ${{ env.JF_SEARCH_RESULTS_FILE_NAME }}
- name: Count artifacts
id: count_num_artifacts_found
run: echo num_artifacts=$(jq length ${{ env.JF_SEARCH_RESULTS_FILE_NAME }}) >> $GITHUB_OUTPUT
- name: Multiple artifacts found, not sure which one to use. Fail out
if: ${{ steps.count_num_artifacts_found.outputs.num_artifacts > 1 }}
run: exit 1
- name: Found the exact artifact in JFrog. Get the artifact name
if: ${{ steps.count_num_artifacts_found.outputs.num_artifacts == 1 }}
run: echo ARTIFACT_PATH=$(jq -r .[0].path ${{ env.JF_SEARCH_RESULTS_FILE_NAME }}) >> $GITHUB_ENV
- name: Then download artifact from JFrog
if: ${{ steps.count_num_artifacts_found.outputs.num_artifacts == 1 }}
run: jf rt download --flat --fail-no-op ${{ env.ARTIFACT_PATH }}
- name: Pass to valgrind job
if: ${{ steps.count_num_artifacts_found.outputs.num_artifacts == 1 }}
uses: actions/upload-artifact@v4
with:
# Artifact name doesn't matter. Valgrind job downloads all artifacts to get the one wheel
if-no-files-found: error
path: './*.whl'
build-manylinux-wheel:
needs: look-for-wheel-in-jfrog
if: ${{ needs.look-for-wheel-in-jfrog.outputs.num_artifacts_found == 0 }}
uses: ./.github/workflows/build-wheels.yml
with:
python-tags: '["${{ needs.look-for-wheel-in-jfrog.outputs.python-tag }}"]'
platform-tag: manylinux_x86_64
sha-to-build-and-test: ${{ github.sha }}
secrets: inherit
upload-built-wheel-to-jfrog:
needs: build-manylinux-wheel
# TODO: this job should skip when this workflow is run on central branches
# We already have artifacts available for central branches in the PyPI-type JFrog repo
# The problem is we have to conditionally skip this job, but using the github context to get the branch name
# doesn't work for some reason. Just leave this alone for now.
uses: ./.github/workflows/upload-to-jfrog.yml
with:
jfrog-repo-name: ${{ vars.JFROG_GENERIC_REPO_NAME }}
secrets: inherit
valgrind:
env:
MASSIF_REPORT_FILE_NAME: massif.out
needs: [
look-for-wheel-in-jfrog,
build-manylinux-wheel
]
# Case 1: Found artifact in JFrog
# Case 2: Did not find artifact in JFrog, had to build it in GHA
if: ${{ !cancelled() && (needs.look-for-wheel-in-jfrog.result == 'success' && (needs.look-for-wheel-in-jfrog.outputs.num_artifacts_found == 1) || (needs.look-for-wheel-in-jfrog.outputs.num_artifacts_found == 0 && needs.build-manylinux-wheel.result == 'success')) }}
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Convert Python tag to Python version
run: echo PYTHON_VERSION=$(echo ${{ env.PYTHON_TAG }} | sed -e "s/cp3/cp3./" -e "s/cp//") >> $GITHUB_ENV
shell: bash
- uses: actions/setup-python@v2
with:
python-version: '${{ env.PYTHON_VERSION }}'
architecture: 'x64'
- uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Install client
run: pip install ./*.whl
- name: Install test dependencies
run: pip install -r test/requirements.txt
- name: Run EE server
uses: ./.github/actions/run-ee-server
with:
use-server-rc: ${{ inputs.use-server-rc }}
server-tag: ${{ inputs.server-tag }}
docker-hub-username: ${{ secrets.DOCKER_HUB_BOT_USERNAME }}
docker-hub-password: ${{ secrets.DOCKER_HUB_BOT_PW }}
- run: sudo apt update
- run: sudo apt install valgrind -y
- run: echo VALGRIND_ARGS="--tool=massif --massif-out-file=./${{ env.MASSIF_REPORT_FILE_NAME }}" >> $GITHUB_ENV
if: ${{ inputs.massif }}
- run: echo VALGRIND_ARGS="--leak-check=full" >> $GITHUB_ENV
if: ${{ !inputs.massif }}
- run: PYTHONMALLOC=malloc valgrind --error-exitcode=1 ${{ env.VALGRIND_ARGS }} python3 -m pytest -v new_tests/${{ github.event.inputs.test-file }}
working-directory: test
# TODO: upload report as artifact
- run: ms_print ./${{ env.MASSIF_REPORT_FILE_NAME }}
if: ${{ !cancelled() && inputs.massif }}
working-directory: test
# See reason for deleting artifacts in dev-workflow-p2.yml
delete-artifacts:
needs: [
# These jobs must have downloaded the artifact from Github before we can delete it
upload-built-wheel-to-jfrog,
valgrind
]
# Workflow run must clean up after itself even if cancelled
if: ${{ always() }}
uses: ./.github/workflows/delete-artifacts.yml