Skip to content

Commit ac736d4

Browse files
Merge pull request #44 from multiversx/update-2023-12-27
Fix packaging of source code (package whole workspace when needed)
2 parents d5fd46b + 9f9ba58 commit ac736d4

6 files changed

Lines changed: 98 additions & 66 deletions

File tree

.github/workflows/run_long_integration_tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
- name: Build
2323
run: |
2424
export PYTHONPATH=.
25-
python ./integration_tests/test_previous_builds_are_reproducible.py --selected-builds "a.1" "a.2"
25+
python ./integration_tests/test_previous_builds_are_reproducible.py --selected-builds "a.1" "a.2" "a.3"
2626
2727
- name: Save artifacts
2828
uses: actions/upload-artifact@v3

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM ubuntu:22.04
22

33
# Constants
4-
ARG BUILDER_NAME="multiversx/sdk-rust-contract-builder:v5.3.0"
4+
ARG BUILDER_NAME="multiversx/sdk-rust-contract-builder:v5.4.0"
55
ARG VERSION_RUST="nightly-2023-05-26"
66
ARG VERSION_BINARYEN="version_112"
77
ARG DOWNLOAD_URL_BINARYEN="https://github.com/WebAssembly/binaryen/releases/download/${VERSION_BINARYEN}/binaryen-${VERSION_BINARYEN}-x86_64-linux.tar.gz"
@@ -39,7 +39,7 @@ RUN wget -O rustup.sh https://sh.rustup.rs && \
3939
rm -rf /rust/registry
4040

4141
# Install sc-tool
42-
RUN PATH="/rust/bin:${PATH}" CARGO_HOME=/rust RUSTUP_HOME=/rust cargo install multiversx-sc-meta --version ${VERSION_SC_META} && \
42+
RUN PATH="/rust/bin:${PATH}" CARGO_HOME=/rust RUSTUP_HOME=/rust cargo install multiversx-sc-meta --version ${VERSION_SC_META} --locked && \
4343
rm -rf /rust/registry
4444

4545
COPY "multiversx_sdk_rust_contract_builder" "/multiversx_sdk_rust_contract_builder"

build_with_docker.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def main(cli_args: List[str]):
2020
parser.add_argument("--packaged-src", type=str, help="source code packaged in a JSON file")
2121
parser.add_argument("--contract", type=str)
2222
parser.add_argument("--output", type=str, default=Path(os.getcwd()) / "output")
23+
parser.add_argument("--package-whole-project-src", action="store_true", default=False, help="include all project files in *.source.json (default: %(default)s)")
2324
parser.add_argument("--cargo-target-dir", help="deprecated parameter, not used anymore")
2425
parser.add_argument("--no-wasm-opt", action="store_true", default=False, help="do not optimize wasm files after the build (default: %(default)s)")
2526
parser.add_argument("--build-root", type=str, required=False, help="root path (within container) for the build (default: %(default)s)")
@@ -34,6 +35,7 @@ def main(cli_args: List[str]):
3435
packaged_src_path = Path(parsed_args.packaged_src).expanduser().resolve() if parsed_args.packaged_src else None
3536
contract_path = parsed_args.contract
3637
output_path = Path(parsed_args.output).expanduser().resolve()
38+
package_whole_project_src = parsed_args.package_whole_project_src
3739
no_wasm_opt = parsed_args.no_wasm_opt
3840
build_root = Path(parsed_args.build_root) if parsed_args.build_root else None
3941
cargo_verbose = parsed_args.cargo_verbose
@@ -95,6 +97,9 @@ def main(cli_args: List[str]):
9597
if build_root:
9698
entrypoint_args.extend(["--build-root", str(build_root)])
9799

100+
if package_whole_project_src:
101+
entrypoint_args.append("--package-whole-project-src")
102+
98103
# Run docker container
99104
args = docker_general_args + docker_mount_args + docker_env_args + [image] + entrypoint_args
100105
logger.info(f"Running docker: {args}")

