-
Notifications
You must be signed in to change notification settings - Fork 49
Reenable incremental builds #162
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?
Reenable incremental builds #162
Conversation
MatthewHambley
left a comment
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.
Some improvements possible to structure and code. Also some lack of clarity regarding why certain things are done in certain ways.
build/extract/extract_science.py
Outdated
| """ | ||
|
|
||
| tempdir = Path(tempfile.mkdtemp()) | ||
| use_mirrors: bool = (os.getenv('LOCAL_BUILD_MIRRORS', 'False') == 'True') |
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.
For something like this it might be best to test merely on the presence of the variable. This avoids the game of guess the magic value.
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.
Changed to use presence of the path
|
|
||
| tempdir = Path(tempfile.mkdtemp()) | ||
| use_mirrors: bool = (os.getenv('LOCAL_BUILD_MIRRORS', 'False') == 'True') | ||
| mirror_loc: Path = os.getenv("MIRROR_LOC", "") |
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.
Or, in fact, the presence of the variable could signal the requirement while it's content is the location. And how about whole words while we're at it? MIRROR_LOCATION
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.
Sure, happy to use that here
build/extract/extract_science.py
Outdated
| if not mirror_loc and use_mirrors: | ||
| raise KeyError( | ||
| "Use Mirrors is set true, but the MIRROR_LOC environment variable hasn't" | ||
| "been set" | ||
| ) | ||
|
|
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.
Given the above, there is no longer a need for this test.
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.
Rep, removed
build/extract/get_git_sources.py
Outdated
| # which you should have received as part of this distribution. | ||
| # *****************************COPYRIGHT******************************* | ||
| """ | ||
| Clone sources for a rose-stem run for use with git bdiff module in scripts |
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.
Does it not also clone them for interactive builds? More generally I don't see any explanation as to why this complicated thing needs to be done.
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.
A copy and paste error, changed
| ) -> None: | ||
|
|
||
| if ".git" in source: | ||
| if use_mirrors: |
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.
For a future change, it may be possible to use a class to wrap repository access. That way the test can be performed once, the correct object instantiated and no further concerns had about which one it is.
| commands = ( | ||
| f"git -C {loc} init", | ||
| f"git -C {loc} remote add origin {repo_source}", | ||
| f"git -C {loc} fetch origin {repo_ref}", | ||
| f"git -C {loc} checkout FETCH_HEAD", | ||
| f"git -C {loc} fetch origin main:main", | ||
| ) |
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.
This seems a lot of effort. Doesn't it just recreate a clone?
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.
Yes, it was initially written to see if we could save space while cloning sources for use in rose-stem. It turns out the difference is very small, but as this was marginally smaller, I left it in. Given it's copied from SimSys_Scripts I don't think it's worth modifying here
| # Fetch the main branch from origin | ||
| # Ignore errors - these are likely because the main branch already exists | ||
| # Instead write them as warnings | ||
| command = f"git -C {loc} fetch origin main:main" |
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.
If you need to treat the copy as a repository, why not clone it. That's what distributed repositories are all about. You might take advantage of a sparse clone to gain the advantage of filtering you are getting from the rsync exclusion list.
build/local_build.py
Outdated
| """ | ||
|
|
||
| return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | ||
| return Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
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.
From memory:
| return Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| Path(__file__).absolute.parent.parent |
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.
Ta - absolute is a function but otherwise good
build/local_build.py
Outdated
| args.working_dir = Path(project_path) / "working" | ||
| else: | ||
| # If the working dir doesn't end in working, set that here | ||
| if not args.working_dir.strip("/").endswith("working"): |
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.
This test is easier to do when working with a Path object. working_dir.name == 'working'. You can use type-Path with add_argument() to have argparse give it the correct type and reject anything which wont parse as a path.
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.
Thanks, done
| | ``-m --mirrors`` | False | If True, this will attempt | | ||
| | ``store_true`` | | to extract using local | | ||
| | | | github mirrors | | ||
| +----------------------+-----------------------------+-----------------------------+ | ||
| | ``--mirror-loc`` | MetOffice Mirror Location | The path to the github | | ||
| | | | mirror location | |
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.
As previously, why not collapse these into a single argument for mirror location? The need to use mirrors determined by the prevision of a mirror location to use.
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.
For the environment variables passed to extract_science.py then yes I agree, we can use the presence of the mirror location variable to show whether we're using the mirrors.
For local_build.py (which these docs are referring to) I think we want the --mirrors store_true argument as otherwise we'll need to always pass the location of the mirrors as an argument when using them, which isn't ideal
…mo/lfric_apps into improve_local_builds
james-bruten-mo
left a comment
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.
Thanks Matthew - those comments are addressed, and for the most part changes done
build/extract/extract_science.py
Outdated
| """ | ||
|
|
||
| tempdir = Path(tempfile.mkdtemp()) | ||
| use_mirrors: bool = (os.getenv('LOCAL_BUILD_MIRRORS', 'False') == 'True') |
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.
Changed to use presence of the path
|
|
||
| tempdir = Path(tempfile.mkdtemp()) | ||
| use_mirrors: bool = (os.getenv('LOCAL_BUILD_MIRRORS', 'False') == 'True') | ||
| mirror_loc: Path = os.getenv("MIRROR_LOC", "") |
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.
Sure, happy to use that here
build/extract/extract_science.py
Outdated
| if not mirror_loc and use_mirrors: | ||
| raise KeyError( | ||
| "Use Mirrors is set true, but the MIRROR_LOC environment variable hasn't" | ||
| "been set" | ||
| ) | ||
|
|
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.
Rep, removed
build/extract/get_git_sources.py
Outdated
| # which you should have received as part of this distribution. | ||
| # *****************************COPYRIGHT******************************* | ||
| """ | ||
| Clone sources for a rose-stem run for use with git bdiff module in scripts |
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.
A copy and paste error, changed
| sync_repo(source, ref, dest) | ||
|
|
||
|
|
||
| def run_command( |
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.
Potentially not - it's a function I tend to copy and paste around to let me set the defaults as I want them, eg. I don't always have to set the text or timeout entries. Given it matches the version on SimSys_Scripts I'm happy to keep it here
| def clone_repo(repo_source: str, repo_ref: str, loc: Path) -> None: | ||
| """ | ||
| Clone the repo and checkout the provided ref | ||
| Only if a remote source | ||
| """ |
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.
Done
| commands = ( | ||
| f"git -C {loc} init", | ||
| f"git -C {loc} remote add origin {repo_source}", | ||
| f"git -C {loc} fetch origin {repo_ref}", | ||
| f"git -C {loc} checkout FETCH_HEAD", | ||
| f"git -C {loc} fetch origin main:main", | ||
| ) |
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.
Yes, it was initially written to see if we could save space while cloning sources for use in rose-stem. It turns out the difference is very small, but as this was marginally smaller, I left it in. Given it's copied from SimSys_Scripts I don't think it's worth modifying here
build/local_build.py
Outdated
| """ | ||
|
|
||
| return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | ||
| return Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
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.
Ta - absolute is a function but otherwise good
| | ``-m --mirrors`` | False | If True, this will attempt | | ||
| | ``store_true`` | | to extract using local | | ||
| | | | github mirrors | | ||
| +----------------------+-----------------------------+-----------------------------+ | ||
| | ``--mirror-loc`` | MetOffice Mirror Location | The path to the github | | ||
| | | | mirror location | |
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.
For the environment variables passed to extract_science.py then yes I agree, we can use the presence of the mirror location variable to show whether we're using the mirrors.
For local_build.py (which these docs are referring to) I think we want the --mirrors store_true argument as otherwise we'll need to always pass the location of the mirrors as an argument when using them, which isn't ideal
build/local_build.py
Outdated
| args.working_dir = Path(project_path) / "working" | ||
| else: | ||
| # If the working dir doesn't end in working, set that here | ||
| if not args.working_dir.strip("/").endswith("working"): |
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.
Thanks, done
PR Summary
Sci/Tech Reviewer: @MatthewHambley
Code Reviewer: @t00sa
At the git migration incremental builds on the command line no longer worked as timestamps in github are based on clone date, not commit date. This reenables this functionality by fetching/pulling changes if the build is being rerun. This has been tested on the command line for both a run with physics code (lfric_atm) and without (gungho_model). The 2nd build time is much quicker as expected.
This also enables building using the local github mirrors which will be useful once these are also available on the HPC. Again, these have been tested on the cli and with incremental builds.
This change adds
get_git_sourceswhich is mostly a copy of the same file from SimSys_Scripts. Having 2 copies isn't ideal, but I can't think of another way to make that SimSys_Scripts file available when building locally (short of installing it as a library). Hopefully this is something that'll be improved by fab!Code Quality Checklist
Testing
trac.log
Test Suite Results - lfric_apps - test_incremental_builds_change/run2
Suite Information
Task Information
✅ succeeded tasks - 1106
Security Considerations
Performance Impact
AI Assistance and Attribution
Documentation
PSyclone Approval
Sci/Tech Review
(Please alert the code reviewer via a tag when you have approved the SR)
Code Review