[Components] Certifier #1421
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# TODO combine this with publish-components.yml | |
name: Components Checks | |
on: | |
pull_request: | |
branches: | |
- master | |
paths: | |
- 'components/**' | |
jobs: | |
check_version: | |
name: Ensure component commits modify component versions | |
runs-on: ubuntu-latest | |
permissions: | |
contents: write | |
pull-requests: write | |
steps: | |
- uses: actions/checkout@v4.1.7 | |
name: Checkout repo | |
with: | |
# See https://github.com/actions/checkout#checkout-v2 | |
# This will be slow. The intent is to fetch all commits | |
# since the merge-base (the commit where we branched off) | |
# so we can check the git diff against all changed files. | |
# By default, the checkout action only returns the last commit, | |
# There's no native way to do this in the checkout action, so | |
# we have to fetch the entire history. See | |
# https://github.com/actions/checkout/issues/266#issuecomment-638346893 | |
fetch-depth: 0 | |
- uses: Ana06/get-changed-files@v2.3.0 | |
id: changed_files | |
name: Get changed files | |
with: | |
format: json | |
- name: Check git diff for version changes | |
uses: ./.github/actions/git-diff-on-components | |
with: | |
all_files: ${{ steps.changed_files.outputs.all }} | |
base_commit: ${{ github.event.pull_request.base.sha }} | |
head_commit: ${{ github.event.pull_request.head.sha }} | |
verify-typescript-components: | |
name: Verify TypeScript components | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4.1.7 | |
- uses: pnpm/action-setup@v4.0.0 | |
with: | |
version: 7.33.6 | |
- name: Get pnpm store directory | |
id: pnpm-cache | |
run: | | |
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" | |
- uses: actions/cache@v4 | |
name: Setup pnpm cache | |
with: | |
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} | |
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
restore-keys: | | |
${{ runner.os }}-pnpm-store- | |
- name: Setup Node Env | |
uses: actions/setup-node@v4.0.2 | |
with: | |
node-version: 18 | |
registry-url: https://registry.npmjs.org/ | |
cache: 'pnpm' | |
- name: Install Dependencies | |
run: pnpm install -r | |
- name: Compile TypeScript | |
id: compile | |
run: npm run build > files.txt | |
- name: Get Changed Files | |
id: files | |
uses: Ana06/get-changed-files@v2.3.0 | |
with: | |
format: 'csv' | |
- name: Check For Compiled TypeScript Files | |
run: | | |
IFS=$'\n' | |
# Remove initial tsc output | |
output_files=$(cat files.txt | sed 1,3d) | |
declare -a ERRORS | |
declare -a SKIPPED | |
mapfile -d ',' -t added_modified_renamed_files < <(printf '%s,%s' '${{ steps.files.outputs.added_modified }}' '${{ steps.files.outputs.renamed }}') | |
for added_modified_file in "${added_modified_renamed_files[@]}"; | |
do | |
echo "Checking if $added_modified_file is a publishable ts file" | |
if [[ $added_modified_file == components/* ]] && [[ $added_modified_file == *.ts ]] && [[ $added_modified_file != *.app.ts ]] \ | |
&& [[ $added_modified_file != */common*.ts ]] && [[ $added_modified_file != */common/* ]] | |
then | |
# XXX This is a hacky way to publish only TS components with changes. If a changed | |
# file "path-a/path-b/c.ts" has a corresponding compiled output file | |
# "path-a/dist/path-b/c.mjs", attempt to publish the output `.mjs` file. | |
changed_output_file="" | |
for f in $output_files; # check each output file for a match | |
do | |
# Replaces /dist/path/filename.mjs with /path/filename.ts | |
maybe_source_file=$(echo "$f" | sed 's/\/dist\//\//;s/.mjs/\.ts/') | |
if [[ ${maybe_source_file} == **/${added_modified_file} ]] | |
then | |
changed_output_file=${f} | |
break | |
fi | |
done | |
if [[ $changed_output_file == "" ]] | |
then | |
ERROR_MESSAGE="cannot find an output .mjs file with ${added_modified_file}" | |
echo $ERROR_MESSAGE | |
ERRORS+=("*${ERROR_MESSAGE}") | |
fi | |
else | |
echo "$added_modified_file will not be added to the registry" | |
SKIPPED+=("*$added_modified_file") | |
fi | |
done | |
if [[ ${#SKIPPED[@]} -ne 0 ]]; then | |
echo "the following files were skipped:" | |
printf '%s\n' "${SKIPPED[@]}" | |
fi | |
if [[ ${#ERRORS[@]} -ne 0 ]]; then | |
echo "the following files generated errors:" | |
printf '%s\n' "${ERRORS[@]}" | |
echo "Please check if the components above were successfully compiled" | |
echo "More information here: https://pipedream.com/docs/components/typescript/#developing-typescript-components-in-the-pipedreamhq-pipedream-registry" | |
exit 1 | |
fi | |
unset IFS | |
publish-typescript-components-dry-run: | |
name: Publish TypeScript components | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4.1.7 | |
- uses: pnpm/action-setup@v4.0.0 | |
with: | |
version: 7.33.6 | |
- name: Get pnpm store directory | |
id: pnpm-cache | |
run: | | |
echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" | |
- uses: actions/cache@v4 | |
name: Setup pnpm cache | |
with: | |
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} | |
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
restore-keys: | | |
${{ runner.os }}-pnpm-store- | |
- name: Setup Node Env | |
uses: actions/setup-node@v4.0.2 | |
with: | |
node-version: 18 | |
registry-url: https://registry.npmjs.org/ | |
cache: 'pnpm' | |
- name: Install Dependencies | |
run: pnpm install -r | |
- name: Compile TypeScript | |
id: compile | |
run: npm run build > files.txt | |
- name: Get Changed Files | |
id: files | |
uses: Ana06/get-changed-files@v2.3.0 | |
with: | |
format: 'csv' | |
- name: Publish TypeScript components (dry run) | |
shell: bash {0} # don't fast fail | |
run: | | |
IFS=$'\n' | |
mapfile -d ',' -t added_modified_renamed_files < <(printf '%s,%s' '${{ steps.files.outputs.added_modified }}' '${{ steps.files.outputs.renamed }}') | |
# Remove initial tsc output | |
output_files=$(cat files.txt | sed 1,3d) | |
echo "The following files will be published on merge:" | |
for added_modified_file in "${added_modified_renamed_files[@]}"; | |
do | |
# starts with components, ends with .ts and not app.ts, doesn't end with /common*.ts, | |
# and doesn't follow */common/ | |
if [[ $added_modified_file == components/* ]] && [[ $added_modified_file == *.ts ]] && [[ $added_modified_file != *.app.ts ]] \ | |
&& [[ $added_modified_file != */common*.ts ]] && [[ $added_modified_file != */common/* ]] | |
then | |
# XXX This is a hacky way to publish only TS components with changes. If a changed | |
# file "path-a/path-b/c.ts" has a corresponding compiled output file | |
# "path-a/dist/path-b/c.mjs", attempt to publish the output `.mjs` file. | |
for f in $output_files; | |
do | |
# Replaces /dist/path/filename.mjs with /path/filename.ts | |
maybe_source_file=$(echo "$f" | sed 's/\/dist\//\//;s/.mjs/\.ts/') | |
if [[ ${maybe_source_file} == **/${added_modified_file} ]] | |
then | |
echo "$f" | |
fi | |
done | |
fi | |
done | |
unset IFS |