Skip to content

Commit ca43a8a

Browse files
ezhang6811jj22ee
andcommitted
Merge SDK and Lambda Releases (#1163)
*Issue #, if available:* *Description of changes:* We plan to consolidate our ADOT SDK and Lambda layer releases for future versions. This PR merges the Lambda release workflow into the main release workflow, and publishes the layer artifacts and ARN notes to the same Github release as the SDK. The release build workflow also now includes the SDK release notes with our upstream dependency versions to eliminate the manual effort needed when updating release notes. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Jonathan Lee <jjllee@amazon.com>
1 parent 83edc98 commit ca43a8a

File tree

2 files changed

+296
-270
lines changed

2 files changed

+296
-270
lines changed

.github/workflows/release-build.yml

Lines changed: 296 additions & 15 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, 1.2.1-alpha.1
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_PUBLIC_ECR_REGION: us-east-1
@@ -13,14 +17,17 @@ env:
1317
PUBLIC_REPOSITORY: public.ecr.aws/aws-observability/adot-autoinstrumentation-java
1418
PRIVATE_REPOSITORY: 020628701572.dkr.ecr.us-west-2.amazonaws.com/adot-autoinstrumentation-java
1519
PRIVATE_REGISTRY: 020628701572.dkr.ecr.us-west-2.amazonaws.com
16-
ARTIFACT_NAME: aws-opentelemetry-agent.jar
20+
ARTIFACT_NAME: aws-opentelemetry-agent.jar
21+
# 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.
22+
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
23+
LAYER_NAME: AWSOpenTelemetryDistroJava
1724

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

2229
jobs:
23-
build:
30+
build-sdk:
2431
environment: Release
2532
runs-on: ubuntu-latest
2633
steps:
@@ -53,8 +60,87 @@ jobs:
5360
with:
5461
arguments: build integrationTests -PlocalDocker=true -Prelease.version=${{ github.event.inputs.version }} --stacktrace
5562

63+
- name: Upload SDK artifact
64+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 #v4.6.2
65+
with:
66+
name: ${{ env.ARTIFACT_NAME }}
67+
path: otelagent/build/libs/aws-opentelemetry-agent-${{ github.event.inputs.version }}.jar
68+
69+
build-layer:
70+
needs: build-sdk
71+
runs-on: ubuntu-latest
72+
outputs:
73+
aws_regions_json: ${{ steps.set-matrix.outputs.aws_regions_json }}
74+
steps:
75+
- name: Set up regions matrix
76+
id: set-matrix
77+
run: |
78+
IFS=',' read -ra REGIONS <<< "${{ github.event.inputs.aws_region }}"
79+
MATRIX="["
80+
for region in "${REGIONS[@]}"; do
81+
trimmed_region=$(echo "$region" | xargs)
82+
MATRIX+="\"$trimmed_region\","
83+
done
84+
MATRIX="${MATRIX%,}]"
85+
echo ${MATRIX}
86+
echo "aws_regions_json=${MATRIX}" >> $GITHUB_OUTPUT
87+
88+
- name: Checkout Repo @ SHA - ${{ github.sha }}
89+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
90+
91+
- uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0
92+
with:
93+
java-version-file: .java-version
94+
distribution: 'temurin'
95+
96+
- name: Build layers
97+
working-directory: lambda-layer
98+
run: |
99+
./build-layer.sh
100+
101+
- name: Upload layer
102+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 #v4.6.2
103+
with:
104+
name: layer.zip
105+
path: lambda-layer/build/distributions/aws-opentelemetry-java-layer.zip
106+
107+
publish-sdk:
108+
runs-on: ubuntu-latest
109+
needs: [build-sdk, build-layer]
110+
steps:
111+
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
112+
113+
- uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0
114+
with:
115+
java-version-file: .java-version
116+
distribution: 'temurin'
117+
- uses: gradle/actions/wrapper-validation@ed408507eac070d1f99cc633dbcf757c94c7933a # v4.4.3
118+
119+
- name: Publish patched dependencies to maven local
120+
uses: ./.github/actions/patch-dependencies
121+
with:
122+
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
123+
gpg_password: ${{ secrets.GPG_PASSPHRASE }}
124+
56125
- name: Configure AWS Credentials
57126
uses: aws-actions/configure-aws-credentials@v4
127+
with:
128+
role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN }}
129+
aws-region: ${{ env.AWS_PUBLIC_ECR_REGION }}
130+
131+
- name: Log in to AWS ECR
132+
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 #v3.5.0
133+
with:
134+
registry: public.ecr.aws
135+
136+
# build the artifact again so that its in the output path expected for building the docker image.
137+
- name: Build release with Gradle
138+
uses: gradle/gradle-build-action@a8f75513eafdebd8141bd1cd4e30fcd194af8dfa #v2
139+
with:
140+
arguments: build integrationTests -PlocalDocker=true -Prelease.version=${{ github.event.inputs.version }} --stacktrace
141+
142+
- name: Configure AWS Credentials for public ECR
143+
uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #v5.0.0
58144
with:
59145
role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN_RELEASE }}
60146
aws-region: ${{ env.AWS_PUBLIC_ECR_REGION }}
@@ -119,28 +205,223 @@ jobs:
119205
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
120206
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
121207

