81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # Migration
 | ||
|  | 
 | ||
|  | - [Migration](#migration) | ||
|  |   - [Multiple uploads to the same named Artifact](#multiple-uploads-to-the-same-named-artifact) | ||
|  | 
 | ||
|  | Several behavioral differences exist between Artifact actions `v3` and below vs `v4`. This document outlines common scenarios in `v3`, and how they would be handled in `v4`. | ||
|  | 
 | ||
|  | ## Multiple uploads to the same named Artifact
 | ||
|  | 
 | ||
|  | In `v3`, Artifacts are _mutable_ so it's possible to write workflow scenarios where multiple jobs upload to the same Artifact like so: | ||
|  | 
 | ||
|  | ```yaml | ||
|  | jobs: | ||
|  |   upload: | ||
|  |     strategy: | ||
|  |       matrix: | ||
|  |         runs-on: [ubuntu-latest, macos-latest, windows-latest] | ||
|  |     runs-on: ${{ matrix.runs-on }} | ||
|  |     steps: | ||
|  |       - name: Create a File | ||
|  |         run: echo "hello from ${{ matrix.runs-on }}" > file-${{ matrix.runs-on }}.txt | ||
|  |       - name: Upload Artifact | ||
|  |         uses: actions/upload-artifact@v3 | ||
|  |         with: | ||
|  |           name: my-artifact # NOTE: same artifact name | ||
|  |           path: file-${{ matrix.runs-on }}.txt | ||
|  |   download: | ||
|  |     needs: upload | ||
|  |     runs-on: ubuntu-latest | ||
|  |     steps: | ||
|  |       - name: Download All Artifacts | ||
|  |         uses: actions/download-artifact@v3 | ||
|  |         with: | ||
|  |           path: my-artifact | ||
|  |       - run: ls -R my-artifact | ||
|  | ``` | ||
|  | 
 | ||
|  | This results in a directory like so: | ||
|  | 
 | ||
|  | ``` | ||
|  | my-artifact/ | ||
|  |   file-macos-latest.txt | ||
|  |   file-ubuntu-latest.txt | ||
|  |   file-windows-latest.txt | ||
|  | ``` | ||
|  | 
 | ||
|  | In v4, Artifacts are immutable (unless deleted). So you must change each of the uploaded Artifacts to have a different name and filter the downloads by name to achieve the same effect: | ||
|  | 
 | ||
|  | ```diff | ||
|  | jobs: | ||
|  |   upload: | ||
|  |     strategy: | ||
|  |       matrix: | ||
|  |         runs-on: [ubuntu-latest, macos-latest, windows-latest] | ||
|  |     runs-on: ${{ matrix.runs-on }} | ||
|  |     steps: | ||
|  |     - name: Create a File | ||
|  |       run: echo "hello from ${{ matrix.runs-on }}" > file-${{ matrix.runs-on }}.txt | ||
|  |     - name: Upload Artifact | ||
|  | -     uses: actions/upload-artifact@v3 | ||
|  | +     uses: actions/upload-artifact@v4 | ||
|  |       with: | ||
|  | -       name: my-artifact | ||
|  | +       name: my-artifact-${{ matrix.runs-on }} | ||
|  |         path: file-${{ matrix.runs-on }}.txt | ||
|  |   download: | ||
|  |     needs: upload | ||
|  |     runs-on: ubuntu-latest | ||
|  |     steps: | ||
|  |     - name: Download All Artifacts | ||
|  | -     uses: actions/download-artifact@v3 | ||
|  | +     uses: actions/download-artifact@v4 | ||
|  |       with: | ||
|  |         path: my-artifact | ||
|  | +       pattern: my-artifact-* | ||
|  | +       merge-multiple: true | ||
|  |     - run: ls -R my-artifact | ||
|  | ``` | ||
|  | 
 | ||
|  | In `v4`, the new `pattern:` input will filter the downloaded Artifacts to match the name specified. The new `merge-multiple:` input will support downloading multiple Artifacts to the same directory. If the files within the Artifacts have the same name, the last writer wins. |