Landoscript#

This page covers how to test landoscript beyond running unit tests.

In addition to what’s here, it’s useful to familiarize yourself with more general scriptworker and scriptworker-scripts documentation.

Overview#

The tl;dr of landoscript is that it is responsible for making changes to github repositories that can only be modified by submitting changes to the Lando API.

All landoscript tasks (as of the time of writing) support a dry run mode, which will execute everything that a non-dry run task will, but bail out just before submitting the changes to Lando (which is the final step of the task). This makes it easy to run fairly extensive integration tests without making changes to any repositories, which gives a fairly high measure of confidence.

There are two ways to run dry runs:

  • Running landoscript locally. This is slightly more work to set-up initially, but makes iteration significantly faster. This method is recommended for early development or when less confident in the changes you’re making.

  • Running landoscript tasks on try. These are much easier to run, but it can take 20 minutes or more per iteration. These can be OK if you have high confidence in your changes, or are OK with the long iteration times.

Additionally, landoscript can be run out of dry run mode on Try, and will make changes to mozilla-releng/staging-firefox. These tests should usually be done before submitting a patch for review, but because they modify a repository they are sometimes trickier or more involved to set-up, and are often saved for a final sanity check. (More on this below.)

Testing Locally#

This is covered at a high level in the scriptworker-scripts documentation. The tl;dr is that you need a landoscript virtualenv, worker configuration file, and task.json.

It is recommended to run pip install -e . in the landoscript directory to install landoscript into the virtualenv. This will avoid the need to reinstall each time you make a change.

Your worker.json should look something like the following:

{
  "work_dir": "/home/bhearsum/tmp/landoscript-tests/work",
  "artifact_dir": "/home/bhearsum/tmp/landoscript-tests/artifacts",
  "verbose": true,
  "lando_api": "https://stage.lando.nonprod.webservices.mozgcp.net/api",
  "lando_token": "available in relengworker sops",
  "schema_file": "/home/bhearsum/repos/scriptworker-scripts/landoscript/src/landoscript/data/landoscript_task_schema.json",
  "treestatus_url: "https://treestatus.prod.lando.prod.cloudops.mozgcp.net",
  "github_config": {
	"privkey_file": "available in releng worker sops; see init-worker.sh for decoding instructions",
	"app_id": "1227773"
  },
  "poll_time": 30
}

The app_id above is that of the releng-read-only-dev app, which is installed in the repositories that landoscript needs to function.

Your task.json will need to be placed inside the work_dir. You can start with the payload and scopes from a live landoscript task, and perhaps append "dry_run": true to it. For example:

{
  "scopes": ["project:releng:lando:repo:main.json", "project:releng:lando:action:l10n_bump"],
  "payload": {
    "actions": ["l10n_bump"],
    "lando_repo": "main.json",
    "ignore_closed_tree": true,
    "l10n_bump_info": [
      {
        "name": "Firefox l10n changesets",
        "path": "browser/locales/l10n-changesets.json",
        "ignore_config": {
          "ja": [
            "macosx64",
            "macosx64-devedition"
          ],
          "ja-JP-mac": [
            "linux",
            "linux-devedition",
            "linux64",
            "linux64-aarch64",
            "linux64-devedition",
            "linux64-aarch64-devedition",
            "win32",
            "win32-devedition",
            "win64",
            "win64-devedition",
            "win64-aarch64",
            "win64-aarch64-devedition"
          ]
        },
        "l10n_repo_url": "https://github.com/bhearsum/firefox-l10n",
        "platform_configs": [
          {
            "path": "browser/locales/all-locales",
            "platforms": [
              "linux",
              "linux-devedition",
              "linux64",
              "linux64-aarch64",
              "linux64-devedition",
              "linux64-aarch64-devedition",
              "macosx64",
              "macosx64-devedition",
              "win32",
              "win32-devedition",
              "win64",
              "win64-devedition",
              "win64-aarch64",
              "win64-aarch64-devedition"
            ]
          }
        ],
        "l10n_repo_target_branch": "main"
      },
      {
        "name": "Mobile l10n changesets",
        "path": "mobile/locales/l10n-changesets.json",
        "l10n_repo_url": "https://github.com/bhearsum/firefox-l10n",
        "platform_configs": [
          {
            "path": "mobile/android/locales/all-locales",
            "platforms": [
              "android",
              "android-arm",
              "android-multilocale"
            ]
          }
        ],
        "l10n_repo_target_branch": "main"
      }
    ],
    "dry_run": true
  }
}

