Skip to content

Commit 5c017d2

Browse files
ezhang6811thpierce
andauthored
Reapply "Merge SDK and Lambda Releases (#253)" (#260) (#261)
This reverts commit d463605. DO NOT MERGE until we finalize our enhanced release process. *Issue #, if available:* *Description of changes:* By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. Co-authored-by: Thomas Pierce <[email protected]>
1 parent d1b6534 commit 5c017d2

File tree

2 files changed

+267
-266
lines changed

2 files changed

+267
-266
lines changed

.github/workflows/release-build.yml

Lines changed: 267 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ on:
55
version:
66
description: The version to tag the release with, e.g., 1.2.0
77
required: true
8+
aws_region:
9+
description: 'Deploy lambda layer to aws regions'
10+
required: true
11+
default: 'us-east-1, us-east-2, us-west-1, us-west-2, ap-south-1, ap-northeast-3, ap-northeast-2, ap-southeast-1, ap-southeast-2, ap-northeast-1, ca-central-1, eu-central-1, eu-west-1, eu-west-2, eu-west-3, eu-north-1, sa-east-1, af-south-1, ap-east-1, ap-south-2, ap-southeast-3, ap-southeast-4, eu-central-2, eu-south-1, eu-south-2, il-central-1, me-central-1, me-south-1, ap-southeast-5, ap-southeast-7, mx-central-1, ca-west-1, cn-north-1, cn-northwest-1'
812

913
env:
1014
AWS_DEFAULT_REGION: us-east-1
@@ -14,14 +18,17 @@ env:
1418
RELEASE_PRIVATE_REPOSITORY: 020628701572.dkr.ecr.us-west-2.amazonaws.com/adot-autoinstrumentation-node
1519
RELEASE_PRIVATE_REGISTRY: 020628701572.dkr.ecr.us-west-2.amazonaws.com
1620
PACKAGE_NAME: aws-distro-opentelemetry-node-autoinstrumentation
17-
ARTIFACT_NAME: aws-aws-distro-opentelemetry-node-autoinstrumentation-${{ github.event.inputs.version }}.tgz
21+
ARTIFACT_NAME: aws-aws-distro-opentelemetry-node-autoinstrumentation-${{ github.event.inputs.version }}.tgz
22+
# Legacy list of commercial regions to deploy to. New regions should NOT be added here, and instead should be added to the `aws_region` default input to the workflow.
23+
LEGACY_COMMERCIAL_REGIONS: us-east-1, us-east-2, us-west-1, us-west-2, ap-south-1, ap-northeast-3, ap-northeast-2, ap-southeast-1, ap-southeast-2, ap-northeast-1, ca-central-1, eu-central-1, eu-west-1, eu-west-2, eu-west-3, eu-north-1, sa-east-1
24+
LAYER_NAME: AWSOpenTelemetryDistroJs
1825

1926
permissions:
2027
id-token: write
2128
contents: write
2229

2330
jobs:
24-
build:
31+
build-sdk:
2532
environment: Release
2633
runs-on: ubuntu-latest
2734
steps:
@@ -56,9 +63,59 @@ jobs:
5663
package_name: aws-distro-opentelemetry-node-autoinstrumentation
5764
os: ubuntu-latest
5865

66+
- name: Upload SDK Tarball
67+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 #v4.6.2
68+
with:
69+
name: ${{ env.ARTIFACT_NAME }}
70+
path: aws-distro-opentelemetry-node-autoinstrumentation/${{ env.ARTIFACT_NAME }}
71+
5972
# TODO: Add some sort of smoke/integration testing before we go
6073
# release the artifacts. adot java for reference:
6174
# https://github.com/aws-observability/aws-otel-java-instrumentation/tree/93870a550ac30988fbdd5d3bf1e8f9f1b37916f5/smoke-tests
75+
76+
build-layer:
77+
needs: build-sdk
78+
runs-on: ubuntu-latest
79+
outputs:
80+
aws_regions_json: ${{ steps.set-matrix.outputs.aws_regions_json }}
81+
steps:
82+
- name: Set up regions matrix
83+
id: set-matrix
84+
run: |
85+
IFS=',' read -ra REGIONS <<< "${{ github.event.inputs.aws_region }}"
86+
MATRIX="["
87+
for region in "${REGIONS[@]}"; do
88+
trimmed_region=$(echo "$region" | xargs)
89+
MATRIX+="\"$trimmed_region\","
90+
done
91+
MATRIX="${MATRIX%,}]"
92+
echo ${MATRIX}
93+
echo "aws_regions_json=${MATRIX}" >> $GITHUB_OUTPUT
94+
- name: Checkout Repo @ SHA - ${{ github.sha }}
95+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
96+
- name: Setup Node
97+
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 #v5.0.0
98+
with:
99+
node-version: 22
100+
- name: NPM Clean Install
101+
# https://docs.npmjs.com/cli/v10/commands/npm-ci
102+
run: npm ci
103+
- name: Compile all NPM projects
104+
run: npm run compile
105+
- name: Build Lambda Layer
106+
run: npm run build-lambda
107+
- name: upload layer
108+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 #v4.6.2
109+
with:
110+
name: layer.zip
111+
path: lambda-layer/packages/layer/build/layer.zip
112+
113+
publish-sdk:
114+
needs: [build-sdk, build-layer]
115+
runs-on: ubuntu-latest
116+
steps:
117+
- name: Checkout Repo @ SHA - ${{ github.sha }}
118+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
62119

63120
- name: Configure AWS credentials for private ECR
64121
uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #v5.0.0
@@ -82,7 +139,6 @@ jobs:
82139
with:
83140
registry: public.ecr.aws
84141

85-
86142
# Publish to public ECR
87143
- name: Build and push public ECR image
88144
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 #v6.18.0
@@ -105,37 +161,223 @@ jobs:
105161
tags: |
106162
${{ env.RELEASE_PRIVATE_REPOSITORY }}:v${{ github.event.inputs.version }}
107163
108-
- name: Get SHA256 checksum of release artifact
109-
id: get_sha256
164+
# Publish '@aws/aws-distro-opentelemetry-node-autoinstrumentation' to npm
165+
- name: Publish autoinstrumentation to npm
166+
working-directory: aws-distro-opentelemetry-node-autoinstrumentation
167+
env:
168+
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
169+
NPM_CONFIG_PROVENANCE: true
170+
run: npm publish
171+
172+
publish-layer-prod:
173+
runs-on: ubuntu-latest
174+
needs: [build-layer, publish-sdk]
175+
strategy:
176+
matrix:
177+
aws_region: ${{ fromJson(needs.build-layer.outputs.aws_regions_json) }}
178+
steps:
179+
- name: role arn
180+
env:
181+
LEGACY_COMMERCIAL_REGIONS: ${{ env.LEGACY_COMMERCIAL_REGIONS }}
182+
run: |
183+
LEGACY_COMMERCIAL_REGIONS_ARRAY=(${LEGACY_COMMERCIAL_REGIONS//,/ })
184+
FOUND=false
185+
for REGION in "${LEGACY_COMMERCIAL_REGIONS_ARRAY[@]}"; do
186+
if [[ "$REGION" == "${{ matrix.aws_region }}" ]]; then
187+
FOUND=true
188+
break
189+
fi
190+
done
191+
if [ "$FOUND" = true ]; then
192+
echo "Found ${{ matrix.aws_region }} in LEGACY_COMMERCIAL_REGIONS"
193+
SECRET_KEY="LAMBDA_LAYER_RELEASE"
194+
else
195+
echo "Not found ${{ matrix.aws_region }} in LEGACY_COMMERCIAL_REGIONS"
196+
SECRET_KEY="${{ matrix.aws_region }}_LAMBDA_LAYER_RELEASE"
197+
fi
198+
SECRET_KEY=${SECRET_KEY//-/_}
199+
echo "SECRET_KEY=${SECRET_KEY}" >> $GITHUB_ENV
200+
- uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #v5.0.0
201+
with:
202+
role-to-assume: ${{ secrets[env.SECRET_KEY] }}
203+
role-duration-seconds: 1200
204+
aws-region: ${{ matrix.aws_region }}
205+
- name: Get s3 bucket name for release
206+
run: |
207+
echo BUCKET_NAME=nodejs-lambda-layer-${{ github.run_id }}-${{ matrix.aws_region }} | tee --append $GITHUB_ENV
208+
- name: download layer.zip
209+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
210+
with:
211+
name: layer.zip
212+
- name: publish
213+
run: |
214+
aws s3 mb s3://${{ env.BUCKET_NAME }}
215+
aws s3 cp layer.zip s3://${{ env.BUCKET_NAME }}
216+
layerARN=$(
217+
aws lambda publish-layer-version \
218+
--layer-name ${{ env.LAYER_NAME }} \
219+
--content S3Bucket=${{ env.BUCKET_NAME }},S3Key=layer.zip \
220+
--compatible-runtimes nodejs18.x nodejs20.x nodejs22.x \
221+
--compatible-architectures "arm64" "x86_64" \
222+
--license-info "Apache-2.0" \
223+
--description "AWS Distro of OpenTelemetry Lambda Layer for NodeJs Runtime" \
224+
--query 'LayerVersionArn' \
225+
--output text
226+
)
227+
echo $layerARN
228+
echo "LAYER_ARN=${layerARN}" >> $GITHUB_ENV
229+
mkdir ${{ env.LAYER_NAME }}
230+
echo $layerARN > ${{ env.LAYER_NAME }}/${{ matrix.aws_region }}
231+
cat ${{ env.LAYER_NAME }}/${{ matrix.aws_region }}
232+
- name: public layer
233+
run: |
234+
layerVersion=$(
235+
aws lambda list-layer-versions \
236+
--layer-name ${{ env.LAYER_NAME }} \
237+
--query 'max_by(LayerVersions, &Version).Version'
238+
)
239+
aws lambda add-layer-version-permission \
240+
--layer-name ${{ env.LAYER_NAME }} \
241+
--version-number $layerVersion \
242+
--principal "*" \
243+
--statement-id publish \
244+
--action lambda:GetLayerVersion
245+
- name: upload layer arn artifact
246+
if: ${{ success() }}
247+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 #v4.6.2
248+
with:
249+
name: ${{ env.LAYER_NAME }}-${{ matrix.aws_region }}
250+
path: ${{ env.LAYER_NAME }}/${{ matrix.aws_region }}
251+
- name: clean s3
252+
if: always()
253+
run: |
254+
aws s3 rb --force s3://${{ env.BUCKET_NAME }}
255+
256+
generate-lambda-release-note:
257+
runs-on: ubuntu-latest
258+
needs: publish-layer-prod
259+
outputs:
260+
layer-note: ${{ steps.layer-note.outputs.layer-note }}
261+
steps:
262+
- name: Checkout Repo @ SHA - ${{ github.sha }}
263+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
264+
- uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd #v3.1.2
265+
- name: download layerARNs
266+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
267+
with:
268+
pattern: ${{ env.LAYER_NAME }}-*
269+
path: ${{ env.LAYER_NAME }}
270+
merge-multiple: true
271+
- name: show layerARNs
272+
run: |
273+
for file in ${{ env.LAYER_NAME }}/*
274+
do
275+
echo $file
276+
cat $file
277+
done
278+
- name: generate layer-note
279+
id: layer-note
280+
working-directory: ${{ env.LAYER_NAME }}
110281
run: |
111-
shasum -a 256 aws-distro-opentelemetry-node-autoinstrumentation/${{ env.ARTIFACT_NAME }} | sed "s|aws-distro-opentelemetry-node-autoinstrumentation/||" > ${{ env.ARTIFACT_NAME }}.sha256
112-
282+
echo "| Region | Layer ARN |" >> ../layer-note
283+
echo "| ---- | ---- |" >> ../layer-note
284+
for file in *
285+
do
286+
read arn < $file
287+
echo "| " $file " | " $arn " |" >> ../layer-note
288+
done
289+
cd ..
290+
{
291+
echo "layer-note<<EOF"
292+
cat layer-note
293+
echo "EOF"
294+
} >> $GITHUB_OUTPUT
295+
cat layer-note
296+
- name: generate tf layer
297+
working-directory: ${{ env.LAYER_NAME }}
298+
run: |
299+
echo "locals {" >> ../layer_arns.tf
300+
echo " sdk_layer_arns = {" >> ../layer_arns.tf
301+
for file in *
302+
do
303+
read arn < $file
304+
echo " \""$file"\" = \""$arn"\"" >> ../layer_arns.tf
305+
done
306+
cd ..
307+
echo " }" >> layer_arns.tf
308+
echo "}" >> layer_arns.tf
309+
terraform fmt layer_arns.tf
310+
cat layer_arns.tf
311+
- name: generate layer ARN constants for CDK
312+
working-directory: ${{ env.LAYER_NAME }}
313+
run: |
314+
echo "{" > ../layer_cdk
315+
for file in *; do
316+
read arn < "$file"
317+
echo " \"$file\": \"$arn\"," >> ../layer_cdk
318+
done
319+
echo "}" >> ../layer_cdk
320+
cat ../layer_cdk
321+
322+
publish-github:
323+
needs: generate-lambda-release-note
324+
runs-on: ubuntu-latest
325+
steps:
326+
- name: Checkout Repo @ SHA - ${{ github.sha }}
327+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
328+
329+
- name: Download SDK artifact
330+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
331+
with:
332+
name: ${{ env.ARTIFACT_NAME }}
333+
334+
- name: Download layer.zip artifact
335+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
336+
with:
337+
name: layer.zip
338+
113339
# Publish to GitHub releases
114340
- name: Create GH release
115341
id: create_release
116342
env:
117-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
343+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
118344
run: |
119-
# Download layer.zip from existing latest tagged SDK release note
120-
LATEST_SDK_VERSION=$(gh release list --repo "aws-observability/aws-otel-js-instrumentation" --json tagName,isLatest -q 'map(select(.isLatest==true)) | .[0].tagName')
121-
mkdir -p layer_artifact
122-
gh release download "$LATEST_SDK_VERSION" --repo "aws-observability/aws-otel-js-instrumentation" --pattern "layer.zip" --dir layer_artifact
123-
shasum -a 256 layer_artifact/layer.zip > layer_artifact/layer.zip.sha256
345+
# Generate dependency versions from package.json
346+
DEPS=$(node -e "
347+
const pkg = require('./aws-distro-opentelemetry-node-autoinstrumentation/package.json');
348+
const deps = Object.entries(pkg.dependencies || {})
349+
.map(([name, version]) => \`- \\\`\${name}\\\` - \${version}\`)
350+
.join('\n');
351+
console.log(deps);
352+
")
353+
354+
# Create release notes
355+
cat > release_notes.md << EOF
356+
This release contains the following upstream components:
357+
358+
$DEPS
359+
360+
This release also publishes to public ECR and NPM.
361+
* See ADOT node auto-instrumentation Docker image v${{ github.event.inputs.version }} in our public ECR repository:
362+
https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-node
363+
* See version ${{ github.event.inputs.version }} in our NPM repository:
364+
https://www.npmjs.com/package/@aws/aws-distro-opentelemetry-node-autoinstrumentation
365+
366+
This release also includes the AWS OpenTelemetry Lambda Layer for JavaScript version ${{ github.event.inputs.version }}-$(echo $GITHUB_SHA | cut -c1-7).
367+
368+
Lambda Layer ARNs:
369+
${{ needs.generate-lambda-release-note.outputs.layer-note }}
370+
EOF
371+
372+
shasum -a 256 ${{ env.ARTIFACT_NAME }} > ${{ env.ARTIFACT_NAME }}.sha256
373+
shasum -a 256 layer.zip > layer.zip.sha256
124374
125375
gh release create --target "$GITHUB_REF_NAME" \
126376
--title "Release v${{ github.event.inputs.version }}" \
377+
--notes-file release_notes.md \
127378
--draft \
128379
"v${{ github.event.inputs.version }}" \
129-
aws-distro-opentelemetry-node-autoinstrumentation/${{ env.ARTIFACT_NAME }} \
380+
${{ env.ARTIFACT_NAME }} \
130381
${{ env.ARTIFACT_NAME }}.sha256 \
131-
layer_artifact/layer.zip \
132-
layer_artifact/layer.zip.sha256
133-
134-
# Publish '@aws/aws-distro-opentelemetry-node-autoinstrumentation' to npm
135-
- name: Publish autoinstrumentation to npm
136-
working-directory: aws-distro-opentelemetry-node-autoinstrumentation
137-
env:
138-
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
139-
NPM_CONFIG_PROVENANCE: true
140-
run: npm publish
141-
382+
layer.zip \
383+
layer.zip.sha256

0 commit comments

Comments
 (0)