Skip to content

Commit 092b55b

Browse files
OPDATA-3845: Select adapters to release (#4190)
* Select adapters to release * Test changesets * Revert "Test changesets" This reverts commit 4f5aae8. --------- Co-authored-by: app-token-issuer-data-feeds[bot] <134377064+app-token-issuer-data-feeds[bot]@users.noreply.github.com>
1 parent 2a5bf50 commit 092b55b

File tree

3 files changed

+108
-4
lines changed

3 files changed

+108
-4
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#!/bin/bash -e
2+
3+
# This script takes a list of adapter names to release and outputs the
4+
# arguments to pass to `yarn changeset version`.
5+
#
6+
# By default `yarn changeset version` will consume all changesets. If we want
7+
# to release a subset of packages, the only way to tell changeset is to tell
8+
# it which packages to ignore.
9+
# It is not allowed to ignore a package in a changeset without ignoring all
10+
# the packages in that changeset. And it is not allowed to ignore a package
11+
# that is a dependency of a package that is not ignored.
12+
13+
if [[ -z "$*" ]]; then
14+
# Output to stderr and exit 0 because an empty list is valid input and
15+
# should result in zero changeset arguments.
16+
# So there should be no output to stdout and success exit code.
17+
echo "Usage: $0 <possible empty list of adapters to release>" >&2
18+
exit 0
19+
fi
20+
21+
add_package_deps() {
22+
packages="$1"
23+
{
24+
for package in $packages; do
25+
echo $package
26+
package_file="$(git grep -l '"name": "'"$package"'"' packages)"
27+
jq -r '.dependencies | keys[]' "$package_file" | grep '@chainlink/' | grep -v '@chainlink/external-adapter-framework'
28+
done
29+
} | sort -u
30+
}
31+
32+
get_packages_from_changeset_files() {
33+
git grep -Eh "^'@chainlink/[^']*-adapter': (major|minor|patch)$" "$@" | sed -E "s#^'(@chainlink/[^']*-adapter)': (major|minor|patch).*\$#\\1#" | sort -u
34+
}
35+
36+
add_changeset_deps() {
37+
packages="$1"
38+
{
39+
for package in $packages; do
40+
pattern="^'$package': (major|minor|patch)\$"
41+
for changeset_file in $(git grep -lE "$pattern" .changeset); do
42+
get_packages_from_changeset_files "$changeset_file"
43+
done
44+
done
45+
} | sort -u
46+
}
47+
48+
add_deps() {
49+
packages="$1"
50+
packages=$(add_changeset_deps "$packages")
51+
packages=$(add_package_deps "$packages")
52+
echo "$packages"
53+
}
54+
55+
add_transitive_deps() {
56+
packages="$1"
57+
new_packages=$(add_deps "$packages")
58+
while [[ "$new_packages" != "$packages" ]]; do
59+
packages="$new_packages"
60+
new_packages="$(add_deps "$packages")"
61+
done
62+
echo "$packages"
63+
}
64+
65+
get_adapter_packages() {
66+
adapter_names="$(echo "$*" | sed -e 's/ *, */ /g')"
67+
for adapter_name in $adapter_names; do
68+
package_name="@chainlink/${adapter_name}-adapter"
69+
if git grep -q '"name": "'"$package_name"'"' packages; then
70+
echo "$package_name"
71+
else
72+
echo "'$adapter_name' is not an adapter name." >&2
73+
exit 1
74+
fi
75+
done
76+
}
77+
78+
adapter_packages="$(get_adapter_packages $*)"
79+
80+
packages_to_include="$(add_transitive_deps "$adapter_packages")"
81+
82+
if [[ -z "$packages_to_include" ]]; then
83+
echo "'$*' does not result in anything to release." >&2
84+
exit 1
85+
fi
86+
87+
echo "Not ignoring the following transitive dependencies:" >&2
88+
echo "$packages_to_include" >&2
89+
90+
all_packages=$(yarn workspaces list --json | jq -r '.name' | grep -v '@chainlink/external-adapters-js')
91+
packages_to_ignore=$(echo "$all_packages" | grep -vFf <(echo "$packages_to_include"))
92+
93+
echo "$packages_to_ignore" | sed -E 's|^.+|--ignore &|' | tr '\n' ' '

.github/scripts/run-changesets.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash -e
22

33
# Run changesets
4-
yarn changeset version
4+
yarn changeset version "$@"
55

66
# Recover all our changes (readmes, version bump)
7-
git stash pop
7+
git stash pop

.github/workflows/upsert-release-pr.yml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ name: Upsert Release PR
22

33
on:
44
workflow_dispatch:
5+
inputs:
6+
selected-adapters:
7+
description: comma (and/or space) separated list of adapters to release (if empty, all changed adapters with changesets will be released)
8+
required: false
9+
default: ''
510

611
# TODO: This entire workflow would be immensely sped up (~3min -> 30s tops) if:
712
# - Readme generation did not require built TS files
@@ -15,6 +20,7 @@ jobs:
1520
env:
1621
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1722
UPSTREAM_BRANCH: 'HEAD~1'
23+
SELECTED_ADAPTERS: ${{ inputs.selected-adapters }}
1824
steps:
1925
- name: Checkout Repo
2026
uses: actions/checkout@v4
@@ -31,9 +37,14 @@ jobs:
3137
run: |
3238
git config user.name "github-actions[bot]"
3339
git config user.email "github-actions[bot]@users.noreply.github.com"
40+
- name: Get changeset arguments
41+
run: |
42+
set -e
43+
CHANGESET_ARGUMENTS="$(.github/scripts/get-changeset-arguments.sh "$SELECTED_ADAPTERS")"
44+
echo "CHANGESET_ARGUMENTS=$CHANGESET_ARGUMENTS" >> "$GITHUB_ENV"
3445
- name: Temporarily calculate changesets to generate readmes with proper versions
3546
run: |
36-
yarn changeset version
47+
yarn changeset version $CHANGESET_ARGUMENTS
3748
git add -A
3849
git commit -m "Changesets mock"
3950
- name: Set up and install dependencies
@@ -72,7 +83,7 @@ jobs:
7283
# performs git resets and we want to keep those changes, so we stash and then pop them here.
7384
# All the previous steps would technically make more sense in the script itself, but we
7485
# keep them as separate ones so it's easier to see them from the github UI to debug.
75-
version: ./.github/scripts/run-changesets.sh
86+
version: ./.github/scripts/run-changesets.sh ${{ env.CHANGESET_ARGUMENTS }}
7687
title: 'Release ${{ env.BUMPED_VERSION }}'
7788
commit: 'Release ${{ env.BUMPED_VERSION }}'
7889
- name: Tag changesets commit

0 commit comments

Comments
 (0)