-
Notifications
You must be signed in to change notification settings - Fork 14
/
action.yaml
219 lines (207 loc) · 9.81 KB
/
action.yaml
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
---
name: Initialize Pants
description: |
Install Pants and its dependencies and prepare its caches.
If a `pants` launcher binary exists on the $PATH, it will be used. Otherwise, if
a `get-pants.sh` script exists in the repo root, it will be invoked to download the
launcher binary to ~/bin, which will be placed on the $PATH. Otherwise, the `get-pants.sh`
script will be downloaded first and then invoked as above.
inputs:
# Note: inputs are always string typed.
setup-commit:
description: |
Run the get-pants.sh script version from this commit in the pantsbuild/setup repo.
Picking a specific commit is safer than downloading the current version.
required: false
# When we update get-pants.sh, we should update this commit.
default: 6f136713a46e555946a22ffb3ed49c372eea58df
base-branch:
description: |
The fallback commit to restore the local process cache from, if no cache
is available at the current commit.
required: false
default: main
gha-cache-key:
description: Qualify all cache keys with this string. Useful for invalidating everything.
required: false
default: v0
named-caches-hash:
description: |
The hash to cache the named caches against. Should be a hash generated by hashFiles()
on all inputs to named caches, which are typically your lockfiles.
required: true
named-caches-location:
description: |
The location of the named cache, as specified in `pants.toml` or another pants config
file. Default is `~/.cache/pants/named_caches`.
required: false
default: "~/.cache/pants/named_caches"
pants-ci-config:
description: |
An extra config file to use in CI. Defaults to pants.ci.toml if present, or no
file otherwise. Set to an empty string to disable.
required: false
default: DEFAULT
cache-lmdb-store:
description: |
Whether to upload and restore the local process cache. If you're not using a fine-grained
remote caching service (see https://www.pantsbuild.org/docs/remote-caching), then you may
also want to preserve the local Pants process cache (lmdb_store). However this must
invalidate for changes to any file that can affect the build, so may not be practical in
larger repos. A remote cache service integrates with Pants's fine-grained invalidation and
avoids these problems.
required: false
default: 'false' # a string!
lmdb-store-location:
description: |
The location of the lmdb store, as specified in `pants.toml` or another pants config file.
Default is `~/.cache/pants/lmdb_store`.
required: false
default: "~/.cache/pants/lmdb_store"
experimental-remote-cache-via-gha:
description: |
Whether to add env variables that configure the Pants remote cache to use the GHA cache
(esp the [GLOBAL].remote_store_address, and [GLOBAL].remote_oauth_bearer_token options).
You must still configure the rest of the remote cache settings for these to take effect.
https://www.pantsbuild.org/2.20/docs/using-pants/remote-caching-and-execution/remote-caching#github-actions-cache
required: false
default: 'false' # a string!
setup-python-for-plugins:
description: |
If set to 'true', this action will set up a Python interpreter suitable for testing/linting
custom Pants plugin code in your repo. Pants plugins will run on the interpreter embedded
in Pants, and so must be tested/linted on an interpreter of the same version (currently 3.9).
This may be different than the interpreter version(s) your other Python code requires.
So this convenience option streamlines installing an interpreter specifically for
testing/linting plugin code.
required: false
default: 'false' # a string!
gh-host:
description: |
The lmdb store can be restored from the base branch, if it exists. This option configures the
host that is used to determine the latest commit on the base branch. This should be configured
as the hostname only, no protocol (for example, https) should be included. This is useful
if you are using an enterprise instance of GitHub whose host is not 'https://github.com'.
See https://cli.github.com/manual/gh_help_environment.
required: false
default: "github.com"
runs:
using: "composite"
steps:
- name: Ensure the Pants launcher binary
shell: bash
run: |
if ! command -v pants; then
if [[ -f ./get-pants.sh ]]; then
./get-pants.sh
else
curl --proto '=https' --tlsv1.2 -fsSLo ${{ runner.temp }}/get-pants.sh \
https://raw.githubusercontent.com/pantsbuild/setup/${{ inputs.setup-commit }}/get-pants.sh
chmod +x ${{ runner.temp }}/get-pants.sh
${{ runner.temp }}/get-pants.sh
fi
# add 'pants' is on the PATH for subsequent actions.
if [[ -f "$HOME/bin/pants" ]]; then
# The repo might have a copy of an older get-pants.sh
echo "$HOME/bin" >> $GITHUB_PATH
else
echo "$HOME/.local/bin" >> $GITHUB_PATH
fi
fi
- name: Setup interpreter for testing in-repo Pants plugins
if: inputs.setup-python-for-plugins == 'true'
uses: actions/setup-python@v5
with:
python-version: '3.9'
- name: Get the Pants bootstrap cache info
id: pants_bootstrap_cache
shell: bash
run: |
PANTS_BOOTSTRAP_CACHE_KEY=$(PANTS_BOOTSTRAP_TOOLS=2 pants bootstrap-cache-key)
if [[ "$OSTYPE" == "darwin"* ]]; then
PANTS_BOOTSTRAP_CACHE_DIR="$HOME/Library/Caches/nce"
else
PANTS_BOOTSTRAP_CACHE_DIR="$HOME/.cache/nce"
fi
echo "pants_bootstrap_cache_key=$PANTS_BOOTSTRAP_CACHE_KEY" >> $GITHUB_OUTPUT
echo "pants_bootstrap_cache_dir=$PANTS_BOOTSTRAP_CACHE_DIR" >> $GITHUB_OUTPUT
- name: Cache Pants setup
id: cache-pants-setup
uses: actions/cache@v4
with:
path: |
${{ steps.pants_bootstrap_cache.outputs.pants_bootstrap_cache_dir }}
key: pants-setup-${{ steps.pants_bootstrap_cache.outputs.pants_bootstrap_cache_key }}
- name: Cache Pants named caches
uses: actions/cache@v4
with:
path: ${{ inputs.named-caches-location }}
key: pants-named-caches-${{ runner.os }}-${{ inputs.gha-cache-key }}-${{ hashFiles('pants.toml') }}-${{ inputs.named-caches-hash }}
restore-keys: |
pants-named-caches-${{ runner.os }}-${{ inputs.gha-cache-key }}-${{ hashFiles('pants.toml') }}-
pants-named-caches-${{ runner.os }}-${{ inputs.gha-cache-key }}-
# Looking up the commit allows us to use the cache from the latest commit on the base branch.
- name: Get Pants Cache Commit (base branch commit to pull cache from)
id: pants_cache_commit
if: inputs.cache-lmdb-store == 'true'
shell: bash
# we could use this, but only if fetch-depth goes back far enough
# COMMIT=$(git merge-base ${GITHUB_BASE_REF:-${{ inputs.base-branch }}} HEAD | head -n1)
run: |
CACHECOMMIT=$(
gh api -H "Accept: application/vnd.github+json" \
'/repos/${{ github.repository }}/commits?per_page=1&sha=${{ inputs.base-branch }}' \
-q '.[].sha'
)
echo "CACHECOMMIT=${CACHECOMMIT}" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ github.token }}
# According to https://cli.github.com/manual/gh_help_environment, when GH_HOST is used to configure
# the hostname, the token must be named GITHUB_ENTERPRISE_TOKEN.
GITHUB_ENTERPRISE_TOKEN: ${{ github.token }}
GH_HOST: ${{ inputs.gh-host }}
- name: Cache Pants LMDB store
if: inputs.cache-lmdb-store == 'true'
uses: actions/cache@v4
id: cache-pants-lmdb-store
with:
path: ${{ inputs.lmdb-store-location }}
# The commit SHA serves as a hash of all files in the repo.
# A remote cache service integrates with Pants's fine-grained invalidation and avoids these problems.
key: pants-lmdb-store-${{ runner.os }}-${{ inputs.gha-cache-key }}-${{ github.sha }}
restore-keys: |
pants-lmdb-store-${{ runner.os }}-${{ inputs.gha-cache-key }}-${{ steps.pants_cache_commit.outputs.CACHECOMMIT }}
pants-lmdb-store-${{ runner.os }}-${{ inputs.gha-cache-key }}-
# These vars are required to use the experimental fine-grained remote caching via the GHA cache.
# https://www.pantsbuild.org/2.20/docs/using-pants/remote-caching-and-execution/remote-caching#workflow
- name: Configure Pants Remote Caching store
if: inputs.experimental-remote-cache-via-gha == 'true'
uses: actions/github-script@v7
with:
script: |
core.exportVariable('PANTS_REMOTE_STORE_ADDRESS', process.env.ACTIONS_CACHE_URL);
core.exportVariable('PANTS_REMOTE_OAUTH_BEARER_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN);
# Adding env vars to ${GITHUB_ENV} makes the vars show up for all subsequent steps
# in the workflow that uses this composite action.
# https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable
- name: Tell pants to use CI config
if: inputs.pants-ci-config != ''
shell: bash
env:
PANTS_CONFIG_FILES: ${{ inputs.pants-ci-config }}
run: |
if [ "${PANTS_CONFIG_FILES}" == "DEFAULT" ]; then
if [ -f "pants.ci.toml" ]; then
echo "PANTS_CONFIG_FILES=pants.ci.toml" >> ${GITHUB_ENV}
else
echo "NOT setting PANTS_CONFIG_FILES by default"
echo "because pants.ci.toml does not exist."
fi
else
echo "Setting custom PANTS_CONFIG_FILES=${PANTS_CONFIG_FILES}"
echo "PANTS_CONFIG_FILES=${PANTS_CONFIG_FILES}" >> ${GITHUB_ENV}
fi
- name: Bootstrap Pants
shell: bash
run: |
pants --version