From 9fced64146452e1186747bd1ff571203285f06fa Mon Sep 17 00:00:00 2001 From: Joey Perrott Date: Tue, 12 Nov 2024 17:01:26 +0000 Subject: [PATCH] ci: remove circleci as we no longer rely on it (#58615) Remove CircleCI artifacts and configuration PR Close #58615 --- .bazelrc | 6 -- .circleci/README.md | 19 ------ .circleci/bazel.common.rc | 16 ----- .circleci/bazel.linux.rc | 23 ------- .circleci/bazel.windows.rc | 17 ------ .circleci/config.yml | 16 ----- .circleci/env-helpers.inc.sh | 76 ----------------------- .circleci/env.linux.sh | 4 -- .circleci/env.sh | 88 --------------------------- .circleci/env.windows.sh | 13 ---- .circleci/setup_cache.sh | 11 ---- .devcontainer/recommended-Dockerfile | 3 +- .gitignore | 4 -- .pullapprove.yml | 1 - CONTRIBUTING.md | 2 +- README.md | 9 --- integration/README.md | 2 +- integration/run_tests.sh | 1 - karma-js.conf.js | 2 +- scripts/ci/publish-build-artifacts.sh | 1 - tools/saucelabs-daemon/README.md | 2 +- tools/saucelabs/sauce-service.sh | 2 +- 22 files changed, 6 insertions(+), 312 deletions(-) delete mode 100644 .circleci/README.md delete mode 100644 .circleci/bazel.common.rc delete mode 100644 .circleci/bazel.linux.rc delete mode 100644 .circleci/bazel.windows.rc delete mode 100644 .circleci/config.yml delete mode 100644 .circleci/env-helpers.inc.sh delete mode 100755 .circleci/env.linux.sh delete mode 100755 .circleci/env.sh delete mode 100755 .circleci/env.windows.sh delete mode 100755 .circleci/setup_cache.sh diff --git a/.bazelrc b/.bazelrc index aca58640cc7..5049882e2dc 100644 --- a/.bazelrc +++ b/.bazelrc @@ -78,12 +78,6 @@ query --output=label_kind # By default, failing tests don't print any output, it goes to the log file test --test_output=errors -################################ -# Settings for CircleCI # -################################ - -# Bazel flags for CircleCI are in /.circleci/bazel.linux.rc and /.circleci/bazel.windows.rc - ################################## # Remote Build Execution support # # Turn on these settings with # diff --git a/.circleci/README.md b/.circleci/README.md deleted file mode 100644 index cddaf76fe8c..00000000000 --- a/.circleci/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Encryption - -Based on https://github.com/circleci/encrypted-files - -In the CircleCI web UI, we have a secret variable called `KEY` -https://circleci.com/gh/angular/angular/edit#env-vars -which is only exposed to non-fork builds -(see "Pass secrets to builds from forked pull requests" under -https://circleci.com/gh/angular/angular/edit#advanced-settings) - -We use this as a symmetric AES encryption key to encrypt tokens like -a GitHub token that enables publishing snapshots. - -To create the github_token file, we take this approach: -- Find the angular-builds:token in the internal pw database -- Go inside the CircleCI default docker image so you use the same version of openssl as we will at runtime: `docker run --rm -it circleci/node:10.12` -- echo "https://[token]:@github.com" > credentials -- openssl aes-256-cbc -e -in credentials -out .circleci/github_token -k $KEY -- If needed, base64-encode the result so you can copy-paste it out of docker: `base64 github_token` diff --git a/.circleci/bazel.common.rc b/.circleci/bazel.common.rc deleted file mode 100644 index 2b4c9ec625d..00000000000 --- a/.circleci/bazel.common.rc +++ /dev/null @@ -1,16 +0,0 @@ -# Settings in this file should be OS agnostic. Use the bazel..rc files for OS specific settings. - -# Print all the options that apply to the build. -# This helps us diagnose which options override others -# (e.g. /etc/bazel.bazelrc vs. tools/bazel.rc) -build --announce_rc - -# Retry in the event of flakes, eg. https://circleci.com/gh/angular/angular/31309 -# By default this is set in the project `.bazelrc` to `1`. -test --flaky_test_attempts=3 - -# More details on failures -build --verbose_failures=true - -# CI supports colors but Bazel does not detect it. -common --color=yes diff --git a/.circleci/bazel.linux.rc b/.circleci/bazel.linux.rc deleted file mode 100644 index fa1b482ed88..00000000000 --- a/.circleci/bazel.linux.rc +++ /dev/null @@ -1,23 +0,0 @@ -# These options are enabled when running on CI -# We do this by copying this file to /etc/bazel.bazelrc at the start of the build. -# See documentation in /docs/BAZEL.md - -# Import config items common to both Linux and Windows setups. -# https://docs.bazel.build/versions/master/guide.html#bazelrc-syntax-and-semantics -try-import %workspace%/.circleci/bazel.common.rc - -# Save downloaded repositories in a location that can be cached by CircleCI. This helps us -# speeding up the analysis time significantly with Bazel managed node dependencies on the CI. -build --repository_cache=/home/circleci/bazel_repository_cache - -# Workaround https://github.com/bazelbuild/bazel/issues/3645 -# Bazel doesn't calculate the memory ceiling correctly when running under Docker. -# Limit Bazel to consuming resources that fit in CircleCI "2xlarge+" class -# https://circleci.com/docs/2.0/configuration-reference/#resource_class -build --local_cpu_resources=20 -build --local_ram_resources=40960 - -# All build executed remotely should be done using our RBE configuration. -build:remote --google_default_credentials - -build --config=remote diff --git a/.circleci/bazel.windows.rc b/.circleci/bazel.windows.rc deleted file mode 100644 index 309b1cba132..00000000000 --- a/.circleci/bazel.windows.rc +++ /dev/null @@ -1,17 +0,0 @@ -# These options are enabled when running on CI -# We do this by copying this file to $env:ProgramData\bazel.bazelrc at the start of the build. -# See documentation in /docs/BAZEL.md - -# Import config items common to both Linux and Windows setups. -# https://docs.bazel.build/versions/master/guide.html#bazelrc-syntax-and-semantics -try-import %workspace%/.circleci/bazel.common.rc - -# Manually set the local resources used in windows CI runs -build --local_ram_resources=120000 -build --local_cpu_resources=32 - -# All windows jobs run on master and should use http caching -build --remote_http_cache=https://storage.googleapis.com/angular-team-cache -build --remote_accept_cached=true -build --remote_upload_local_results=true -build --google_default_credentials diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 9454be12fd0..00000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,16 +0,0 @@ -# This config is remaining in place to prevent pull requests failing because of CircleCI config missing. - -version: 2.1 - -jobs: - pass: - docker: - - image: cimg/base:2022.05 - steps: - - run: echo "This too shall pass (always)" - -workflows: - version: 2 - default_workflow: - jobs: - - pass diff --git a/.circleci/env-helpers.inc.sh b/.circleci/env-helpers.inc.sh deleted file mode 100644 index ff818d24b80..00000000000 --- a/.circleci/env-helpers.inc.sh +++ /dev/null @@ -1,76 +0,0 @@ -#################################################################################################### -# Helpers for defining environment variables for CircleCI. -# -# In CircleCI, each step runs in a new shell. The way to share ENV variables across steps is to -# export them from `$BASH_ENV`, which is automatically sourced at the beginning of every step (for -# the default `bash` shell). -# -# See also https://circleci.com/docs/2.0/env-vars/#using-bash_env-to-set-environment-variables. -#################################################################################################### - -# Set and print an environment variable. -# -# Use this function for setting environment variables that are public, i.e. it is OK for them to be -# visible to anyone through the CI logs. -# -# Usage: `setPublicVar ` -function setPublicVar() { - setSecretVar $1 "$2"; - echo "$1=$2"; -} - -# Set (without printing) an environment variable. -# -# Use this function for setting environment variables that are secret, i.e. should not be visible to -# everyone through the CI logs. -# -# Usage: `setSecretVar ` -function setSecretVar() { - # WARNING: Secrets (e.g. passwords, access tokens) should NOT be printed. - # (Keep original shell options to restore at the end.) - local -r originalShellOptions=$(set +o); - set +x -eu -o pipefail; - - local assignmentStatement="export $1=\"${2:-}\";" - - echo "${assignmentStatement}" >> $BASH_ENV; - eval "${assignmentStatement}" - - # Restore original shell options. - eval "$originalShellOptions"; -} - - -# Create a function to set an environment variable, when called. -# -# Use this function for creating setter for public environment variables that require expensive or -# time-consuming computations and may not be needed. When needed, you can call this function to set -# the environment variable (which will be available through `$BASH_ENV` from that point onwards). -# -# Arguments: -# - ``: The name of the environment variable. The generated setter function will be -# `setPublicVar_`. -# - ``: The code to run to compute the value for the variable. Since this code should be -# executed lazily, it must be properly escaped. For example: -# ```sh -# # DO NOT do this: -# createPublicVarSetter MY_VAR "$(whoami)"; # `whoami` will be evaluated eagerly -# -# # DO this isntead: -# createPublicVarSetter MY_VAR "\$(whoami)"; # `whoami` will NOT be evaluated eagerly -# ``` -# -# Usage: `createPublicVarSetter ` -# -# Example: -# ```sh -# createPublicVarSetter MY_VAR 'echo "FOO"'; -# echo $MY_VAR; # Not defined -# -# setPublicVar_MY_VAR; -# source $BASH_ENV; -# echo $MY_VAR; # FOO -# ``` -function createPublicVarSetter() { - echo "setPublicVar_$1() { setPublicVar $1 \"$2\"; }" >> $BASH_ENV; -} diff --git a/.circleci/env.linux.sh b/.circleci/env.linux.sh deleted file mode 100755 index 6fab1c71143..00000000000 --- a/.circleci/env.linux.sh +++ /dev/null @@ -1,4 +0,0 @@ -#################################################################################################### -# Set bazel configuration for CircleCI runs. -#################################################################################################### -cp "${PROJECT_ROOT}/.circleci/bazel.linux.rc" ".bazelrc.user"; diff --git a/.circleci/env.sh b/.circleci/env.sh deleted file mode 100755 index 9522f3c56a7..00000000000 --- a/.circleci/env.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env bash - -# Variables -readonly projectDir=$(realpath "$(dirname ${BASH_SOURCE[0]})/..") -readonly envHelpersPath="$projectDir/.circleci/env-helpers.inc.sh"; - -# Load helpers and make them available everywhere (through `$BASH_ENV`). -source $envHelpersPath; -echo "source $envHelpersPath;" >> $BASH_ENV; - - -#################################################################################################### -# Define PUBLIC environment variables for CircleCI. -#################################################################################################### -# See https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables for more info. -#################################################################################################### -setPublicVar CI "$CI" -setPublicVar PROJECT_ROOT "$projectDir"; -# This is the branch being built; e.g. `pull/12345` for PR builds. -setPublicVar CI_BRANCH "$CIRCLE_BRANCH"; -setPublicVar CI_BUILD_URL "$CIRCLE_BUILD_URL"; -setPublicVar CI_COMMIT "$CIRCLE_SHA1"; -# `CI_COMMIT_RANGE` is only used on push builds (a.k.a. non-PR, non-scheduled builds and rerun -# workflows of such builds). -setPublicVar CI_GIT_BASE_REVISION "${CIRCLE_GIT_BASE_REVISION}"; -setPublicVar CI_GIT_REVISION "${CIRCLE_GIT_REVISION}"; -setPublicVar CI_COMMIT_RANGE "$CIRCLE_GIT_BASE_REVISION..$CIRCLE_GIT_REVISION"; -setPublicVar CI_PULL_REQUEST "${CIRCLE_PR_NUMBER:-false}"; -setPublicVar CI_REPO_NAME "$CIRCLE_PROJECT_REPONAME"; -setPublicVar CI_REPO_OWNER "$CIRCLE_PROJECT_USERNAME"; -setPublicVar CI_PR_REPONAME "$CIRCLE_PR_REPONAME"; -setPublicVar CI_PR_USERNAME "$CIRCLE_PR_USERNAME"; - - -#################################################################################################### -# Define "lazy" PUBLIC environment variables for CircleCI. -# (I.e. functions to set an environment variable when called.) -#################################################################################################### -createPublicVarSetter CI_STABLE_BRANCH "\$(npm info @angular/core dist-tags.latest | sed -r 's/^\\s*([0-9]+\\.[0-9]+)\\.[0-9]+.*$/\\1.x/')"; - - -#################################################################################################### -# Define SECRET environment variables for CircleCI. -#################################################################################################### -setSecretVar CI_SECRET_AIO_DEPLOY_FIREBASE_TOKEN "$AIO_DEPLOY_TOKEN"; -setSecretVar CI_SECRET_PAYLOAD_FIREBASE_TOKEN "$ANGULAR_PAYLOAD_TOKEN"; - - -#################################################################################################### -# Define SauceLabs environment variables for CircleCI. -#################################################################################################### -setPublicVar SAUCE_USERNAME "angular-framework"; -setSecretVar SAUCE_ACCESS_KEY "f4bf7c639c5a-c6bb-d6a4-a4b5-800aa111"; -# TODO(josephperrott): Remove environment variables once all saucelabs tests are via bazel method. -setPublicVar SAUCE_LOG_FILE /tmp/angular/sauce-connect.log -setPublicVar SAUCE_READY_FILE /tmp/angular/sauce-connect-ready-file.lock -setPublicVar SAUCE_PID_FILE /tmp/angular/sauce-connect-pid-file.lock -setPublicVar SAUCE_TUNNEL_IDENTIFIER "angular-framework-${CIRCLE_BUILD_NUM}-${CIRCLE_NODE_INDEX}" -# Amount of seconds we wait for sauceconnect to establish a tunnel instance. In order to not -# acquire CircleCI instances for too long if sauceconnect failed, we need a connect timeout. -setPublicVar SAUCE_READY_FILE_TIMEOUT 120 - -#################################################################################################### -# Create shell script in /tmp for Bazel actions to access CI envs without -# busting the cache. Used by payload-size.sh script in integration tests. -#################################################################################################### -readonly bazelVarEnv="/tmp/bazel-ci-env.sh" -echo "# Setup by /.circle/env.sh" > $bazelVarEnv -echo "export PROJECT_ROOT=\"${PROJECT_ROOT}\";" >> $bazelVarEnv -echo "export CI_BRANCH=\"${CI_BRANCH}\";" >> $bazelVarEnv -echo "export CI_BUILD_URL=\"${CI_BUILD_URL}\";" >> $bazelVarEnv -echo "export CI_COMMIT=\"${CI_COMMIT}\";" >> $bazelVarEnv -echo "export CI_PULL_REQUEST=\"${CI_PULL_REQUEST}\";" >> $bazelVarEnv -echo "export CI_REPO_NAME=\"${CI_REPO_NAME}\";" >> $bazelVarEnv -echo "export CI_REPO_OWNER=\"${CI_REPO_OWNER}\";" >> $bazelVarEnv -echo "export CI_SECRET_PAYLOAD_FIREBASE_TOKEN=\"${CI_SECRET_PAYLOAD_FIREBASE_TOKEN}\";" >> $bazelVarEnv - -#################################################################################################### -# Platform-specific environment setup (which can leverage the base variables from here) -#################################################################################################### - -# Conditionally, load additional environment settings based on the current VM -# operating system running. We detect Windows by checking for `%AppData%`. -if [[ -n "${APPDATA}" ]]; then - source ${projectDir}/.circleci/env.windows.sh -else - source ${projectDir}/.circleci/env.linux.sh -fi diff --git a/.circleci/env.windows.sh b/.circleci/env.windows.sh deleted file mode 100755 index 19a6fbe1c65..00000000000 --- a/.circleci/env.windows.sh +++ /dev/null @@ -1,13 +0,0 @@ -#################################################################################################### -# Set bazel configuration for CircleCI runs. -#################################################################################################### -cp "${PROJECT_ROOT}/.circleci/bazel.windows.rc" ".bazelrc.user"; - -# Override the `PATH` environment variable so that the windows-nvm NodeJS version -# always has precedence over potential existing NodeJS versions from the image. -setPublicVar PATH "/c/Program Files/nodejs/:$PATH" - -# Expose the Bazelisk version. We need to run Bazelisk globally since Windows has problems launching -# Bazel from a node modules directoy that might be modified by the Bazel Yarn install then. -setPublicVar BAZELISK_VERSION \ - "$(cd ${PROJECT_ROOT}; node -p 'require("./package.json").devDependencies["@bazel/bazelisk"]')" diff --git a/.circleci/setup_cache.sh b/.circleci/setup_cache.sh deleted file mode 100755 index 232596df4a9..00000000000 --- a/.circleci/setup_cache.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# Install bazel remote cache proxy -# This is temporary until the feature is no longer experimental on CircleCI. -# See remote cache documentation in /docs/BAZEL.md - -set -u -e - -readonly DOWNLOAD_URL="https://5-116431813-gh.circle-artifacts.com/0/pkg/bazel-remote-proxy-$(uname -s)_$(uname -m)" - -curl --fail -o ~/bazel-remote-proxy "$DOWNLOAD_URL" -chmod +x ~/bazel-remote-proxy diff --git a/.devcontainer/recommended-Dockerfile b/.devcontainer/recommended-Dockerfile index b12a0a70ed1..d128851219b 100644 --- a/.devcontainer/recommended-Dockerfile +++ b/.devcontainer/recommended-Dockerfile @@ -1,6 +1,5 @@ # Image metadata and config. # Ideally, the Node.js version should match what we use on CI. -# See `executors > default-executor` in `.circleci/config.yml`. FROM cimg/node:18.13.0@sha256:45d0ee279f522c4562a464df71108104cc9b2187205333ffd0707d4f05589731 @@ -12,7 +11,7 @@ LABEL name="Angular dev environment" \ EXPOSE 4000 4200 4433 5000 8080 9876 -# Switch to `root` (CircleCI images use `circleci` as the user). +# Switch to `root`. USER root diff --git a/.gitignore b/.gitignore index 487a4952c50..9590c28b2a1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,6 @@ *.log /node_modules/ -# CircleCI temporary file for cache key computation. -# See `save_month_to_file` in `.circleci/config.yml`. -month.txt - # Include when developing application packages. pubspec.lock .c9 diff --git a/.pullapprove.yml b/.pullapprove.yml index 89af31257c0..c64c3d11c52 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -634,7 +634,6 @@ groups: - > contains_any_globs(files.exclude('.pullapprove.yml'), [ '{*,.*}', - '.circleci/**/{*,.*}', '.devcontainer/**/{*,.*}', '.github/**/{*,.*}', '.husky/**/{*,.*}', diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9d69f1f8c89..a8703ba25ab 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -260,7 +260,7 @@ The `` and `` fields are mandatory, the `()` field is opti Must be one of the following: * **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) -* **ci**: Changes to our CI configuration files and scripts (examples: CircleCi, SauceLabs) +* **ci**: Changes to our CI configuration files and scripts (examples: Github Actions, SauceLabs) * **docs**: Documentation only changes * **feat**: A new feature * **fix**: A bug fix diff --git a/README.md b/README.md index b004d505801..5bbc1ee6eab 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,6 @@

- - CI status -   Angular on npm   @@ -35,12 +32,6 @@

-

- - InsightsSnapshot - -

-
## Documentation diff --git a/integration/README.md b/integration/README.md index 1942b46fdfe..b6ae214a71e 100644 --- a/integration/README.md +++ b/integration/README.md @@ -156,7 +156,7 @@ And from the flags that the Karma `ChromeHeadless` browser passes to Chrome: htt The `--disable-dev-shm-usage` flag disables the usage of `/dev/shm` because it causes Chrome to crash on some environments. -On CircleCI, the puppeteer provisioned Chrome crashes with `CI we get Root cause: org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist which resolves` without this flag. +On CI, the puppeteer provisioned Chrome crashes with `CI we get Root cause: org.openqa.selenium.WebDriverException: unknown error: DevToolsActivePort file doesn't exist which resolves` without this flag. See: https://github.com/puppeteer/puppeteer/blob/v1.0.0/docs/troubleshooting.md#tips See: https://stackoverflow.com/questions/50642308/webdriverexception-unknown-error-devtoolsactiveport-file-doesnt-exist-while-t diff --git a/integration/run_tests.sh b/integration/run_tests.sh index 3fd4d990f07..019e8c6fd1a 100755 --- a/integration/run_tests.sh +++ b/integration/run_tests.sh @@ -2,7 +2,6 @@ set -u -e -o pipefail -# see https://circleci.com/docs/2.0/env-vars/#circleci-built-in-environment-variables CI=${CI:-false} cd "$(dirname "$0")" diff --git a/karma-js.conf.js b/karma-js.conf.js index 00b01bdb11b..7b8cfd8aea3 100644 --- a/karma-js.conf.js +++ b/karma-js.conf.js @@ -130,7 +130,7 @@ module.exports = function (config) { // the tunnel. We do this because devices are sometimes not able to properly resolve // `localhost` or `127.0.0.1` through the SauceLabs tunnel. Using a domain that does not // resolve to anything on SauceLabs VMs ensures that such requests are always resolved through - // the tunnel, and resolve to the actual tunnel host machine (commonly the CircleCI VMs). + // the tunnel, and resolve to the actual tunnel host machine (commonly the GHA VMs). // More context can be found in: https://github.com/angular/angular/pull/35171. if (process.env.SAUCE_LOCALHOST_ALIAS_DOMAIN) { conf.hostname = process.env.SAUCE_LOCALHOST_ALIAS_DOMAIN; diff --git a/scripts/ci/publish-build-artifacts.sh b/scripts/ci/publish-build-artifacts.sh index 58cd30abd89..a4b9404fb39 100755 --- a/scripts/ci/publish-build-artifacts.sh +++ b/scripts/ci/publish-build-artifacts.sh @@ -75,7 +75,6 @@ function publishRepo { if [[ ${CI} ]]; then ( - # The file ~/.git_credentials is created in /.circleci/config.yml cd $REPO_DIR && \ git config credential.helper "store --file=$HOME/.git_credentials" ) diff --git a/tools/saucelabs-daemon/README.md b/tools/saucelabs-daemon/README.md index 64f17d720af..0cbfc80cb9c 100644 --- a/tools/saucelabs-daemon/README.md +++ b/tools/saucelabs-daemon/README.md @@ -3,7 +3,7 @@ ## Local testing 1. Set up your `SAUCE_USERNAME`, `SAUCE_ACCESS_KEY` & `SAUCE_TUNNEL_IDENTIFIER` environment variables. -These are required. You can find the values for `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` in `/.circleci/env.sh`. `SAUCE_TUNNEL_IDENTIFIER` can be set to any unique value. +These are required. You can find the values for `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` on your Saucelabs account. `SAUCE_TUNNEL_IDENTIFIER` can be set to any unique value. If you are having trouble running Saucelabs tests locally you can contact [Joey Perrott](https://github.com/josephperrott) or [Paul Gschwendtner](https://github.com/devversion) for support. diff --git a/tools/saucelabs/sauce-service.sh b/tools/saucelabs/sauce-service.sh index e76ecf43f1a..a3a5215fc5c 100755 --- a/tools/saucelabs/sauce-service.sh +++ b/tools/saucelabs/sauce-service.sh @@ -72,7 +72,7 @@ readonly SAUCE_READY_FILE="${TMP_DIR}/sauce-connect.lock" readonly SAUCE_PARAMS_JSON_FILE="${TMP_DIR}/sauce-connect-params.json" # Amount of seconds we wait for sauceconnect to establish a tunnel instance. In order to not -# acquire CircleCI instances for too long if sauceconnect fails, we need a connect timeout. +# acquire CI instances for too long if sauceconnect fails, we need a connect timeout. readonly SAUCE_READY_FILE_TIMEOUT=120 readonly SERVICE_LOCK_FILE="${TMP_DIR}/service.lock"