208+
publish-layer-prod:
209+
runs-on: ubuntu-latest
210+
needs: [build-layer, publish-sdk]
211+
strategy:
212+
matrix:
213+
aws_region: ${{ fromJson(needs.build-layer.outputs.aws_regions_json) }}
214+
steps:
215+
- name: role arn
216+
env:
217+
LEGACY_COMMERCIAL_REGIONS: ${{ env.LEGACY_COMMERCIAL_REGIONS }}
218+
run: |
219+
LEGACY_COMMERCIAL_REGIONS_ARRAY=(${LEGACY_COMMERCIAL_REGIONS//,/ })
220+
FOUND=false
221+
for REGION in "${LEGACY_COMMERCIAL_REGIONS_ARRAY[@]}"; do
222+
if [[ "$REGION" == "${{ matrix.aws_region }}" ]]; then
223+
FOUND=true
224+
break
225+
fi
226+
done
227+
if [ "$FOUND" = true ]; then
228+
echo "Found ${{ matrix.aws_region }} in LEGACY_COMMERCIAL_REGIONS"
229+
SECRET_KEY="LAMBDA_LAYER_RELEASE"
230+
else
231+
echo "Not found ${{ matrix.aws_region }} in LEGACY_COMMERCIAL_REGIONS"
232+
SECRET_KEY="${{ matrix.aws_region }}_LAMBDA_LAYER_RELEASE"
233+
fi
234+
SECRET_KEY=${SECRET_KEY//-/_}
235+
echo "SECRET_KEY=${SECRET_KEY}" >> $GITHUB_ENV
236+
237+
- uses: aws-actions/configure-aws-credentials@a03048d87541d1d9fcf2ecf528a4a65ba9bd7838 #v5.0.0
238+
with:
239+
role-to-assume: ${{ secrets[env.SECRET_KEY] }}
240+
role-duration-seconds: 1200
241+
aws-region: ${{ matrix.aws_region }}
122242

123-
- name: Get SHA256 checksum of release artifact
124-
id: get_sha256
243+
- name: Get s3 bucket name for release
125244
run: |
126-
cp "otelagent/build/libs/aws-opentelemetry-agent-${{ github.event.inputs.version }}.jar" ${{ env.ARTIFACT_NAME }}
127-
shasum -a 256 ${{ env.ARTIFACT_NAME }} > ${{ env.ARTIFACT_NAME }}.sha256
245+
echo BUCKET_NAME=java-lambda-layer-${{ github.run_id }}-${{ matrix.aws_region }} | tee --append $GITHUB_ENV
246+
247+
- name: download layer.zip
248+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
249+
with:
250+
name: layer.zip
251+
252+
- name: publish
253+
run: |
254+
aws s3 mb s3://${{ env.BUCKET_NAME }}
255+
aws s3 cp aws-opentelemetry-java-layer.zip s3://${{ env.BUCKET_NAME }}
256+
layerARN=$(
257+
aws lambda publish-layer-version \
258+
--layer-name ${{ env.LAYER_NAME }} \
259+
--content S3Bucket=${{ env.BUCKET_NAME }},S3Key=aws-opentelemetry-java-layer.zip \
260+
--compatible-runtimes java11 java17 java21 \
261+
--compatible-architectures "arm64" "x86_64" \
262+
--license-info "Apache-2.0" \
263+
--description "AWS Distro of OpenTelemetry Lambda Layer for Java Runtime" \
264+
--query 'LayerVersionArn' \
265+
--output text
266+
)
267+
echo $layerARN
268+
echo "LAYER_ARN=${layerARN}" >> $GITHUB_ENV
269+
mkdir ${{ env.LAYER_NAME }}
270+
echo $layerARN > ${{ env.LAYER_NAME }}/${{ matrix.aws_region }}
271+
cat ${{ env.LAYER_NAME }}/${{ matrix.aws_region }}
272+
273+
- name: public layer
274+
run: |
275+
layerVersion=$(
276+
aws lambda list-layer-versions \
277+
--layer-name ${{ env.LAYER_NAME }} \
278+
--query 'max_by(LayerVersions, &Version).Version'
279+
)
280+
aws lambda add-layer-version-permission \
281+
--layer-name ${{ env.LAYER_NAME }} \
282+
--version-number $layerVersion \
283+
--principal "*" \
284+
--statement-id publish \
285+
--action lambda:GetLayerVersion
286+
287+
- name: upload layer arn artifact
288+
if: ${{ success() }}
289+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 #v4.6.2
290+
with:
291+
name: ${{ env.LAYER_NAME }}-${{ matrix.aws_region }}
292+
path: ${{ env.LAYER_NAME }}/${{ matrix.aws_region }}
293+
294+
- name: clean s3
295+
if: always()
296+
run: |
297+
aws s3 rb --force s3://${{ env.BUCKET_NAME }}
298+
299+
generate-lambda-release-note:
300+
runs-on: ubuntu-latest
301+
needs: publish-layer-prod
302+
outputs:
303+
layer-note: ${{ steps.layer-note.outputs.layer-note }}
304+
steps:
305+
- name: Checkout Repo @ SHA - ${{ github.sha }}
306+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
307+
- uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd #v3.1.2
308+
- name: download layerARNs
309+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
310+
with:
311+
pattern: ${{ env.LAYER_NAME }}-*
312+
path: ${{ env.LAYER_NAME }}
313+
merge-multiple: true
314+
- name: show layerARNs
315+
run: |
316+
for file in ${{ env.LAYER_NAME }}/*
317+
do
318+
echo $file
319+
cat $file
320+
done
321+
- name: generate layer-note
322+
id: layer-note
323+
working-directory: ${{ env.LAYER_NAME }}
324+
run: |
325+
echo "| Region | Layer ARN |" >> ../layer-note
326+
echo "| ---- | ---- |" >> ../layer-note
327+
for file in *
328+
do
329+
read arn < $file
330+
echo "| " $file " | " $arn " |" >> ../layer-note
331+
done
332+
cd ..
333+
{
334+
echo "layer-note<<EOF"
335+
cat layer-note
336+
echo "EOF"
337+
} >> $GITHUB_OUTPUT
338+
cat layer-note
339+
- name: generate tf layer
340+
working-directory: ${{ env.LAYER_NAME }}
341+
run: |
342+
echo "locals {" >> ../layer_arns.tf
343+
echo " sdk_layer_arns = {" >> ../layer_arns.tf
344+
for file in *
345+
do
346+
read arn < $file
347+
echo " \""$file"\" = \""$arn"\"" >> ../layer_arns.tf
348+
done
349+
cd ..
350+
echo " }" >> layer_arns.tf
351+
echo "}" >> layer_arns.tf
352+
terraform fmt layer_arns.tf
353+
cat layer_arns.tf
354+
- name: generate layer ARN constants for CDK
355+
working-directory: ${{ env.LAYER_NAME }}
356+
run: |
357+
echo "{" > ../layer_cdk
358+
for file in *; do
359+
read arn < "$file"
360+
echo " \"$file\": \"$arn\"," >> ../layer_cdk
361+
done
362+
echo "}" >> ../layer_cdk
363+
cat ../layer_cdk
364+
365+
publish-github:
366+
needs: generate-lambda-release-note
367+
runs-on: ubuntu-latest
368+
steps:
369+
- name: Checkout Repo @ SHA - ${{ github.sha }}
370+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0
371+
372+
- name: Download SDK artifact
373+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
374+
with:
375+
name: ${{ env.ARTIFACT_NAME }}
376+
377+
- name: Download layer.zip artifact
378+
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 #v5.0.0
379+
with:
380+
name: layer.zip
128381

129-
- name: Create release
382+
- name: Rename artifacts
383+
run: |
384+
cp "aws-opentelemetry-agent-${{ github.event.inputs.version }}.jar" ${{ env.ARTIFACT_NAME }}
385+
cp aws-opentelemetry-java-layer.zip layer.zip
386+
387+
# Publish to GitHub releases
388+
- name: Create GH release
389+
id: create_release
130390
env:
131-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
391+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
132392
run: |
133-
# Download layer.zip from existing latest tagged SDK release note
134-
LATEST_SDK_VERSION=$(gh release list --repo "aws-observability/aws-otel-java-instrumentation" --json tagName,isLatest -q 'map(select(.isLatest==true)) | .[0].tagName')
135-
mkdir -p layer_artifact
136-
gh release download "$LATEST_SDK_VERSION" --repo "aws-observability/aws-otel-java-instrumentation" --pattern "layer.zip" --dir layer_artifact
137-
shasum -a 256 layer_artifact/layer.zip > layer_artifact/layer.zip.sha256
393+
# Extract versions from dependency files
394+
OTEL_INSTRUMENTATION_VERSION=$(grep "val otelVersion" dependencyManagement/build.gradle.kts | sed 's/.*= "\([^"]*\)".*/\1/')
395+
OTEL_CONTRIB_VERSION=$(grep "io.opentelemetry.contrib:opentelemetry-aws-xray" dependencyManagement/build.gradle.kts | sed 's/.*:\([^"]*\)".*/\1/')
396+
397+
# Create release notes
398+
cat > release_notes.md << EOF
399+
This release contains updates of the following upstream components:
400+
401+
OpenTelemetry Java Contrib - $OTEL_CONTRIB_VERSION
402+
Opentelemetry Instrumentation for Java - $OTEL_INSTRUMENTATION_VERSION
403+
404+
This release also publishes to public ECR and Maven Central.
405+
* See ADOT Java auto-instrumentation Docker image v${{ github.event.inputs.version }} in our public ECR repository:
406+
https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-java
407+
* See version ${{ github.event.inputs.version }} in our Maven Central repository:
408+
https://central.sonatype.com/artifact/software.amazon.opentelemetry/aws-opentelemetry-agent
409+
410+
This release also includes the AWS OpenTelemetry Lambda Layer for Java version ${{ github.event.inputs.version }}-$(echo $GITHUB_SHA | cut -c1-7).
411+
412+
Lambda Layer ARNs:
413+
${{ needs.generate-lambda-release-note.outputs.layer-note }}
414+
EOF
415+
416+
shasum -a 256 ${{ env.ARTIFACT_NAME }} > ${{ env.ARTIFACT_NAME }}.sha256
417+
shasum -a 256 layer.zip > layer.zip.sha256
138418
139419
gh release create --target "$GITHUB_REF_NAME" \
140420
--title "Release v${{ github.event.inputs.version }}" \
421+
--notes-file release_notes.md \
141422
--draft \
142423
"v${{ github.event.inputs.version }}" \
143424
${{ env.ARTIFACT_NAME }} \
144425
${{ env.ARTIFACT_NAME }}.sha256 \
145-
layer_artifact/layer.zip \
146-
layer_artifact/layer.zip.sha256
426+
layer.zip \
427+
layer.zip.sha256

0 commit comments

Comments
 (0)