integration_tests/previous_builds.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,42 @@ def __init__(self, name: str,
2222
previous_builds: List[PreviousBuild] = [
2323
PreviousBuild(
2424
name="a.1",
25-
project_archive_url="https://github.com/multiversx/mx-reproducible-contract-build-example-sc/archive/refs/tags/v0.4.0.zip",
26-
project_relative_path_in_archive="mx-reproducible-contract-build-example-sc-0.4.0",
25+
project_archive_url="https://github.com/multiversx/mx-exchange-sc/archive/refs/heads/reproducible-v2.1.1-staking-upgrade.zip",
26+
project_relative_path_in_archive="mx-exchange-sc-reproducible-v2.1.1-staking-upgrade",
2727
packaged_src_url=None,
2828
contract_name=None,
2929
expected_code_hashes={
30-
"adder": "9fd12f88f9474ba115fb75e9d18a8fdbc4f42147de005445048442d49c3aa725",
31-
"multisig": "2101bc2a7a31ea42e5ffaadd86c1640009690e93b1cb46c3566ba5eac2984e36",
32-
"multisig-full": "ef468403354b6d3a728f86101354359fe6864187d216f674d99b31fc05313a39",
33-
"multisig-view": "3690af76be10c0520e3c3545cde8d9ef6a15c2d0af74dbd8704b4909644049c9"
30+
"farm-staking": "6dc7c587b2cc4b177a192b709c092f3752b3dcf9ce1b484e69fe64dc333a9e0a",
31+
"farm": "931ca233826ff9dacd889967365db1cde9ed8402eb553de2a3b9d58b6ff1098d",
32+
"factory": "df06465b651594605466e817bfe9d8d7c68eef0f87df4a8d3266bcfb1bef6d83",
33+
"pair": "f3f08ebd758fada871c113c18017d9761f157d00b19c4d3beaba530e6c53afc2",
34+
"energy-factory": "241600c055df605cafd85b75d40b21316a6b35713485201b156d695b23c66a2f"
3435
},
35-
docker_image="multiversx/sdk-rust-contract-builder:v5.1.0"
36+
docker_image="multiversx/sdk-rust-contract-builder:v4.2.1"
3637
),
3738
PreviousBuild(
3839
name="a.2",
39-
project_archive_url="https://github.com/multiversx/mx-reproducible-contract-build-example-sc/archive/refs/tags/v0.4.3.zip",
40-
project_relative_path_in_archive="mx-reproducible-contract-build-example-sc-0.4.3",
40+
project_archive_url="https://github.com/multiversx/mx-metabonding-sc/archive/refs/heads/reproducible-v1.1.1.zip",
41+
project_relative_path_in_archive="mx-metabonding-sc-reproducible-v1.1.1",
42+
packaged_src_url=None,
43+
contract_name=None,
44+
expected_code_hashes={
45+
"metabonding": "897b19e1990f7c487c99c12f50722febe1ee4468bcd3a7405641966dfff2791d"
46+
},
47+
docker_image="multiversx/sdk-rust-contract-builder:v4.2.1"
48+
),
49+
PreviousBuild(
50+
name="a.3",
51+
project_archive_url="https://github.com/multiversx/mx-reproducible-contract-build-example-sc/archive/refs/tags/v0.4.6.zip",
52+
project_relative_path_in_archive="mx-reproducible-contract-build-example-sc-0.4.6",
4153
packaged_src_url=None,
4254
contract_name=None,
4355
expected_code_hashes={
4456
"adder": "9fd12f88f9474ba115fb75e9d18a8fdbc4f42147de005445048442d49c3aa725",
4557
"multisig": "b73050629c11b1f1a20ca6232abcef07897624195691552e3f2e2fce47822166",
4658
"multisig-full": "37c3b90bdaa7d8d203385c91b0b5cb4d3c444ab9ec5263351978046a545854e3",
47-
"multisig-view": "ebaf987b041fcda297da71291d76736e4e98a1e449e5ec37908cdc0198e8be37"
59+
"multisig-view": "ebaf987b041fcda297da71291d76736e4e98a1e449e5ec37908cdc0198e8be37",
60+
"lottery-esdt": "e06b1a5c7fb71181a79e9be6b86d8ad154e5c2def4da6d2f0aa5266163823291"
4861
},
4962
docker_image="multiversx/sdk-rust-contract-builder:v5.3.0"
5063
)

integration_tests/test_project_folder_and_packaged_src_are_equivalent.py

Lines changed: 66 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,64 +8,78 @@
88

99

1010
def main(cli_args: List[str]):
11-
# TODO: when possible, also add multiversx/mx-exchange-sc (as of May 2023, it references mx-sdk-rs < v0.41.0, thus cannot be used for testing reproducible builds v5).
12-
project_path = download_project_repository("https://github.com/multiversx/mx-reproducible-contract-build-example-sc/archive/refs/tags/v0.4.0.zip", "mx-exchange-sc-main")
13-
parent_output_using_project = PARENT_OUTPUT_FOLDER / "using-project"
14-
parent_output_using_packaged_src = PARENT_OUTPUT_FOLDER / "using-packaged-src"
15-
16-
shutil.rmtree(parent_output_using_project, ignore_errors=True)
17-
shutil.rmtree(parent_output_using_packaged_src, ignore_errors=True)
18-
19-
check_project_folder_and_packaged_src_are_equivalent(project_path, parent_output_using_project, parent_output_using_packaged_src, ["adder", "multisig"])
11+
repository_url = "https://github.com/multiversx/mx-reproducible-contract-build-example-sc"
12+
tag = "0.4.7-beta.1"
13+
archve_subfolder = f"mx-reproducible-contract-build-example-sc-{tag}"
14+
project_path = download_project_repository(f"{repository_url}/archive/refs/tags/v{tag}.zip", archve_subfolder)
15+
project_path = project_path / archve_subfolder
16+
17+
# Only package_whole_project_src = True works.
18+
# package_whole_project_src = False does not work, since a missing Cargo.lock at the workspace level leads to build errors.
19+
check_project_folder_and_packaged_src_are_equivalent(
20+
project_path=project_path,
21+
package_whole_project_src=True,
22+
parent_output_folder=PARENT_OUTPUT_FOLDER,
23+
contracts=["adder", "multisig"],
24+
)
2025

2126

2227
def check_project_folder_and_packaged_src_are_equivalent(
2328
project_path: Path,
24-
parent_output_using_project: Path,
25-
parent_output_using_packaged_src: Path,
29+
package_whole_project_src: bool,
30+
parent_output_folder: Path,
2631
contracts: List[str]):
2732
for contract in contracts:
28-
for package_whole_project_src in [True, False]:
29-
output_using_project = parent_output_using_project / contract / ("whole" if package_whole_project_src else "truncated")
30-
output_using_packaged_src = parent_output_using_packaged_src / contract / ("whole" if package_whole_project_src else "truncated")
31-
32-
output_using_packaged_src.mkdir(parents=True, exist_ok=True)
33-
output_using_project.mkdir(parents=True, exist_ok=True)
34-
35-
run_docker(
36-
project_path=project_path,
37-
package_whole_project_src=package_whole_project_src,
38-
packaged_src_path=None,
39-
contract_name=contract,
40-
image="sdk-rust-contract-builder:next",
41-
output_folder=output_using_project
42-
)
43-
44-
packaged_src_path = output_using_project / f"{contract}/{contract}-0.0.0.source.json"
45-
46-
run_docker(
47-
project_path=None,
48-
package_whole_project_src=package_whole_project_src,
49-
packaged_src_path=packaged_src_path,
50-
contract_name=contract,
51-
image="sdk-rust-contract-builder:next",
52-
output_folder=output_using_packaged_src
53-
)
54-
55-
# Check that output folders are identical
56-
using_project_output_files = sorted((output_using_project / contract).rglob("*"))
57-
using_packaged_src_output_files = sorted((output_using_packaged_src / contract).rglob("*"))
58-
59-
assert len(using_project_output_files) == len(using_packaged_src_output_files)
60-
61-
for index, file in enumerate(using_project_output_files):
62-
if not file.is_file() or file.suffix == ".zip":
63-
continue
64-
using_project_file_content = file.read_bytes()
65-
using_packaged_src_file_content = using_packaged_src_output_files[index].read_bytes()
66-
67-
if using_project_file_content != using_packaged_src_file_content:
68-
raise Exception(f"Files differ ({contract}): {file.name}")
33+
output_using_project = parent_output_folder / "using-project" / contract / ("whole" if package_whole_project_src else "truncated")
34+
output_using_packaged_src = parent_output_folder / "using-packaged-src" / contract / ("whole" if package_whole_project_src else "truncated")
35+
36+
shutil.rmtree(output_using_project, ignore_errors=True)
37+
shutil.rmtree(output_using_packaged_src, ignore_errors=True)
38+
39+
output_using_project.mkdir(parents=True, exist_ok=True)
40+
output_using_packaged_src.mkdir(parents=True, exist_ok=True)
41+
42+
run_docker(
43+
project_path=project_path,
44+
package_whole_project_src=package_whole_project_src,
45+
packaged_src_path=None,
46+
contract_name=contract,
47+
image="sdk-rust-contract-builder:next",
48+
output_folder=output_using_project
49+
)
50+
51+
packaged_src_path = output_using_project / f"{contract}/{contract}-0.0.0.source.json"
52+
53+
run_docker(
54+
project_path=None,
55+
package_whole_project_src=package_whole_project_src,
56+
packaged_src_path=packaged_src_path,
57+
contract_name=contract,
58+
image="sdk-rust-contract-builder:next",
59+
output_folder=output_using_packaged_src
60+
)
61+
62+
# Check that output folders are identical
63+
using_project_output_files = sorted((output_using_project / contract).rglob("*"))
64+
using_packaged_src_output_files = sorted((output_using_packaged_src / contract).rglob("*"))
65+
66+
assert len(using_project_output_files) == len(using_packaged_src_output_files)
67+
68+
for index, file_using_project in enumerate(using_project_output_files):
69+
file_using_packaged_src = using_packaged_src_output_files[index]
70+
71+
if not file_using_project.is_file() or file_using_project.suffix == ".zip":
72+
continue
73+
file_content_using_project = file_using_project.read_bytes()
74+
file_content_using_packaged_src = file_using_packaged_src.read_bytes()
75+
76+
if file_content_using_project == file_content_using_packaged_src:
77+
print(f"Files are identical ({contract}): {file_using_project.name}")
78+
else:
79+
print(f"Files differ ({contract}):")
80+
print(f" {file_using_project}")
81+
print(f" {file_using_packaged_src}")
82+
raise Exception(f"Files differ ({contract}): {file_using_project.name}")
6983

7084

7185
if __name__ == "__main__":

multiversx_sdk_rust_contract_builder/source_code.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def get_source_code_files(
5050
files_related_to_contract = set(file.path for file in source_code_files)
5151

5252
if include_unrelated_to_contract:
53-
all_files = get_all_files(contract_folder, _is_source_code_file)
53+
all_files = get_all_files(project_folder, _is_source_code_file)
5454
for file in all_files:
5555
if file not in files_related_to_contract:
5656
source_code_files.append(SourceCodeFile(file, contract_folder, sys.maxsize))

0 commit comments

Comments
 (0)