repro-lambda 0.2.1__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/.github/workflows/build.yml +21 -8
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/CHANGELOG.md +13 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/PKG-INFO +1 -1
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/pyproject.toml +1 -1
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/__init__.py +1 -1
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_build_integration.py +7 -7
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_build_nodejs.py +5 -5
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_cli_build.py +2 -2
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_s3_uploader.py +2 -2
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/uv.lock +1 -1
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/.github/workflows/ci.yml +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/.github/workflows/publish.yml +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/.gitignore +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/.pre-commit-config.yaml +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/LICENSE +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/README.md +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/SETUP.md +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/__main__.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/build.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/catalog.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/cli.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/docker_runner.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/git_guard.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/hasher.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/manifest.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/s3_uploader.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/source_stager.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/verify.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/src/repro_lambda/zip_packager.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/__init__.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/conftest.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_nodejs_lambda/handler/index.js +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_nodejs_lambda/handler/package-lock.json +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_nodejs_lambda/handler/package.json +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_nodejs_lambda/lambdas.toml +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_python_lambda/handler/app.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_python_lambda/handler/requirements.arm64.lock +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_python_lambda/handler/requirements.in +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_python_lambda/lambdas.toml +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_catalog.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_cli_lock.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_cli_smoke.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_docker_runner.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_docker_runner_nodejs.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_e2e_nodejs_lambda.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_e2e_python_lambda.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_git_guard.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_hasher.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_manifest.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_python_byte_compat_regression.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_source_stager.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_verify.py +0 -0
- {repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/test_zip_packager.py +0 -0
|
@@ -9,13 +9,26 @@ on:
|
|
|
9
9
|
description: Path to lambdas.toml in the caller repo.
|
|
10
10
|
repro_lambda_version:
|
|
11
11
|
type: string
|
|
12
|
-
default: "0.2.
|
|
12
|
+
default: "0.2.2"
|
|
13
13
|
description: Pinned repro-lambda PyPI version.
|
|
14
|
-
secrets:
|
|
15
14
|
aws-dev-role-arn:
|
|
15
|
+
type: string
|
|
16
16
|
required: true
|
|
17
|
+
description: ARN of the dev OIDC role assumed for artifact upload. Not a secret (the security boundary is the OIDC trust policy + bucket immutability), so callers pass it as a plain input.
|
|
17
18
|
aws-prod-role-arn:
|
|
19
|
+
type: string
|
|
20
|
+
required: false
|
|
21
|
+
default: ""
|
|
22
|
+
description: ARN of the prod OIDC role (master push only). Empty string disables the prod upload steps.
|
|
23
|
+
dev-bucket:
|
|
24
|
+
type: string
|
|
25
|
+
required: true
|
|
26
|
+
description: S3 bucket name for dev Lambda artifacts (set as REPRO_LAMBDA_BUCKET on the dev upload). Caller-supplied so the reusable workflow stays consumer-agnostic.
|
|
27
|
+
prod-bucket:
|
|
28
|
+
type: string
|
|
18
29
|
required: false
|
|
30
|
+
default: ""
|
|
31
|
+
description: S3 bucket name for prod Lambda artifacts (master push only).
|
|
19
32
|
|
|
20
33
|
jobs:
|
|
21
34
|
detect-arches:
|
|
@@ -58,12 +71,12 @@ jobs:
|
|
|
58
71
|
- name: Configure AWS credentials (dev)
|
|
59
72
|
uses: aws-actions/configure-aws-credentials@v4
|
|
60
73
|
with:
|
|
61
|
-
role-to-assume: ${{
|
|
74
|
+
role-to-assume: ${{ inputs.aws-dev-role-arn }}
|
|
62
75
|
aws-region: eu-west-1
|
|
63
76
|
|
|
64
77
|
- name: Build (dev bucket)
|
|
65
78
|
env:
|
|
66
|
-
REPRO_LAMBDA_BUCKET: dev-
|
|
79
|
+
REPRO_LAMBDA_BUCKET: ${{ inputs.dev-bucket }}
|
|
67
80
|
run: uvx --from "repro-lambda==${{ inputs.repro_lambda_version }}" repro-lambda build --manifest "${{ inputs.manifest_path }}"
|
|
68
81
|
|
|
69
82
|
- name: Verify reproducible (PR only)
|
|
@@ -71,16 +84,16 @@ jobs:
|
|
|
71
84
|
run: uvx --from "repro-lambda==${{ inputs.repro_lambda_version }}" repro-lambda build --manifest "${{ inputs.manifest_path }}" --verify --dry-run
|
|
72
85
|
|
|
73
86
|
- name: Configure AWS credentials (prod)
|
|
74
|
-
if: github.ref == 'refs/heads/master' &&
|
|
87
|
+
if: github.ref == 'refs/heads/master' && inputs.aws-prod-role-arn != ''
|
|
75
88
|
uses: aws-actions/configure-aws-credentials@v4
|
|
76
89
|
with:
|
|
77
|
-
role-to-assume: ${{
|
|
90
|
+
role-to-assume: ${{ inputs.aws-prod-role-arn }}
|
|
78
91
|
aws-region: eu-west-1
|
|
79
92
|
|
|
80
93
|
- name: Build (prod bucket)
|
|
81
|
-
if: github.ref == 'refs/heads/master' &&
|
|
94
|
+
if: github.ref == 'refs/heads/master' && inputs.aws-prod-role-arn != ''
|
|
82
95
|
env:
|
|
83
|
-
REPRO_LAMBDA_BUCKET: prod-
|
|
96
|
+
REPRO_LAMBDA_BUCKET: ${{ inputs.prod-bucket }}
|
|
84
97
|
run: uvx --from "repro-lambda==${{ inputs.repro_lambda_version }}" repro-lambda build --manifest "${{ inputs.manifest_path }}"
|
|
85
98
|
|
|
86
99
|
- name: Commit catalog drift (master only, dev bot)
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.2.2 - 2026-06-20
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Reusable workflow `build.yml` now takes `aws-dev-role-arn` and `aws-prod-role-arn` as **inputs** instead of **secrets**. A role ARN is not sensitive (the security boundary is the OIDC trust policy plus the key-level bucket immutability policy), and typing it as a secret blocked callers from passing a derivable literal ARN, since secret inputs reject plain literal values. No package code change: PyPI 0.2.2 is behaviorally identical to 0.2.1.
|
|
7
|
+
- Artifact bucket names are now `dev-bucket` / `prod-bucket` **inputs** instead of hardcoded values, so the reusable workflow is consumer-agnostic and carries no environment-specific bucket names.
|
|
8
|
+
|
|
9
|
+
### Consumer migration
|
|
10
|
+
- Bump the workflow ref to `uses: antonbabenko/repro-lambda/.github/workflows/build.yml@v0.2.2` and move `aws-dev-role-arn` / `aws-prod-role-arn` to the `with:` block, adding `dev-bucket` (and `prod-bucket` if you upload to prod). They are inputs now, so plain literals are valid:
|
|
11
|
+
|
|
12
|
+
with:
|
|
13
|
+
aws-dev-role-arn: arn:aws:iam::<account>:role/<role>
|
|
14
|
+
dev-bucket: <env>-my-lambda-artifacts
|
|
15
|
+
|
|
3
16
|
## v0.2.1 - 2026-05-27
|
|
4
17
|
|
|
5
18
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: repro-lambda
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Build reproducible AWS Lambda packages outside Terraform, optimized for terraform-aws-lambda by serverless.tf.
|
|
5
5
|
Project-URL: Homepage, https://github.com/antonbabenko/repro-lambda
|
|
6
6
|
Project-URL: Repository, https://github.com/antonbabenko/repro-lambda
|
|
@@ -61,12 +61,12 @@ def test_build_one_cache_hit_skips_docker_and_returns_existing_sha(
|
|
|
61
61
|
with mock_aws():
|
|
62
62
|
s3 = boto3.client("s3", region_name="eu-west-1")
|
|
63
63
|
s3.create_bucket(
|
|
64
|
-
Bucket="dev-
|
|
64
|
+
Bucket="dev-test-lambda-artifacts",
|
|
65
65
|
CreateBucketConfiguration={"LocationConstraint": "eu-west-1"},
|
|
66
66
|
)
|
|
67
67
|
sha = compute_sha_for(repo_root=git_repo_with_sample, spec=spec, builder=builder)
|
|
68
68
|
s3.put_object(
|
|
69
|
-
Bucket="dev-
|
|
69
|
+
Bucket="dev-test-lambda-artifacts",
|
|
70
70
|
Key=f"lambdas/app/{sha}.zip",
|
|
71
71
|
Body=b"existing",
|
|
72
72
|
)
|
|
@@ -75,7 +75,7 @@ def test_build_one_cache_hit_skips_docker_and_returns_existing_sha(
|
|
|
75
75
|
repo_root=git_repo_with_sample,
|
|
76
76
|
spec=spec,
|
|
77
77
|
builder=builder,
|
|
78
|
-
bucket="dev-
|
|
78
|
+
bucket="dev-test-lambda-artifacts",
|
|
79
79
|
catalog=catalog,
|
|
80
80
|
source_commit="deadbeef",
|
|
81
81
|
)
|
|
@@ -99,7 +99,7 @@ def test_build_one_cache_miss_runs_docker_uploads_and_records(git_repo_with_samp
|
|
|
99
99
|
with mock_aws():
|
|
100
100
|
s3 = boto3.client("s3", region_name="eu-west-1")
|
|
101
101
|
s3.create_bucket(
|
|
102
|
-
Bucket="dev-
|
|
102
|
+
Bucket="dev-test-lambda-artifacts",
|
|
103
103
|
CreateBucketConfiguration={"LocationConstraint": "eu-west-1"},
|
|
104
104
|
)
|
|
105
105
|
|
|
@@ -107,14 +107,14 @@ def test_build_one_cache_miss_runs_docker_uploads_and_records(git_repo_with_samp
|
|
|
107
107
|
repo_root=git_repo_with_sample,
|
|
108
108
|
spec=spec,
|
|
109
109
|
builder=builder,
|
|
110
|
-
bucket="dev-
|
|
110
|
+
bucket="dev-test-lambda-artifacts",
|
|
111
111
|
catalog=catalog,
|
|
112
112
|
source_commit="deadbeef",
|
|
113
113
|
)
|
|
114
114
|
|
|
115
115
|
assert outcome.outcome == BuildResult.BUILT_AND_UPLOADED
|
|
116
116
|
s3.head_object(
|
|
117
|
-
Bucket="dev-
|
|
117
|
+
Bucket="dev-test-lambda-artifacts",
|
|
118
118
|
Key=f"lambdas/app/{outcome.sha256}.zip",
|
|
119
119
|
)
|
|
120
120
|
|
|
@@ -134,7 +134,7 @@ def test_build_one_dry_run_computes_hash_but_skips_upload(git_repo_with_sample:
|
|
|
134
134
|
repo_root=git_repo_with_sample,
|
|
135
135
|
spec=spec,
|
|
136
136
|
builder=builder,
|
|
137
|
-
bucket="dev-
|
|
137
|
+
bucket="dev-test-lambda-artifacts",
|
|
138
138
|
catalog=catalog,
|
|
139
139
|
source_commit="deadbeef",
|
|
140
140
|
dry_run=True,
|
|
@@ -60,12 +60,12 @@ def test_build_one_nodejs_routes_to_build_nodejs_lambda(git_repo_with_nodejs_sam
|
|
|
60
60
|
|
|
61
61
|
with mock_aws():
|
|
62
62
|
s3 = boto3.client("s3", region_name="us-east-1")
|
|
63
|
-
s3.create_bucket(Bucket="dev-
|
|
63
|
+
s3.create_bucket(Bucket="dev-test-lambda-artifacts-us-east-1")
|
|
64
64
|
outcome = build_one(
|
|
65
65
|
repo_root=git_repo_with_nodejs_sample,
|
|
66
66
|
spec=_nodejs_spec(),
|
|
67
67
|
builder=_nodejs_builder(),
|
|
68
|
-
bucket="dev-
|
|
68
|
+
bucket="dev-test-lambda-artifacts",
|
|
69
69
|
catalog=Catalog(lambdas={}),
|
|
70
70
|
source_commit="deadbeef",
|
|
71
71
|
)
|
|
@@ -84,16 +84,16 @@ def test_build_one_lambda_at_edge_uses_us_east_1_bucket(git_repo_with_nodejs_sam
|
|
|
84
84
|
)
|
|
85
85
|
with mock_aws():
|
|
86
86
|
s3 = boto3.client("s3", region_name="us-east-1")
|
|
87
|
-
s3.create_bucket(Bucket="dev-
|
|
87
|
+
s3.create_bucket(Bucket="dev-test-lambda-artifacts-us-east-1")
|
|
88
88
|
outcome = build_one(
|
|
89
89
|
repo_root=git_repo_with_nodejs_sample,
|
|
90
90
|
spec=_nodejs_spec(),
|
|
91
91
|
builder=_nodejs_builder(),
|
|
92
|
-
bucket="dev-
|
|
92
|
+
bucket="dev-test-lambda-artifacts",
|
|
93
93
|
catalog=Catalog(lambdas={}),
|
|
94
94
|
source_commit="deadbeef",
|
|
95
95
|
)
|
|
96
96
|
s3.head_object(
|
|
97
|
-
Bucket="dev-
|
|
97
|
+
Bucket="dev-test-lambda-artifacts-us-east-1",
|
|
98
98
|
Key=f"lambdas/edge/{outcome.sha256}.zip",
|
|
99
99
|
)
|
|
@@ -70,13 +70,13 @@ def test_cli_build_emits_catalog_on_success(consumer_repo: Path, mocker):
|
|
|
70
70
|
)
|
|
71
71
|
with mock_aws():
|
|
72
72
|
boto3.client("s3", region_name="eu-west-1").create_bucket(
|
|
73
|
-
Bucket="dev-
|
|
73
|
+
Bucket="dev-test-lambda-artifacts",
|
|
74
74
|
CreateBucketConfiguration={"LocationConstraint": "eu-west-1"},
|
|
75
75
|
)
|
|
76
76
|
result = runner.invoke(
|
|
77
77
|
app,
|
|
78
78
|
["build", "app", "--manifest", str(consumer_repo / "lambdas.toml")],
|
|
79
|
-
env={"REPRO_LAMBDA_BUCKET": "dev-
|
|
79
|
+
env={"REPRO_LAMBDA_BUCKET": "dev-test-lambda-artifacts"},
|
|
80
80
|
)
|
|
81
81
|
assert result.exit_code == 0, result.stdout
|
|
82
82
|
catalog_path = consumer_repo / "builds" / "catalog.json"
|
|
@@ -12,10 +12,10 @@ def bucket():
|
|
|
12
12
|
with mock_aws():
|
|
13
13
|
s3 = boto3.client("s3", region_name="eu-west-1")
|
|
14
14
|
s3.create_bucket(
|
|
15
|
-
Bucket="dev-
|
|
15
|
+
Bucket="dev-test-lambda-artifacts",
|
|
16
16
|
CreateBucketConfiguration={"LocationConstraint": "eu-west-1"},
|
|
17
17
|
)
|
|
18
|
-
yield "dev-
|
|
18
|
+
yield "dev-test-lambda-artifacts"
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def _make_zip(tmp_path: Path, content: bytes = b"PK\x05\x06" + b"\x00" * 18) -> Path:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_nodejs_lambda/handler/index.js
RENAMED
|
File without changes
|
|
File without changes
|
{repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_nodejs_lambda/handler/package.json
RENAMED
|
File without changes
|
|
File without changes
|
{repro_lambda-0.2.1 → repro_lambda-0.2.2}/tests/fixtures/sample_python_lambda/handler/app.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|