@actions/upload-artifact
Предупреждение
Actions/upload-artifact@v3 прекратит поддержку 30 ноября 2024 г. Узнать больше. Аналогично, 30 июня 2024 года планируется прекратить поддержку версий 1 и 2. Обновите свой рабочий процесс, чтобы использовать версию 4 действий с артефактами. Это прекращение поддержки не повлияет на существующие версии GitHub Enterprise Server, используемые клиентами.
Загрузите артефакты действий из ваших запусков рабочего процесса. Внутренняя поддержка пакета @actions/artifact.
См. также артефакт загрузки.
@actions/upload-artifact
Важный
upload-artifact@v4+ в настоящее время не поддерживается в GHES. Если вы используете GHES, вам необходимо использовать версию v3.
Выпуск upload-artifact@v4 и download-artifact@v4 представляет собой серьезные изменения в серверной архитектуре Artifacts. Они имеют многочисленные улучшения производительности и поведения.
Дополнительную информацию см. в документации @actions/artifact
.
Также есть новое поддействие actions/upload-artifact/merge
. Для получения дополнительной информации ознакомьтесь с README этого действия.
На самостоятельных серверах могут потребоваться дополнительные правила брандмауэра.
Загрузка в Артефакт с одним и тем же именем несколько раз.
Из-за того, как в этой новой версии создаются Артефакты, больше нельзя загружать их в Артефакт с одним и тем же именем несколько раз. Вам необходимо либо разделить загрузки на несколько артефактов с разными именами, либо загрузить только один раз. В противном случае вы столкнетесь с ошибкой.
Лимит Артефактов для отдельного задания. Каждое задание в рабочем процессе теперь имеет ограничение в 500 артефактов.
В v4.4
и более поздних версиях скрытые файлы исключаются по умолчанию.
Для получения помощи по критическим изменениям см. MIGRATION.md.
- uses : actions/upload-artifact@v4
with :
# Name of the artifact to upload.
# Optional. Default is 'artifact'
name :
# A file, directory or wildcard pattern that describes what to upload
# Required.
path :
# The desired behavior if no files are found using the provided path.
# Available Options:
# warn: Output a warning but do not fail the action
# error: Fail the action with an error message
# ignore: Do not output any warnings or errors, the action does not fail
# Optional. Default is 'warn'
if-no-files-found :
# Duration after which artifact will expire in days. 0 means using default retention.
# Minimum 1 day.
# Maximum 90 days unless changed from the repository settings page.
# Optional. Defaults to repository settings.
retention-days :
# The level of compression for Zlib to be applied to the artifact archive.
# The value can range from 0 to 9.
# For large files that are not easily compressed, a value of 0 is recommended for significantly faster uploads.
# Optional. Default is '6'
compression-level :
# If true, an artifact with a matching name will be deleted before a new one is uploaded.
# If false, the action will fail if an artifact for the given name already exists.
# Does not fail if the artifact does not exist.
# Optional. Default is 'false'
overwrite :
# Whether to include hidden files in the provided path in the artifact
# The file contents of any hidden files in the path should be validated before
# enabled this to avoid uploading sensitive information.
# Optional. Default is 'false'
include-hidden-files :
Имя | Описание | Пример |
---|---|---|
artifact-id | Идентификатор артефакта GitHub, может использоваться REST API. | 1234 |
artifact-url | URL-адрес для загрузки Артефакта. Может использоваться во многих сценариях, таких как связывание с артефактами в задачах или запросах на включение. Чтобы этот URL-адрес работал, пользователи должны войти в систему. Этот URL-адрес действителен до тех пор, пока срок действия артефакта не истек или артефакт, запуск или репозиторий не были удалены. | https://github.com/example-org/example-repo/actions/runs/1/artifacts/1234 |
steps :
- run : mkdir -p path/to/artifact
- run : echo hello > path/to/artifact/world.txt
- uses : actions/upload-artifact@v4
with :
name : my-artifact
path : path/to/artifact/world.txt
- uses : actions/upload-artifact@v4
with :
name : my-artifact
path : path/to/artifact/ # or path/to/artifact
- uses : actions/upload-artifact@v4
with :
name : my-artifact
path : path/**/[abc]rtifac?/*
- uses : actions/upload-artifact@v4
with :
name : my-artifact
path : |
path/output/bin/
path/output/test-results
!path/**/*.tmp
Информацию о поддерживаемых подстановочных знаках, а также о поведении и документации см. в разделе @actions/glob, который используется для внутреннего поиска файлов.
Если используется шаблон подстановочных знаков, иерархия путей будет сохранена после первого шаблона подстановочных знаков:
path/to/*/directory/foo?.txt =>
∟ path/to/some/directory/foo1.txt
∟ path/to/some/directory/foo2.txt
∟ path/to/other/directory/foo1.txt
would be flattened and uploaded as =>
∟ some/directory/foo1.txt
∟ some/directory/foo2.txt
∟ other/directory/foo1.txt
Если в качестве входных данных указано несколько путей, в качестве корневого каталога артефакта будет использоваться наименьший общий предок всех путей поиска. Исключенные пути не влияют на структуру каталогов.
Допускаются как относительные, так и абсолютные пути к файлам. Относительные пути привязаны к текущему рабочему каталогу. Пути, начинающиеся с подстановочного знака, следует заключать в кавычки, чтобы их нельзя было интерпретировать как псевдонимы YAML.
Если вы загружаете в артефакт большие или легко сжимаемые данные, вам может быть полезно настроить уровень сжатия. По умолчанию уровень сжатия равен 6
, такой же, как у GNU Gzip.
Значение может варьироваться от 0 до 9:
Более высокие уровни приведут к лучшему сжатию, но для завершения потребуется больше времени. Для больших файлов, которые сложно сжать, рекомендуется значение 0
для значительно более быстрой загрузки.
Например, если вы загружаете случайные двоичные данные, вы можете сэкономить много времени, полностью отказавшись от сжатия, поскольку это не принесет пользы:
- name : Make a 1GB random binary file
run : |
dd if=/dev/urandom of=my-1gb-file bs=1M count=1000
- uses : actions/upload-artifact@v4
with :
name : my-artifact
path : my-1gb-file
compression-level : 0 # no compression
Но если вы загружаете данные, которые легко сжимаются (например, открытый текст, код и т. д.), вы можете сэкономить место и затраты, установив более высокий уровень сжатия. Но это будет тяжелее для процессора, поэтому загрузка будет медленнее:
- name : Make a file with a lot of repeated text
run : |
for i in {1..100000}; do echo -n 'foobar' >> foobar.txt; done
- uses : actions/upload-artifact@v4
with :
name : my-artifact
path : foobar.txt
compression-level : 9 # maximum compression
Если путь (или пути) не приводит к тому, что файлы для артефакта не найдены, действие завершится успешно, но будет распечатано предупреждение. В некоторых сценариях может оказаться желательным не выполнить действие или подавить предупреждение. Опция if-no-files-found
позволяет настроить поведение действия, если файлы не найдены:
- uses : actions/upload-artifact@v4
with :
name : my-artifact
path : path/to/artifact/
if-no-files-found : error # 'warn' or 'ignore' are also available, defaults to `warn`
В отличие от более ранних версий upload-artifact
, загрузка в один и тот же артефакт с помощью нескольких заданий не поддерживается в v4
.
- run : echo hi > world.txt
- uses : actions/upload-artifact@v4
with :
# implicitly named as 'artifact'
path : world.txt
- run : echo howdy > extra-file.txt
- uses : actions/upload-artifact@v4
with :
# also implicitly named as 'artifact', will fail here!
path : extra-file.txt
Имена артефактов должны быть уникальными, поскольку каждый созданный артефакт является идемпотентным, поэтому несколько заданий не могут изменить один и тот же артефакт.
В матричных сценариях будьте осторожны, чтобы случайно не выполнить загрузку в один и тот же артефакт, иначе вы столкнетесь с конфликтными ошибками. Лучше всего было бы назвать артефакт префиксом или суффиксом из матрицы:
jobs :
upload :
name : Generate Build Artifacts
strategy :
matrix :
os : [ubuntu-latest, windows-latest]
version : [a, b, c]
runs-on : ${{ matrix.os }}
steps :
- name : Build
run : ./some-script --version=${{ matrix.version }} > my-binary
- name : Upload
uses : actions/upload-artifact@v4
with :
name : binary-${{ matrix.os }}-${{ matrix.version }}
path : my-binary
Это приведет к появлению таких артефактов, как: binary-ubuntu-latest-a
, binary-windows-latest-b
и так далее.
Раньше такое поведение позволяло использовать одинаковые имена артефактов, что приводило к неожиданным мутациям и случайному повреждению. Артефакты, созданные с помощью upload-artifact@v4, являются неизменяемыми.
Вы можете использовать ~
во входном пути вместо $HOME
. Поддерживается базовое расширение тильды:
- run : |
mkdir -p ~/new/artifact
echo hello > ~/new/artifact/world.txt
- uses : actions/upload-artifact@v4
with :
name : my-artifacts
path : ~/new/**/*
Переменные среды вместе с выражениями контекста также могут использоваться для ввода. Для документации см. контекст и синтаксис выражений:
env :
name : my-artifact
steps :
- run : |
mkdir -p ${{ github.workspace }}/artifact
echo hello > ${{ github.workspace }}/artifact/world.txt
- uses : actions/upload-artifact@v4
with :
name : ${{ env.name }}-name
path : ${{ github.workspace }}/artifact/**/*
Для переменных среды, созданных на других этапах, обязательно используйте синтаксис выражения env
.
steps :
- run : |
mkdir testing
echo "This is a file to upload" > testing/file.txt
echo "artifactPath=testing/file.txt" >> $GITHUB_ENV
- uses : actions/upload-artifact@v4
with :
name : artifact
path : ${{ env.artifactPath }} # this will resolve to testing/file.txt at runtime
По умолчанию артефакты сохраняются в течение 90 дней. Вы можете указать более короткий срок хранения, используя поле retention-days
:
- name : Create a file
run : echo "I won't live long" > my_file.txt
- name : Upload Artifact
uses : actions/upload-artifact@v4
with :
name : my-artifact
path : my_file.txt
retention-days : 5
Срок хранения должен быть от 1 до 90 включительно. Дополнительные сведения см. в политиках хранения артефактов и журналов.
Если загрузка артефакта прошла успешно, доступен вывод artifact-id
. Этот идентификатор является уникальным идентификатором, который можно использовать с API REST Artifact.
- uses : actions/upload-artifact@v4
id : artifact-upload-step
with :
name : my-artifact
path : path/to/artifact/content/
- name : Output artifact ID
run : echo 'Artifact ID is ${{ steps.artifact-upload-step.outputs.artifact-id }}'
jobs :
job1 :
runs-on : ubuntu-latest
outputs :
output1 : ${{ steps.artifact-upload-step.outputs.artifact-id }}
steps :
- uses : actions/upload-artifact@v4
id : artifact-upload-step
with :
name : my-artifact
path : path/to/artifact/content/
job2 :
runs-on : ubuntu-latest
needs : job1
steps :
- env :
OUTPUT1 : ${{needs.job1.outputs.output1}}
run : echo "Artifact ID from previous job is $OUTPUT1"
Хотя Артефакт невозможно изменить, его можно полностью перезаписать. Но учтите, что это даст Артефакту новый идентификатор, предыдущий больше не будет существовать:
jobs :
upload :
runs-on : ubuntu-latest
steps :
- name : Create a file
run : echo "hello world" > my-file.txt
- name : Upload Artifact
uses : actions/upload-artifact@v4
with :
name : my-artifact # NOTE: same artifact name
path : my-file.txt
upload-again :
needs : upload
runs-on : ubuntu-latest
steps :
- name : Create a different file
run : echo "goodbye world" > my-file.txt
- name : Upload Artifact
uses : actions/upload-artifact@v4
with :
name : my-artifact # NOTE: same artifact name
path : my-file.txt
overwrite : true
По умолчанию это действие игнорирует скрытые файлы, чтобы избежать непреднамеренной загрузки конфиденциальной информации.
Если вам нужно загрузить скрытые файлы, вы можете использовать ввод include-hidden-files
. Любые файлы, содержащие конфиденциальную информацию, которой не должно быть в загруженном артефакте, можно исключить, используя path
:
- uses : actions/upload-artifact@v4
with :
name : my-artifact
include-hidden-files : true
path : |
path/output/
!path/output/.production.env
Скрытые файлы определяются как любой файл, начинающийся с .
или файлы в папках, начинающиеся с .
. В Windows файлы и каталоги с атрибутом «скрытый» не считаются скрытыми файлами, если они не имеют расширения .
префикс.
В рамках отдельного задания можно создать не более 500 артефактов.
Вы также можете быть ограничены артефактами, если вы превысили квоту общего хранилища. Хранение рассчитывается каждые 6-12 часов. Дополнительную информацию смотрите в документации.
При загрузке Артефакта все файлы собираются в неизменяемый Zip-архив. В настоящее время невозможно загрузить артефакты в формате, отличном от ZIP, или загрузить отдельное содержимое артефакта.
Права доступа к файлам не сохраняются во время загрузки артефакта. Во всех каталогах будет 755
, а во всех файлах — 644
. Например, если вы создаете исполняемый файл с помощью chmod
, а затем загружаете этот файл, после загрузки файл больше не будет гарантированно установлен как исполняемый файл.
Если вам необходимо сохранить разрешения, вы можете tar
все файлы вместе перед загрузкой артефакта. После загрузки файл tar
сохранит права доступа к файлу и учитывает регистр.
- name : ' Tar files '
run : tar -cvf my_files.tar /path/to/my/directory
- name : ' Upload Artifact '
uses : actions/upload-artifact@v4
with :
name : my-artifact
path : my_files.tar
В нижней части страницы сводки рабочего процесса есть специальный раздел для артефактов. Вот скриншот того, что вы можете увидеть:
Существует значок мусорной корзины, который можно использовать для удаления артефакта. Этот значок будет отображаться только для пользователей, у которых есть права на запись в репозиторий.
Размер артефакта обозначается в байтах. Отображаемый размер артефакта обозначает размер zip-архива, который upload-artifact
создает во время загрузки.