-
Notifications
You must be signed in to change notification settings - Fork 59
Fabisev/artifact publishing #149
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
51be34d
88a021d
98ab5eb
5bdfeb3
faaa65f
1dc8f90
f8c8ad5
39ab54c
5e88c22
a9d4d66
5a8defe
86b1fe4
cdc0773
9770fa8
0cae97e
eeecccb
e69a19d
3bcd7ea
cad8992
c645473
201b966
bdb6bf1
331b87e
7e18147
d731168
523de7c
160d714
595e7e8
50265d9
61c7c17
9e5bc37
1706f42
81a4774
f45fccb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
name: Build and Release | ||
|
||
on: | ||
push: | ||
branches: [ main ] | ||
tags: [ 'v*', 'rc-*' ] | ||
pull_request: | ||
branches: [ main ] | ||
workflow_dispatch: | ||
|
||
permissions: {} | ||
|
||
jobs: | ||
get-version: | ||
runs-on: ubuntu-latest | ||
permissions: | ||
contents: read | ||
outputs: | ||
version: ${{ steps.version.outputs.version }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- name: Get version | ||
id: version | ||
run: | | ||
BASE_VERSION=$(node -p "require('./package.json').version") | ||
echo "version=$BASE_VERSION" >> $GITHUB_OUTPUT | ||
|
||
build: | ||
needs: [get-version] | ||
timeout-minutes: 30 | ||
permissions: | ||
id-token: write | ||
contents: read | ||
strategy: | ||
matrix: | ||
include: | ||
- arch: x86_64 | ||
runner: codebuild-project-awsaws-lambda-nodejs-runtime-interface-client-${{ github.run_id }}-${{ github.run_attempt }} | ||
- arch: aarch64 | ||
runner: codebuild-project-awsaws-lambda-nodejs-runtime-interface-client-${{ github.run_id }}-${{ github.run_attempt }} | ||
runs-on: ${{ matrix.runner }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
|
||
- name: Setup Node.js | ||
uses: actions/setup-node@v4 | ||
with: | ||
node-version: 'lts/*' | ||
|
||
- name: Check copyright headers | ||
run: npm run check-headers | ||
|
||
- name: Install build dependencies | ||
run: | | ||
apt-get update | ||
apt-get install -y cmake make g++ autotools-dev automake libtool | ||
|
||
- name: Build natively for ${{ matrix.arch }} | ||
run: | | ||
echo "Building for architecture: ${{ matrix.arch }}" | ||
|
||
# Build native dependencies and JavaScript | ||
BUILD=1 npm install | ||
npm run build | ||
|
||
# Verify required files were created | ||
if [ ! -f "dist/rapid-client.node" ] || [ ! -f "dist/index.mjs" ] || [ ! -f "dist/UserFunction.js" ]; then | ||
echo "Error: Required files not found in dist directory" | ||
exit 1 | ||
fi | ||
|
||
# Copy architecture-specific package.json to dist | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. so we have 2 tars, one for each architecture? |
||
node -e " | ||
const pkg = require('./package.json'); | ||
pkg.name = 'aws-lambda-ric-${{ matrix.arch }}'; | ||
require('fs').writeFileSync('./dist/package.json', JSON.stringify(pkg, null, 2)); | ||
" | ||
|
||
# Create tarball with only required files | ||
tar -czf aws-lambda-ric-${{ matrix.arch }}-${{ needs.get-version.outputs.version }}.tgz \ | ||
-C dist package.json index.mjs UserFunction.js rapid-client.node | ||
|
||
- name: Generate checksums | ||
run: | | ||
PACKAGE_FILE="aws-lambda-ric-${{ matrix.arch }}-${{ needs.get-version.outputs.version }}.tgz" | ||
sha256sum $PACKAGE_FILE > checksums-${{ matrix.arch }}.sha256 | ||
sha512sum $PACKAGE_FILE > checksums-${{ matrix.arch }}.sha512 | ||
echo "Package: $PACKAGE_FILE (${{ matrix.arch }}) with version: ${{ needs.get-version.outputs.version }}" > checksums-${{ matrix.arch }}.txt | ||
|
||
- name: Upload artifacts | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: package-${{ matrix.arch }}-${{ needs.get-version.outputs.version }} | ||
path: | | ||
aws-lambda-ric-*-${{ needs.get-version.outputs.version }}.tgz | ||
checksums-* | ||
retention-days: 30 | ||
|
||
test: | ||
needs: [get-version, build] | ||
permissions: | ||
contents: read | ||
strategy: | ||
matrix: | ||
node-version: [18, 20, 22] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that's fine for now, but we might want to have one branch per version at some point if we want to adjust the RIC to a specific feature of node |
||
include: | ||
- arch: x86_64 | ||
runner: ubuntu-latest | ||
- arch: aarch64 | ||
runner: ubuntu-latest | ||
runs-on: ${{ matrix.runner }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
|
||
- name: Run unit tests - Node ${{ matrix.node-version }} (native $(arch)) | ||
run: | | ||
docker build \ | ||
-f test/unit/Dockerfile.nodejs${{ matrix.node-version }}.x \ | ||
-t unit/nodejs.${{ matrix.node-version }}x \ | ||
. | ||
docker run --rm unit/nodejs.${{ matrix.node-version }}x | ||
|
||
publish: | ||
if: startsWith(github.ref, 'refs/tags/') | ||
runs-on: codebuild-project-awsaws-lambda-nodejs-runtime-interface-client-${{ github.run_id }}-${{ github.run_attempt }} | ||
needs: [get-version, build, test] | ||
permissions: | ||
id-token: write | ||
contents: write | ||
steps: | ||
- uses: actions/checkout@v4 | ||
|
||
- name: Download x86_64 artifacts | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: package-x86_64-${{ needs.get-version.outputs.version }} | ||
path: ./artifacts/x86_64 | ||
|
||
- name: Download aarch64 artifacts | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: package-aarch64-${{ needs.get-version.outputs.version }} | ||
path: ./artifacts/aarch64 | ||
|
||
- name: Setup Node.js | ||
uses: actions/setup-node@v4 | ||
with: | ||
node-version: 'lts/*' | ||
|
||
- name: Setup NPM authentication | ||
run: | | ||
NPM_TOKEN=$(aws secretsmanager get-secret-value --secret-id ${{ secrets.NPM_SECRET_NAME }} --query SecretString --output text) | ||
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc | ||
chmod 0600 .npmrc | ||
|
||
- name: Determine version and publish packages | ||
id: version | ||
run: | | ||
if [[ "${{ github.ref }}" == refs/tags/rc-* ]]; then | ||
RC_NUMBER=${GITHUB_REF#refs/tags/rc-} | ||
PACKAGE_VERSION="${{ needs.get-version.outputs.version }}-rc.${RC_NUMBER}" | ||
echo "package_version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT | ||
echo "is_rc=true" >> $GITHUB_OUTPUT | ||
TAG_FLAG="--tag rc" | ||
else | ||
echo "package_version=${{ needs.get-version.outputs.version }}" >> $GITHUB_OUTPUT | ||
TAG_FLAG="" | ||
fi | ||
|
||
# Build and publish full package to npm | ||
BUILD=1 npm install | ||
npm run build | ||
npm publish $TAG_FLAG --access=public | ||
|
||
- name: Combine checksums | ||
run: | | ||
cat ./artifacts/*/checksums-*.txt > combined-checksums.txt | ||
cat ./artifacts/*/checksums-*.sha256 > combined-checksums.sha256 | ||
cat ./artifacts/*/checksums-*.sha512 > combined-checksums.sha512 | ||
|
||
- name: Create GitHub Release | ||
if: startsWith(github.ref, 'refs/tags/') | ||
uses: softprops/action-gh-release@v2 | ||
with: | ||
files: | | ||
./artifacts/*/aws-lambda-ric-*-*.tgz | ||
combined-checksums.* | ||
prerelease: ${{ steps.version.outputs.is_rc }} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -170,6 +170,39 @@ When modifying dependencies (`package.json`), make sure to: | |
|
||
We require package-lock.json to be checked in to ensure consistent installations across development environments. | ||
|
||
### Changelog Generation | ||
This project maintains a changelog in `RELEASE.CHANGELOG.md`. The changelog is automatically updated when a new tag is created. | ||
|
||
To manually generate a changelog entry for testing or preview purposes, run: | ||
```shell script | ||
npm run changelog | ||
``` | ||
|
||
To manually update the RELEASE.CHANGELOG.md file with a new entry: | ||
```shell script | ||
npm run changelog -- --update | ||
``` | ||
|
||
### Copyright Headers | ||
All source files in the bin, scripts, src, and test folders must include a copyright header containing both the words "Copyright" and "Amazon.com". The standard header format is: | ||
|
||
``` | ||
/* | ||
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
``` | ||
|
||
To check if your files have proper headers: | ||
```shell script | ||
npm run check-headers | ||
``` | ||
|
||
To automatically add headers to files missing them: | ||
```shell script | ||
npm run add-headers | ||
``` | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thanks for updating the readme! |
||
### Troubleshooting | ||
|
||
While running integration tests, you might encounter the Docker Hub rate limit error with the following body: | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see the general flow of this is different from what we did
--access=public