{"meta":{"title":"Оценка выражений в рабочих процессах и действиях","intro":"Поиск сведений о выражениях в GitHub Actions.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/reference","title":"Справочные материалы"},{"href":"/ru/actions/reference/workflows-and-actions","title":"Рабочие процессы и действия"},{"href":"/ru/actions/reference/workflows-and-actions/expressions","title":"Выражения"}],"documentType":"article"},"body":"# Оценка выражений в рабочих процессах и действиях\n\nПоиск сведений о выражениях в GitHub Actions.\n\n## Литералы\n\nВ выражении можно использовать типы данных `boolean`, `null`, `number` и `string`.\n\n| Тип данных | Литеральное значение |\n| ---------- | -------------------- |\n| `boolean`  |                      |\n\n```\n          `true` или `false` |\n```\n\n\\| `null`    | `null` |\n\\| `number`  | Любой числовой формат, поддерживаемый JSON. |\n\\| `string`  | Заключать строки в скобки `${` и `}` необязательно. Однако если вы решите это сделать, используйте одинарные кавычки (`'`) вокруг строки. Чтобы использовать литерал в виде одинарной кавычки, экранируйте его с помощью дополнительной одинарной кавычки (`''`). Если заключить такой литерал в двойные кавычки (`\"`), возникнет ошибка. |\n\nОбратите внимание, что в условных, ложных значениях (`false`, , `0``-0``\"\"`, `''`, ) `null`принудимы к `false` и правде (`true` и другие нефальсийные значения) принудимы к.`true`\n\n### Пример литералы\n\n```yaml\nenv:\n  myNull: ${{ null }}\n  myBoolean: ${{ false }}\n  myIntegerNumber: ${{ 711 }}\n  myFloatNumber: ${{ -9.2 }}\n  myHexNumber: ${{ 0xff }}\n  myExponentialNumber: ${{ -2.99e-2 }}\n  myString: Mona the Octocat\n  myStringInBraces: ${{ 'It''s open source!' }}\n```\n\n## Операторы\n\n| Operator          | Description              |\n| ----------------- | ------------------------ |\n| `( )`             | Логическое группирование |\n| `[ ]`             | Индекс                   |\n| `.`               | Разыменование свойства   |\n| `!`               | Not                      |\n| `<`               | Меньше                   |\n| `<=`              | Меньше или равно         |\n| `>`               | Больше                   |\n| `>=`              | Больше или равно         |\n| `==`              | Equal                    |\n| `!=`              | Не равно                 |\n| `&&`              | And                      |\n| <code>\\|\\|</code> | Or                       |\n\n> \\[!NOTE]\n>\n> * GitHub игнорирует регистр при сравнении строк.\n> *\n\n```\n          `steps.<step_id>.outputs.<output_name>` вычисляется как строка. Чтобы в GitHub выражение вычислялось, а не считалось строкой, необходимо использовать особый синтаксис. Дополнительные сведения см. в разделе [AUTOTITLE](/actions/learn-github-actions/contexts#steps-context).\n```\n\n> * Для числового сравнения `fromJSON()` функция может использоваться для преобразования строки в число. Дополнительные сведения о функции см. в `fromJSON()` разделе [fromJSON](#fromjson).\n\nGitHub выполняет нестрогое сравнение.\n\n* Если типы не совпадают, GitHub приводит их к числовому типу. Для этого в GitHub используются следующие преобразования:\n\n  | Тип        | Результат |\n  | ---------- | --------- |\n  | Null       | `0`       |\n  | Логический |           |\n\n  ```\n          `true` возвращает `1` <br /> \n          `false` возвращает `0` |\n  ```\n\n  \\| Строка  | Преобразуется в любой допустимый числовой формат JSON, в противном случае дает значение `NaN`. <br /> Примечание. Для пустой строки возвращается `0`. |\n  \\| Массив   | `NaN` |\n  \\| Объект  | `NaN` |\n* Если `NaN` один из операндов любого реляционного сравнения (`>`, , `<`, `>=`), `<=`результат всегда `false`. Дополнительные сведения см. в [документации](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN) NaN Mozilla.\n* При сравнении строк в GitHub регистр не учитывается.\n* Объект и массив считаются равными, только если это один экземпляр.\n\n## Функции\n\nВ GitHub предлагается набор встроенных функций, которые можно использовать в выражениях. Чтобы выполнить сравнение, некоторые функции приводят значения к строковому типу. Для этого в GitHub используются следующие преобразования:\n\n| Тип        | Результат |\n| ---------- | --------- |\n| Null       | `''`      |\n| Логический |           |\n\n```\n          `'true'` или `'false'` |\n```\n\n\\| Число  | Десятичный формат, экспоненциальная запись для больших чисел |\n\\| Массив   | Массивы не преобразуются в строку |\n\\| Объект  | Объекты не преобразуются в строку |\n\n### содержит\n\n`contains( search, item )`\n\nВозвращает `true`, если `search` содержит `item`. Если `search` является массивом, эта функция возвращает значение `true`, когда `item` является элементом в массиве. Если `search` является строкой, эта функция возвращает значение `true`, когда `item` является подстрокой `search`. В этой функции регистр не учитывается. Приводит значения к строковому типу.\n\n#### Пример использования строки\n\n```\n          `contains('Hello world', 'llo')` возвращает `true`.\n```\n\n#### Пример использования фильтра объектов\n\n```\n          `contains(github.event.issue.labels.*.name, 'bug')` возвращает `true`, если проблема, связанная с событием, имеет метку \"bug\" (ошибка).\n```\n\nДополнительные сведения см. в разделе [\"Фильтры](#object-filters) объектов\".\n\n#### Пример сопоставления массива строк\n\nВместо записи `github.event_name == \"push\" || github.event_name == \"pull_request\"` можно использовать `contains()` с `fromJSON()`, чтобы проверить, содержит ли массив строк `item`.\n\nНапример, `contains(fromJSON('[\"push\", \"pull_request\"]'), github.event_name)` возвращает `true`, если `github.event_name` имеет значение \"push\" или \"pull\\_request\".\n\n### startsWith\n\n`startsWith( searchString, searchValue )`\n\nВозвращает значение `true`, когда `searchString` начинается с `searchValue`. В этой функции регистр не учитывается. Приводит значения к строковому типу.\n\n#### Пример `startsWith`\n\n```\n          `startsWith('Hello world', 'He')` возвращает `true`.\n```\n\n### endsWith\n\n`endsWith( searchString, searchValue )`\n\nВозвращает значение `true`, если `searchString` заканчивается на `searchValue`. В этой функции регистр не учитывается. Приводит значения к строковому типу.\n\n#### Пример `endsWith`\n\n```\n          `endsWith('Hello world', 'ld')` возвращает `true`.\n```\n\n### format\n\n`format( string, replaceValue0, replaceValue1, ..., replaceValueN)`\n\nЗаменяет значения в строке `string` на значение переменной `replaceValueN`. Переменные в `string` указываются с помощью синтаксиса `{N}`, где `N` является целым числом. Необходимо указать хотя бы одно значение `replaceValue` и `string`. Максимальное количество переменных (`replaceValueN`) не ограничивается. Чтобы указать фигурную скобку, экранируйте ее еще одной фигурной скобкой.\n\n#### Пример `format`\n\n```javascript\nformat('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')\n```\n\nВозвращает «Hello Mona the Octocat».\n\n#### Пример экранирования фигурных скобок\n\n```javascript\nformat('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')\n```\n\nВозвращает «{Hello Mona the Octocat!}».\n\n### join\n\n`join( array, optionalSeparator )`\n\nЗначением `array` может быть массив или строка. Все значения в `array` сцепляются в строку. Между сцепленными значениями вставляется разделитель `optionalSeparator`. Если он не указан, используется разделитель по умолчанию — `,`. Приводит значения к строковому типу.\n\n#### Пример `join`\n\n```\n          `join(github.event.issue.labels.*.name, ', ')` может вернуть «bug, help wanted» (ошибка, требуется помощь)\n```\n\n### toJSON\n\n`toJSON(value)`\n\nВозвращает значение `value` в правильном формате JSON. С помощью этой функции можно отлаживать данные, предоставленные в контекстах.\n\n#### Пример `toJSON`\n\n```\n          `toJSON(job)` может вернуть `{ \"status\": \"success\" }`\n```\n\n### fromJSON\n\n`fromJSON(value)`\n\nВозвращает объект JSON или тип данных JSON для `value`. Эту функцию можно использовать для предоставления объекта JSON в качестве вычисляемого выражения или преобразования любого типа данных, который может быть представлен в формате JSON или JavaScript, таких как строки, логические значения, значения NULL, массивы и объекты.\n\n#### Пример возврата объекта JSON\n\nЭтот рабочий процесс задает матрицу JSON в одном задании и передает ее следующему заданию с помощью выходных данных и функции `fromJSON`.\n\n```yaml copy\nname: build\non: push\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    outputs:\n      matrix: ${{ steps.set-matrix.outputs.matrix }}\n    steps:\n      - id: set-matrix\n        run: echo \"matrix={\\\"include\\\":[{\\\"project\\\":\\\"foo\\\",\\\"config\\\":\\\"Debug\\\"},{\\\"project\\\":\\\"bar\\\",\\\"config\\\":\\\"Release\\\"}]}\" >> $GITHUB_OUTPUT\n  job2:\n    needs: job1\n    runs-on: ubuntu-latest\n    strategy:\n      matrix: ${{ fromJSON(needs.job1.outputs.matrix) }}\n    steps:\n      - run: echo \"Matrix - Project ${{ matrix.project }}, Config ${{ matrix.config }}\"\n```\n\n#### Пример возврата типа данных JSON\n\nЭтот рабочий процесс с помощью функции `fromJSON` преобразует переменные среды из строки в логическое значение или целое число.\n\n```yaml copy\nname: print\non: push\nenv:\n  continue: true\n  time: 3\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    steps:\n      - continue-on-error: ${{ fromJSON(env.continue) }}\n        timeout-minutes: ${{ fromJSON(env.time) }}\n        run: echo ...\n```\n\nРабочий процесс использует `fromJSON()` функцию для преобразования переменной `continue` среды из строки в логическое значение, что позволяет определить, следует ли продолжить ошибку или нет. Аналогичным образом переменная среды преобразуется `time` из строки в целое число, задав время ожидания задания в минутах.\n\n### hashFiles\n\n`hashFiles(path)`\n\nВозвращает один хэш для набора файлов по шаблону пути `path`. Вы можете указать один шаблон `path` или несколько шаблонов `path`, разделенных запятыми. Путь `path` указывается относительно каталога `GITHUB_WORKSPACE` и может включать только файлы внутри `GITHUB_WORKSPACE`. Эта функция вычисляет отдельный хэш SHA-256 для каждого подходящего файла, а затем с помощью этих хэшей вычисляет окончательный хэш SHA-256 для набора файлов. Если по шаблону `path` файлы отсутствуют, функция возвращает пустую строку. Дополнительные сведения о SHA-256 см. в статье [SHA-2](https://en.wikipedia.org/wiki/SHA-2).\n\nДля сопоставления с именами файлов можно использовать подстановочные знаки. Сопоставление шаблонов для `hashFiles` соответствующих шаблонов глобов и не учитывает регистр в Windows. Дополнительные сведения о поддерживаемых символах сопоставления шаблонов[ см](https://www.npmjs.com/package/@actions/glob#patterns). в разделе \"Шаблоны\" документации`@actions/glob`.\n\n#### Примеры с одним шаблоном\n\nСоответствует любому файлу `package-lock.json` в репозитории.\n\n`hashFiles('**/package-lock.json')`\n\nСоответствует всем `.js` файлам в каталоге `src` на корневом уровне, но игнорирует все подкаталоги `src`.\n\n`hashFiles('/src/*.js')`\n\nСоответствует всем `.rb` файлам в каталоге на корневом `lib` уровне, включая все подкаталоги `lib`.\n\n`hashFiles('/lib/**/*.rb')`\n\n#### Примеры с несколькими шаблонами\n\nСоздает хэш для всех файлов `package-lock.json` и `Gemfile.lock` в репозитории.\n\n`hashFiles('**/package-lock.json', '**/Gemfile.lock')`\n\nСоздает хэш для всех `.rb` файлов в каталоге `lib` на корневом уровне, включая все подкаталоги, но исключая `lib` файлы в подкаталоге`.rb``foo`.\n\n`hashFiles('/lib/**/*.rb', '!/lib/foo/*.rb')`\n\n### Случае\n\n`case( pred1, val1, pred2, val2, ..., default )`\n\nВычисляет предикаты в порядке и возвращает значение, соответствующее первому предикату, равному `true`. Если предикат не совпадает, он возвращает последний аргумент в качестве значения по умолчанию.\n\n#### Пример с одним предикатом\n\n```yaml\nenv:\n  MY_ENV_VAR: ${{ case(github.ref == 'refs/heads/main', 'production', 'development') }}\n```\n\nУстанавливает `MY_ENV_VAR` , `production` когда референс равен `refs/heads/main`, иначе устанавливает в `development`.\n\n#### Пример с несколькими предикатами\n\n```yaml\nenv:\n  MY_ENV_VAR: |-\n    ${{ case(\n      github.ref == 'refs/heads/main', 'production',\n      github.ref == 'refs/heads/staging', 'staging',\n      startsWith(github.ref, 'refs/heads/feature/'), 'development',\n      'unknown'\n    ) }}\n```\n\nМножества, `MY_ENV_VAR` основанные на ветви: `production` для `main`, `staging` для `staging`, `development` для ветвей, начинающихся с `feature/`, или `unknown` для всех остальных ветвей.\n\n## Функции проверки состояния\n\nСледующие функции проверки состояния можно использовать в качестве выражений в условных операторах `if`. Если не включить ни одну из этих функций, применяется проверка состояния по умолчанию `success()`. Дополнительные сведения об условных выражениях см. в `if` разделе AUTOTITLE и \\[AUTOTITLE[](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idif).]\\(/actions/creating-actions/metadata-syntax-for-github-actions#runsstepsif)\n\nВнешние `if` условные условия можно использовать `job.status` для доступа к состоянию задания. Дополнительные сведения см. в разделе [Справочник по контекстам](/ru/actions/reference/contexts-reference#job-context).\n\n### успешно\n\nВозвращается `true` при успешном выполнении всех предыдущих шагов.\n\n#### Пример `success`\n\n```yaml\nsteps:\n  ...\n  - name: The job has succeeded\n    if: ${{ success() }}\n```\n\n### всегда\n\nЗадает принудительное выполнение шага при любых обстоятельствах и возвращает значение `true` даже при отмене. Выражение `always` лучше всего использовать на уровне шага или в задачах, которые будут выполняться даже при отмене задания. Например, можно использовать `always` для отправки журналов даже при отмене задания.\n\n> \\[!WARNING]\n> Избегайте использования `always` для любой задачи, которая может страдать от критического сбоя, например получение источников, в противном случае рабочий процесс может зависать до истечения времени ожидания. Если вы хотите запустить задание или шаг независимо от его успешного или неудачного выполнения, используйте рекомендуемую альтернативу: `if: ${{ !cancelled() }}`\n\n#### Пример `always`\n\n```yaml\nif: ${{ always() }}\n```\n\n### cancelled\n\nВозвращает значение `true`, если рабочий процесс был отменен.\n\n#### Пример `cancelled`\n\n```yaml\nif: ${{ cancelled() }}\n```\n\n### сбой,\n\nВозвращает значение `true`, если любой предыдущий шаг задания завершается сбоем. При наличии цепочки зависимых заданий, функция `failure()` возвращает значение `true`, если сбоем завершается любое предыдущее задание.\n\n#### Пример `failure`\n\n```yaml\nsteps:\n  ...\n  - name: The job has failed\n    if: ${{ failure() }}\n```\n\n#### сбой с условиями\n\nВы можете включить дополнительные условия для шага, выполняемого после сбоя, но необходимо по-прежнему включить `failure()` для переопределения проверки состояния по умолчанию для `success()`, которая автоматически применяется к условиям `if`, не содержащим функцию проверки состояния.\n\n##### Пример условий `failure`\n\n```yaml\nsteps:\n  ...\n  - name: Failing step\n    id: demo\n    run: exit 1\n  - name: The demo step has failed\n    if: ${{ failure() && steps.demo.conclusion == 'failure' }}\n```\n\n## Фильтры объектов\n\nС помощью записи `*` можно применить фильтр и подобрать соответствующие элементы из коллекции.\n\nНапример, рассмотрим массив объектов с именем `fruits`.\n\n```json\n[\n  { \"name\": \"apple\", \"quantity\": 1 },\n  { \"name\": \"orange\", \"quantity\": 2 },\n  { \"name\": \"pear\", \"quantity\": 1 }\n]\n```\n\nФильтр `fruits.*.name` возвращает массив `[ \"apple\", \"orange\", \"pear\" ]`.\n\nСинтаксис `*` также можно использовать для объекта. Например, допустим, у вас есть объект с именем `vegetables`.\n\n```json\n\n{\n  \"scallions\":\n  {\n    \"colors\": [\"green\", \"white\", \"red\"],\n    \"ediblePortions\": [\"roots\", \"stalks\"],\n  },\n  \"beets\":\n  {\n    \"colors\": [\"purple\", \"red\", \"gold\", \"white\", \"pink\"],\n    \"ediblePortions\": [\"roots\", \"stems\", \"leaves\"],\n  },\n  \"artichokes\":\n  {\n    \"colors\": [\"green\", \"purple\", \"red\", \"black\"],\n    \"ediblePortions\": [\"hearts\", \"stems\", \"leaves\"],\n  },\n}\n```\n\nПрименение фильтра `vegetables.*.ediblePortions` может дать следующий результат:\n\n```json\n\n[\n  [\"roots\", \"stalks\"],\n  [\"hearts\", \"stems\", \"leaves\"],\n  [\"roots\", \"stems\", \"leaves\"],\n]\n```\n\nТак как объекты не сохраняют порядок, порядок выходных данных не может быть гарантирован."}