Once you have all those things in place, you can run the following in the directory containing worker.json to execute the task:

artifact_dir="YOUR_ARTIFACT_DIR"
rm -rf $artifact_dir
landoscript worker.json

Depending on how you prefer to work, you may want to pipe the output to a file, or through tee. In either case, once the task is complete you can assess the result through a combination of:

  • The exit code (echo $?)

  • The log output

  • The artifacts in your artifact_dir

Any landoscript task that would’ve submitted a change to a repository (or did, in the case of a non-dry run) will publish a lando-actions.json artifact containing the payload of the submission to Lando. Most landoscript tasks publish artifact artifacts containing things such as specific diffs to help assess their results.

Testing on Try#

In this section we will cover testing on Try. Non dry-run tasks involve a bit of extra set-up. If you’re running dry-run tasks, simply skip the next section.

Repository setup#

When running non-dry run tasks you must ensure that mozilla-releng/staging-firefox is in a state where the branch you’re testing on does not already have the changes that landoscript is expected to make. In most cases this can be achieved by resetting the branch to the current state of the upstream mozilla-firefox/firefox repository. To do this, you’ll need to force push that repository’s branch to the staging repository with something like the following:

~/repos/firefox main *20 ❯ git remote -v | grep '\(upstream\|staging\)'
staging	git@github.com:mozilla-releng/staging-firefox.git (fetch)
staging	git@github.com:mozilla-releng/staging-firefox.git (push)
upstream	git@github.com:mozilla-firefox/firefox.git (fetch)
upstream	git@github.com:mozilla-firefox/firefox.git (push)
~/repos/firefox main *20 ❯ git push -f staging upstream/main:main        
To github.com:mozilla-releng/staging-firefox.git
 + d85abd381aa4...83b2199691c1 upstream/main -> main (forced update)

Note that depending on what your testing, you’ll need to update different branches. (eg: testing a beta release will involve updating the beta branch). When testing merge-automation tasks, the to_branch is the one needs to in a good state.

You may also need to delete tags from the staging-firefox repository if your test is expected to create them.

If you have force pushed to any branch or deleted any tags you must poke the VCS folks and ask them to “delete the repo directory and restart tnhe automation worker” to clear out any now-stale refs or tags. (This will no longer be necessary after this bug is fixed.)

Running landoscript tasks on Try#

There are multiple ways to run landoscript tasks on Try. Below are recommendations for each task type.

android-l10n-import / android-l10n-sync / l10n-bump#

Simply push to try with ./mach try fuzzy and select one or both of the tasks. (Note that in production, android-l10n-sync only runs on beta, but the task is branch-agnostic, so running it from a main based Try push is generally OK.)

release-early-tagging#

Run a staging release on a Try push; this task will run as soon as the promote phase is scheduled.

release-version-bump#

Run a staging release on a Try push. Start the staging release at the ship phase. You can then use taskcluster api queue scheduleTask $taskid to immediately start the release-version-bump task. (Although this task has upstream dependencies, it does not fetch any artifacts from them - so this is safe to do.)

merge-automation#

Merge automation tasks can be tested by pushing to try with ./mach try empty and using Custom Push Actions in Treeherder to run the task you want (see the Merge Duty documentation for how to do this). Take care to push to try from the branch the task would run on in production. For example, an esr128 based branch when testing bump-esr128, or a beta based branch when testing beta-to-release.