| name: 'Run Docker' |
| description: 'Run a docker image for Protobuf CI testing' |
| inputs: |
| image: |
| required: true |
| description: "The docker image to use" |
| type: string |
| command: |
| required: true |
| description: "A raw docker command to run" |
| type: string |
| run-flags: |
| required: false |
| description: "Additional flags to pass to docker run" |
| type: string |
| |
| # WARNING: loading from cache appears to be slower than pull! |
| docker-cache: |
| required: false |
| description: "Enabled caching of pulled docker images." |
| |
| runs: |
| using: 'composite' |
| steps: |
| - name: Authenticate for GAR use |
| shell: bash |
| run: gcloud auth configure-docker -q us-docker.pkg.dev |
| |
| - name: Setup QEMU for possible emulation |
| uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0 |
| |
| - name: Check docker cache |
| if: ${{ inputs.docker-cache }} |
| id: check-docker-cache |
| uses: actions/cache@627f0f41f6904a5b1efbaed9f96d9eb58e92e920 # v3.2.4 |
| with: |
| path: ci/docker/ |
| key: ${{ inputs.image }} |
| |
| - name: Pull and store if cache miss |
| shell: bash |
| if: ${{ inputs.docker-cache && steps.check-docker-cache.outputs.cache-hit != 'true' }} |
| run: > |
| time docker pull -q ${{ inputs.image }} && |
| mkdir -p ci/docker/$(dirname ${{ inputs.image }}) && |
| time docker image save ${{ inputs.image }} --output ./ci/docker/${{ inputs.image }}.tar |
| |
| - name: Use the cached image on cache hit |
| shell: bash |
| if: ${{ inputs.docker-cache && steps.check-docker-cache.outputs.cache-hit == 'true' }} |
| run: time docker image load --input ./ci/docker/${{ inputs.image }}.tar |
| |
| - name: Pull fresh docker image |
| shell: bash |
| if: ${{ !inputs.docker-cache }} |
| run: time docker pull -q ${{ inputs.image }} |
| |
| - name: Run docker |
| shell: bash |
| run: > |
| time docker run ${{ inputs.run-flags}} -v${{ github.workspace }}:/workspace |
| ${{ inputs.image }} ${{ inputs.command }} |