Note
GitHubразмещенные в данный момент средства выполнения не поддерживаются в GitHub Enterprise Server. Дополнительные сведения о планируемой поддержке в будущем см. в GitHub public roadmap.
Общие сведения о командах рабочего процесса
GitHub Actions могут связываться с компьютером выполнения, чтобы задавать переменные среды, выводить значения, используемые другими действиями, добавлять сообщения отладки в журналы выходных данных и выполнять другие задачи.
Большинство команд рабочего процесса используют команду echo
в определенном формате, остальные вызываются путем записи в файл. Дополнительные сведения см. в разделе Файлы среды.
Пример команды рабочего процесса
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"
Note
Команды рабочего процесса и имена параметров не учитывает регистр.
Warning
Если вы используете командную строку, не указывайте двойные кавычки ("
) при использовании команд рабочего процесса.
Использование команд рабочего процесса для доступа к возможностям набора средств
В actions/toolkit содержится ряд функций, которые можно выполнять как команды рабочего процесса. Используйте синтаксис ::
, чтобы выполнить команды рабочего процесса в файле YAML. Затем они отправляются в средство выполнения через stdout
.
Например, вместо использования кода для создания заметки об ошибке, как показано ниже:
core.error('Missing semicolon', {file: 'app.js', startLine: 1})
core.error('Missing semicolon', {file: 'app.js', startLine: 1})
Пример. Создание заметки для ошибки
Чтобы создать ту же заметку об ошибках, можно использовать error
команду в рабочем процессе:
- name: Create annotation for build error run: echo "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error
run: echo "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error run: Write-Output "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error
run: Write-Output "::error file=app.js,line=1::Missing semicolon"
В следующей таблице перечислены функции набора средств, которые доступны в рабочем процессе:
Функция набора средств | Аналогичная команда рабочего процесса |
---|---|
core.addPath | Доступно с помощью файла среды GITHUB_PATH |
core.debug | debug |
core.notice | notice |
core.error | error |
core.endGroup | endgroup |
core.exportVariable | Доступно с помощью файла среды GITHUB_ENV |
core.getInput | Доступно с помощью переменной среды INPUT_{NAME} |
core.getState | Доступно с помощью переменной среды STATE_{NAME} |
core.isDebug | Доступно с помощью переменной среды RUNNER_DEBUG |
core.summary | Доступно с помощью файла среды GITHUB_STEP_SUMMARY |
core.saveState | Доступно с помощью файла среды GITHUB_STATE |
core.setCommandEcho | echo |
core.setFailed | Используется в качестве ярлыка для ::error и exit 1 |
core.setOutput | Доступно с помощью файла среды GITHUB_OUTPUT |
core.setSecret | add-mask |
core.startGroup | group |
core.warning | warning |
Задание сообщения отладки
Записывает сообщение отладки в журнал. Чтобы просмотреть в журнале сообщения отладки, заданные этой командой, необходимо создать секрет под названием ACTIONS_STEP_DEBUG
со значением true
. Дополнительные сведения см. в разделе Включение ведения журналов отладки.
::debug::{message}
::debug::{message}
Пример: задание сообщения отладки
echo "::debug::Set the Octocat variable"
echo "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"
Задание сообщения уведомления
Создает сообщение уведомления и записывает его в журнал. Это сообщение создаст заметку, которая может связать его с определенным файлом в репозитории. При необходимости сообщение может указать позицию в файле.
::notice file={name},line={line},endLine={endLine},title={title}::{message}
::notice file={name},line={line},endLine={endLine},title={title}::{message}
Параметр | Значение | Обязательное поле | По умолчанию. |
---|---|---|---|
title | Настраиваемый заголовок | No | нет |
file | Имя файла | No | .github |
col | Номер столбца, начиная с 1 | No | нет |
endColumn | Номер конечного столбца | No | нет |
line | Номер строки, начиная с 1 | No | 1 |
endLine | Номер конечной строки | No | 1 |
Пример: задание сообщения уведомления
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Задание сообщения предупреждения
Создает сообщение предупреждения и записывает его в журнал. Это сообщение создаст заметку, которая может связать его с определенным файлом в репозитории. При необходимости сообщение может указать позицию в файле.
::warning file={name},line={line},endLine={endLine},title={title}::{message}
::warning file={name},line={line},endLine={endLine},title={title}::{message}
Параметр | Значение | Обязательное поле | По умолчанию. |
---|---|---|---|
title | Настраиваемый заголовок | No | нет |
file | Имя файла | No | .github |
col | Номер столбца, начиная с 1 | No | нет |
endColumn | Номер конечного столбца | No | нет |
line | Номер строки, начиная с 1 | No | 1 |
endLine | Номер конечной строки | No | 1 |
Пример: задание сообщения предупреждения
echo "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
echo "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Задание сообщения об ошибке
Создает сообщение об ошибке и записывает его в журнал. Это сообщение создаст заметку, которая может связать его с определенным файлом в репозитории. При необходимости сообщение может указать позицию в файле.
::error file={name},line={line},endLine={endLine},title={title}::{message}
::error file={name},line={line},endLine={endLine},title={title}::{message}
Параметр | Значение | Обязательное поле | По умолчанию. |
---|---|---|---|
title | Настраиваемый заголовок | No | нет |
file | Имя файла | No | .github |
col | Номер столбца, начиная с 1 | No | нет |
endColumn | Номер конечного столбца | No | нет |
line | Номер строки, начиная с 1 | No | 1 |
endLine | Номер конечной строки | No | 1 |
Пример: задание сообщения об ошибке
echo "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
echo "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Группировка строк журнала
Создает группу с возможностью развертывания в журнале. Чтобы создать группу, воспользуйтесь командой group
и укажите title
. Любые данные, которые вы введете между командами group
и endgroup
, будут вложены в расширяемую запись журнала.
::group::{title} ::endgroup::
::group::{title}
::endgroup::
Пример: группировка строк журнала
jobs: bash-example: runs-on: ubuntu-latest steps: - name: Group of log lines run: | echo "::group::My title" echo "Inside group" echo "::endgroup::"
jobs:
bash-example:
runs-on: ubuntu-latest
steps:
- name: Group of log lines
run: |
echo "::group::My title"
echo "Inside group"
echo "::endgroup::"
jobs: powershell-example: runs-on: windows-latest steps: - name: Group of log lines run: | Write-Output "::group::My title" Write-Output "Inside group" Write-Output "::endgroup::"
jobs:
powershell-example:
runs-on: windows-latest
steps:
- name: Group of log lines
run: |
Write-Output "::group::My title"
Write-Output "Inside group"
Write-Output "::endgroup::"
Маскирование значения в журнале
::add-mask::{value}
::add-mask::{value}
Маскирование значения предотвращает запись строки или переменной в журнал. Каждое замаскированное слово, отделенное пробелом, заменяется символом *
. Для value
маски можно использовать переменную среды или строку. Когда вы маскируете значение, оно обрабатывается как секрет и будет скрыто в средстве выполнения. Например, после маскирования значения вы не сможете задать его в качестве выходных данных.
Пример: маскирование строки
Если вы введете в журнале "Mona The Octocat"
, вы увидите "***"
.
echo "::add-mask::Mona The Octocat"
echo "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"
Warning
Прежде чем выводить секрет в журналах сборки или использовать его в других командах рабочего процесса, зарегистрируйте секрет с помощью add-mask.
Пример: маскирование переменной среды
Если вы введете в журнале переменную MY_NAME
или значение "Mona The Octocat"
, вы увидите "***"
вместо "Mona The Octocat"
.
jobs: bash-example: runs-on: ubuntu-latest env: MY_NAME: "Mona The Octocat" steps: - name: bash-version run: echo "::add-mask::$MY_NAME"
jobs:
bash-example:
runs-on: ubuntu-latest
env:
MY_NAME: "Mona The Octocat"
steps:
- name: bash-version
run: echo "::add-mask::$MY_NAME"
jobs: powershell-example: runs-on: windows-latest env: MY_NAME: "Mona The Octocat" steps: - name: powershell-version run: Write-Output "::add-mask::$env:MY_NAME"
jobs:
powershell-example:
runs-on: windows-latest
env:
MY_NAME: "Mona The Octocat"
steps:
- name: powershell-version
run: Write-Output "::add-mask::$env:MY_NAME"
Пример. Маскирование созданных выходных данных в одном задании
Если вам не нужно передавать секрет из одного задания в другое задание, можно:
- Создайте секрет (без вывода).
- Маскировка ее с
add-mask
помощью . - Используйте
GITHUB_OUTPUT
, чтобы сделать секрет доступным для других шагов в задании.
on: push jobs: generate-a-secret-output: runs-on: ubuntu-latest steps: - id: sets-a-secret name: Generate, mask, and output a secret run: | the_secret=$((RANDOM)) echo "::add-mask::$the_secret" echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT" - name: Use that secret output (protected by a mask) run: | echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push
jobs:
generate-a-secret-output:
runs-on: ubuntu-latest
steps:
- id: sets-a-secret
name: Generate, mask, and output a secret
run: |
the_secret=$((RANDOM))
echo "::add-mask::$the_secret"
echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT"
- name: Use that secret output (protected by a mask)
run: |
echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push jobs: generate-a-secret-output: runs-on: ubuntu-latest steps: - id: sets-a-secret name: Generate, mask, and output a secret shell: pwsh run: | Set-Variable -Name TheSecret -Value (Get-Random) Write-Output "::add-mask::$TheSecret" "secret-number=$TheSecret" >> $env:GITHUB_OUTPUT - name: Use that secret output (protected by a mask) shell: pwsh run: | Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push
jobs:
generate-a-secret-output:
runs-on: ubuntu-latest
steps:
- id: sets-a-secret
name: Generate, mask, and output a secret
shell: pwsh
run: |
Set-Variable -Name TheSecret -Value (Get-Random)
Write-Output "::add-mask::$TheSecret"
"secret-number=$TheSecret" >> $env:GITHUB_OUTPUT
- name: Use that secret output (protected by a mask)
shell: pwsh
run: |
Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
Пример: маскирование и передача секрета между заданиями или рабочими процессами
Если вы хотите передать маскированные секреты между заданиями или рабочими процессами, необходимо сохранить секрет в хранилище, а затем получить его в последующем задании или рабочем процессе.
Настройка
- Настройте хранилище секретов для хранения секрета, который будет создан во время рабочего процесса. Например, Хранилище.
- Создайте ключ для чтения и записи в это хранилище секретов. Сохраните ключ в качестве секрета репозитория. В следующем примере рабочего процесса используется
SECRET_STORE_CREDENTIALS
имя секрета. Дополнительные сведения см. в разделе Использование секретов в GitHub Actions.
Рабочий процесс
Note
Этот рабочий процесс использует мнимое хранилище секретов, secret-store
которое содержит мнимые store-secret
команды и retrieve-secret
. some/secret-store@ 27b31702a0e7fc50959f5ad993c78deac1bdfc29
— это мнимое действие, которое устанавливает secret-store
приложение и настраивает его для подключения к объекту instance
credentials
.
on: push jobs: secret-generator: runs-on: ubuntu-latest outputs: handle: ${{ steps.generate-secret.outputs.handle }} steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: generate secret id: generate-secret shell: bash run: | GENERATED_SECRET=$((RANDOM)) echo "::add-mask::$GENERATED_SECRET" SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET") echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT" secret-consumer: runs-on: macos-latest needs: secret-generator steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: use secret shell: bash run: | SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}" RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE") echo "::add-mask::$RETRIEVED_SECRET" echo "We retrieved our masked secret: $RETRIEVED_SECRET"
on: push
jobs:
secret-generator:
runs-on: ubuntu-latest
outputs:
handle: ${{ steps.generate-secret.outputs.handle }}
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: generate secret
id: generate-secret
shell: bash
run: |
GENERATED_SECRET=$((RANDOM))
echo "::add-mask::$GENERATED_SECRET"
SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET")
echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT"
secret-consumer:
runs-on: macos-latest
needs: secret-generator
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: use secret
shell: bash
run: |
SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}"
RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE")
echo "::add-mask::$RETRIEVED_SECRET"
echo "We retrieved our masked secret: $RETRIEVED_SECRET"
on: push jobs: secret-generator: runs-on: ubuntu-latest steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: generate secret shell: pwsh run: | Set-Variable -Name Generated_Secret -Value (Get-Random) Write-Output "::add-mask::$Generated_Secret" Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret") "handle=$Secret_Handle" >> $env:GITHUB_OUTPUT secret-consumer: runs-on: macos-latest needs: secret-generator steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: use secret shell: pwsh run: | Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}" Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle") echo "::add-mask::$Retrieved_Secret" echo "We retrieved our masked secret: $Retrieved_Secret"
on: push
jobs:
secret-generator:
runs-on: ubuntu-latest
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: generate secret
shell: pwsh
run: |
Set-Variable -Name Generated_Secret -Value (Get-Random)
Write-Output "::add-mask::$Generated_Secret"
Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret")
"handle=$Secret_Handle" >> $env:GITHUB_OUTPUT
secret-consumer:
runs-on: macos-latest
needs: secret-generator
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: use secret
shell: pwsh
run: |
Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}"
Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle")
echo "::add-mask::$Retrieved_Secret"
echo "We retrieved our masked secret: $Retrieved_Secret"
Остановка и запуск команд рабочего процесса
Останавливает обработку всех команд рабочего процесса. Эта специальная команда позволяет записывать в журнал любые данные без риска случайно запустить команду рабочего процесса. Например, можно остановить ведение журнала, чтобы вывести целый скрипт с комментариями.
::stop-commands::{endtoken}
::stop-commands::{endtoken}
Чтобы остановить обработку команд рабочего процесса, передайте stop-commands
уникальный маркер. Чтобы возобновить обработку команд рабочего процесса, передайте тот же маркер, с помощью которого вы остановили обработку.
Warning
Убедитесь, что маркер, который вы используете, создается случайным образом и уникален для каждого запуска.
::{endtoken}::
::{endtoken}::
Пример: остановка и запуск команд рабочего процесса
jobs: workflow-command-job: runs-on: ubuntu-latest steps: - name: Disable workflow commands run: | echo '::warning:: This is a warning message, to demonstrate that commands are being processed.' stopMarker=$(uuidgen) echo "::stop-commands::$stopMarker" echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.' echo "::$stopMarker::" echo '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs:
workflow-command-job:
runs-on: ubuntu-latest
steps:
- name: Disable workflow commands
run: |
echo '::warning:: This is a warning message, to demonstrate that commands are being processed.'
stopMarker=$(uuidgen)
echo "::stop-commands::$stopMarker"
echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
echo "::$stopMarker::"
echo '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs: workflow-command-job: runs-on: windows-latest steps: - name: Disable workflow commands run: | Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.' $stopMarker = New-Guid Write-Output "::stop-commands::$stopMarker" Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.' Write-Output "::$stopMarker::" Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs:
workflow-command-job:
runs-on: windows-latest
steps:
- name: Disable workflow commands
run: |
Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.'
$stopMarker = New-Guid
Write-Output "::stop-commands::$stopMarker"
Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
Write-Output "::$stopMarker::"
Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'
Отправка значений в предварительные и завершающие действия
Переменные среды можно создавать для совместного использования с рабочим процессом pre:
или post:
действиями, записывая в файл, расположенный по адресу GITHUB_STATE
. Например, можно создать файл действием pre:
, передать расположение файла действию main:
, а затем использовать действие post:
для удаления файла. Также можно создать файл действием main:
, передать его расположение действию post:
и с помощью этого же действия post:
удалить файл.
Если у вас несколько pre:
или post:
действия, вы можете получить доступ только к сохраненному значению в действии, в котором оно было записано GITHUB_STATE
. Дополнительные сведения о действии post:
см. в разделе Синтаксис метаданных для GitHub Actions.
Файл GITHUB_STATE
доступен только в действии. Сохраненное значение хранится в виде значения среды с префиксом STATE_
.
В этом примере используется JavaScript для записи в GITHUB_STATE
файл. Итоговая переменная среды называется STATE_processID
со значением 12345
:
import * as fs from 'fs' import * as os from 'os' fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, { encoding: 'utf8' })
import * as fs from 'fs'
import * as os from 'os'
fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, {
encoding: 'utf8'
})
Затем переменная STATE_processID
становится доступной только скрипту очистки, который выполняется в рамках действия main
. Этот пример выполняется в main
и использует JavaScript для отображения значения, назначенного переменной среды STATE_processID
:
console.log("The running PID from the main action is: " + process.env.STATE_processID);
console.log("The running PID from the main action is: " + process.env.STATE_processID);
Файлы среды
Во время выполнения рабочего процесса средство выполнения создает временные файлы, с помощью которых можно совершать определенные действия. Путь к этим файлам можно получить и изменить с помощью переменных среды по умолчанию GitHub. См . раздел AUTOTITLE. Чтобы обеспечить правильную обработку команд, при записи в эти файлы понадобится кодировка UTF-8. В один файл можно записать несколько команд, разделенных новыми строками.
Чтобы использовать переменные среды в GitHub Action, создайте или измените .env
файлы с помощью определенных команд GitHub Actions.
Это делается следующим образом:
name: Example Workflow for Environment Files on: push jobs: set_and_use_env_vars: runs-on: ubuntu-latest steps: - name: Set environment variable run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV - name: Use environment variable run: | echo "The value of MY_ENV_VAR is $MY_ENV_VAR"
name: Example Workflow for Environment Files
on: push
jobs:
set_and_use_env_vars:
runs-on: ubuntu-latest
steps:
- name: Set environment variable
run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV
- name: Use environment variable
run: |
echo "The value of MY_ENV_VAR is $MY_ENV_VAR"
Другой пример — использовать его для хранения метаданных, таких как метки времени сборки, фиксация SHAs или имена артефактов:
steps: - name: Store build timestamp run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV - name: Deploy using stored timestamp run: echo "Deploying at $BUILD_TIME"
steps:
- name: Store build timestamp
run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV
- name: Deploy using stored timestamp
run: echo "Deploying at $BUILD_TIME"
Note
PowerShell версии 5.1 и ниже (shell: powershell
) не используют UTF-8 по умолчанию, поэтому необходимо указать кодировку UTF-8. Например:
jobs: legacy-powershell-example: runs-on: windows-latest steps: - shell: powershell run: | "mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
jobs:
legacy-powershell-example:
runs-on: windows-latest
steps:
- shell: powershell
run: |
"mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
В PowerShell Core версии 6 и более поздних (shell: pwsh
) используется кодировка UTF-8 по умолчанию. Например:
jobs: powershell-core-example: runs-on: windows-latest steps: - shell: pwsh run: | "mypath" >> $env:GITHUB_PATH
jobs:
powershell-core-example:
runs-on: windows-latest
steps:
- shell: pwsh
run: |
"mypath" >> $env:GITHUB_PATH
Указание переменной среды
Note
Чтобы избежать проблем, рекомендуется рассматривать переменные среды как конфиденциальные регистры независимо от поведения операционной системы и используемой оболочки.
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
-
С PowerShell версии 6 и более поздних:
PowerShell "{environment_variable_name}={value}" >> $env:GITHUB_ENV
"{environment_variable_name}={value}" >> $env:GITHUB_ENV
-
С PowerShell версии 5.1 и более ранних:
PowerShell "{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
Можно создать переменную среды, доступную всем последующим шагам в задании рабочего процесса. Для этого необходимо определить или обновить переменную среды и записать ее в файл среды GITHUB_ENV
. Шаг, на котором переменная среды создается или обновляется, не будет иметь доступа к новому значению, но доступ получат все последующие шаги в задании.
Нельзя перезаписать значение переменных среды по умолчанию с именем GITHUB_*
и RUNNER_*
. В настоящее время можно перезаписать значение переменной CI
. Однако это не гарантируется, что это всегда будет возможно. Дополнительные сведения о переменных среды по умолчанию см. в разделе Хранение сведений в переменных.
Пример записи переменной среды в GITHUB_ENV
steps: - name: Set the value id: step_one run: | echo "action_state=yellow" >> "$GITHUB_ENV" - name: Use the value id: step_two run: | printf '%s\n' "$action_state" # This will output 'yellow'
steps:
- name: Set the value
id: step_one
run: |
echo "action_state=yellow" >> "$GITHUB_ENV"
- name: Use the value
id: step_two
run: |
printf '%s\n' "$action_state" # This will output 'yellow'
steps: - name: Set the value id: step_one run: | "action_state=yellow" >> $env:GITHUB_ENV - name: Use the value id: step_two run: | Write-Output "$env:action_state" # This will output 'yellow'
steps:
- name: Set the value
id: step_one
run: |
"action_state=yellow" >> $env:GITHUB_ENV
- name: Use the value
id: step_two
run: |
Write-Output "$env:action_state" # This will output 'yellow'
Многострочные строки
В многострочных строках можно использовать разделитель со следующим синтаксисом.
{name}<<{delimiter} {value} {delimiter}
{name}<<{delimiter}
{value}
{delimiter}
Warning
Убедитесь, что разделитель, который вы используете, не будет выполняться в строке собственного значения. Если значение является полностью произвольным, этот формат не следует использовать. Вместо этого запишите значение в файл.
Пример многостройной строки
Этот пример используется EOF
в качестве разделителя и задает JSON_RESPONSE
переменную среды значением curl
ответа.
steps: - name: Set the value in bash id: step_one run: | { echo 'JSON_RESPONSE<<EOF' curl https://example.com echo EOF } >> "$GITHUB_ENV"
steps:
- name: Set the value in bash
id: step_one
run: |
{
echo 'JSON_RESPONSE<<EOF'
curl https://example.com
echo EOF
} >> "$GITHUB_ENV"
steps: - name: Set the value in pwsh id: step_one run: | $EOF = (New-Guid).Guid "JSON_RESPONSE<<$EOF" >> $env:GITHUB_ENV (Invoke-WebRequest -Uri "https://example.com").Content >> $env:GITHUB_ENV "$EOF" >> $env:GITHUB_ENV shell: pwsh
steps:
- name: Set the value in pwsh
id: step_one
run: |
$EOF = (New-Guid).Guid
"JSON_RESPONSE<<$EOF" >> $env:GITHUB_ENV
(Invoke-WebRequest -Uri "https://example.com").Content >> $env:GITHUB_ENV
"$EOF" >> $env:GITHUB_ENV
shell: pwsh
Задание параметра вывода
Задает выходной параметр шага. Обратите внимание, что шагу потребуется id
определить, чтобы позже получить выходное значение. Вы можете задать значения выходных данных с несколькими строками, используя тот же метод, используемый в разделе "Многострочный" для определения переменных среды с несколькими строками.
echo "{name}={value}" >> "$GITHUB_OUTPUT"
echo "{name}={value}" >> "$GITHUB_OUTPUT"
"{name}=value" >> $env:GITHUB_OUTPUT
"{name}=value" >> $env:GITHUB_OUTPUT
Пример задания выходного параметра
В этом примере показано, как задать выходной SELECTED_COLOR
параметр и получить его позже:
- name: Set color id: color-selector run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT" - name: Get color env: SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }} run: echo "The selected color is $SELECTED_COLOR"
- name: Set color
id: color-selector
run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT"
- name: Get color
env:
SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
run: echo "The selected color is $SELECTED_COLOR"
В этом примере показано, как задать выходной SELECTED_COLOR
параметр и получить его позже:
- name: Set color id: color-selector run: | "SELECTED_COLOR=green" >> $env:GITHUB_OUTPUT - name: Get color env: SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }} run: Write-Output "The selected color is $env:SELECTED_COLOR"
- name: Set color
id: color-selector
run: |
"SELECTED_COLOR=green" >> $env:GITHUB_OUTPUT
- name: Get color
env:
SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
run: Write-Output "The selected color is $env:SELECTED_COLOR"
Добавление сводки по заданию
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
"{markdown content}" >> $env:GITHUB_STEP_SUMMARY
"{markdown content}" >> $env:GITHUB_STEP_SUMMARY
Для каждого задания можно задать пользовательский Markdown, который будет отображаться на странице сводок о выполнении рабочего процесса. С помощью сводок по заданиям можно отображать и группировать уникальное содержимое, например сводки по результатам тестов, чтобы при просмотре результатов выполнения рабочего процесса пользователю не приходилось открывать журналы для получения важной информации, такой как сбои.
Сводки по заданиям поддерживают Markdown для GitHub, и содержимое Markdown можно добавить в файл среды GITHUB_STEP_SUMMARY
для каждого шага. GITHUB_STEP_SUMMARY
является уникальным для каждого шага задания. Дополнительные сведения о файле на шаге, который GITHUB_STEP_SUMMARY
ссылается, см. в разделе "Файлы среды".
При завершении задания сводки по всем шагам группируются в единую сводку по заданию и отображаются на странице сводок о выполнении рабочего процесса. Если сводки создаются несколькими заданиями, они сортируются по времени завершения задания.
Пример добавления сводки задания
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
"### Hello world! :rocket:" >> $env:GITHUB_STEP_SUMMARY
"### Hello world! :rocket:" >> $env:GITHUB_STEP_SUMMARY
Многострочное содержимое Markdown
Для поддержки многострочного содержимого Markdown можно использовать >>
, чтобы непрерывно добавлять содержимое на текущем шаге. С каждой операцией добавления автоматически вставляется символ новой строки.
Пример содержимого Multiline Markdown
- name: Generate list using Markdown
run: |
echo "This is the lead in sentence for the list" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY # this is a blank line
echo "- Lets add a bullet point" >> $GITHUB_STEP_SUMMARY
echo "- Lets add a second bullet point" >> $GITHUB_STEP_SUMMARY
echo "- How about a third one?" >> $GITHUB_STEP_SUMMARY
- name: Generate list using Markdown
run: |
"This is the lead in sentence for the list" >> $env:GITHUB_STEP_SUMMARY
"" >> $env:GITHUB_STEP_SUMMARY # this is a blank line
"- Lets add a bullet point" >> $env:GITHUB_STEP_SUMMARY
"- Lets add a second bullet point" >> $env:GITHUB_STEP_SUMMARY
"- How about a third one?" >> $env:GITHUB_STEP_SUMMARY
Перезапись сводок по заданиям
Чтобы очистить все содержимое для текущего шага, можно использовать >
для перезаписи любого ранее добавленного содержимого в Bash или удаления -Append
в PowerShell.
Пример перезаписи сводок заданий
- name: Overwrite Markdown
run: |
echo "Adding some Markdown content" >> $GITHUB_STEP_SUMMARY
echo "There was an error, we need to clear the previous Markdown with some new content." > $GITHUB_STEP_SUMMARY
- name: Overwrite Markdown
run: |
"Adding some Markdown content" >> $env:GITHUB_STEP_SUMMARY
"There was an error, we need to clear the previous Markdown with some new content." >> $env:GITHUB_STEP_SUMMARY
Удаление сводок по заданиям
Чтобы окончательно удалить сводку по текущему шагу, можно удалить файл, на который ссылается GITHUB_STEP_SUMMARY
.
Пример удаления сводок заданий
- name: Delete all summary content
run: |
echo "Adding Markdown content that we want to remove before the step ends" >> $GITHUB_STEP_SUMMARY
rm $GITHUB_STEP_SUMMARY
- name: Delete all summary content
run: |
"Adding Markdown content that we want to remove before the step ends" >> $env:GITHUB_STEP_SUMMARY
Remove-Item $env:GITHUB_STEP_SUMMARY
После завершения шага сводки по заданиям отправляются, и последующие шаги не могут изменить ранее отправленное содержимое Markdown. В сводках автоматически маскируются все секреты, которые могли в них случайно попасть. Если сводка по заданию содержит конфиденциальную информацию, которую необходимо удалить, можно удалить запуск рабочего процесса, чтобы удалить все его сводки. Дополнительные сведения см. в разделе Удаление выполнения рабочего процесса.
Разделение и ограничения шагов
Сводки по заданиям разделяются между шагами, а размер каждого шага не может превышать 1 МиБ. Разделение между шагами применяется для того, чтобы потенциально поврежденный Markdown одного шага не мог прервать вывод Markdown последующих шагов. Если для шага добавлено более 1 МиБ содержимого, отправка завершится сбоем и будет создана заметка об ошибке. Сбои отправки для сводок по заданиям не влияют на общее состояние шага или задания. Для каждого задания отображается не более 20 пошаговых сводок.
Добавление системного пути
Добавляет каталог к системной переменной PATH
и автоматически открывает к ней доступ всем последующим действиям в текущем задании, кроме выполняемого в настоящий момент действия. Чтобы просмотреть определенные на текущий момент пути для задания, можно использовать echo "$PATH"
в шаге или действии.
Пример добавления системного пути
В этом примере показывается, как добавить пользовательский каталог $HOME/.local/bin
в PATH
:
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
В этом примере показывается, как добавить пользовательский каталог $env:HOMEPATH/.local/bin
в PATH
:
"$env:HOMEPATH/.local/bin" | Out-File -FilePath "$env:GITHUB_PATH" -Append
"$env:HOMEPATH/.local/bin" | Out-File -FilePath "$env:GITHUB_PATH" -Append