Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
221 changes: 153 additions & 68 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,89 +1,174 @@
name: Build Docker image
name: Build Docker image with multi-arch

on:
schedule:
- cron: '30 */12 * * *'

repository_dispatch:
types:
types:
- build

workflow_dispatch:
inputs:
RUBY_VERSION:
description: The version of Ruby to be build
ruby_version:
required: true
default: master
ARCH:
description: Which architecture amd64 or arm64 do you want to build? (The default is amd64)
type: choice
options:
- amd64
- arm64
default: amd64
required: true
LATEST:
description: Whether the latest tag should be created
type: boolean
default: false
required: true
description: '"master" or version nunmber ("3.1.2")'

jobs:
build:
name: ${{ github.event.inputs.RUBY_VERSION || github.event.client_payload.ruby_version }}-${{ matrix.ubuntu_version }}-${{ github.event.inputs.ARCH || github.event.client_payload.arch }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
ubuntu_version:
- noble
- jammy
- focal
dev_suffix: [ '', '-dev' ]
arch: ['amd64', 'arm64']

runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}

env:
nightly: false
push: false
ubuntu_version: "${{ matrix.ubuntu_version }}"
ruby_version: ${{ github.event.inputs.ruby_version || github.event.client_payload.ruby_version || 'master' }}
tag_suffix: "-${{ matrix.arch }}-${{ github.sha }}"
push_tags: ${{ inputs.ruby_version || 'master' }}${{ matrix.dev_suffix }}-${{ matrix.ubuntu_version }}-${{ matrix.arch }}-${{ github.sha }}
dev_suffix: ${{ matrix.dev_suffix }}

steps:
- uses: actions/[email protected]

- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASS }}

- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ secrets.GHCR_USER }}
password: ${{ secrets.GHCR_ACCESS_TOKEN }}

- run: |
if [ "${{ env.dev_suffix }}" = "-dev" ]; then
echo "target=development" >> $GITHUB_ENV
echo "latest_tag=false" >> $GITHUB_ENV
else
echo "target=ruby" >> $GITHUB_ENV
echo "latest_tag=true" >> $GITHUB_ENV
fi

- name: Build docker image
run: |-
rake docker:build ruby_version=${{ env.ruby_version }} \
ubuntu_version=${{ env.ubuntu_version }} \
arch=linux/${{ matrix.arch }} \
image_version_suffix=${{ env.dev_suffix }} \
nightly=${{ env.nightly }} \
tag_suffix=${{ env.tag_suffix }} \
target=${{ env.target }} \
latest_tag=${{ env.latest_tag }}
shell: bash

- name: List images
run: docker images
shell: bash

- name: Push docker image to rubylang
if: "${{ env.push_tags }}"
run: |-
push_tags="${{ env.push_tags }}"
for tag in $push_tags; do
docker push rubylang/ruby:$tag
done
shell: bash

- name: Push docker image to ghcr.io/ruby
if: "${{ env.push_tags }}"
run: |-
push_tags="${{ env.push_tags }}"
for tag in $push_tags; do
docker tag rubylang/ruby:$tag ghcr.io/ruby/ruby:$tag
docker push ghcr.io/ruby/ruby:$tag
done
shell: bash

- uses: ruby/[email protected]
with:
payload: |
{
"attachments": [{
"text": "${{ job.status }}: ${{ matrix.arch }} ${{ matrix.dev_suffix }} <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>",
"color": "danger"
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: failure()

deploy_multiarch:
strategy:
matrix:
registry_name: [ rubylang, ghcr.io/ruby ]
ubuntu_version:
- noble
- jammy
- focal
image_version_suffix: [ '', '-dev' ]

runs-on: ubuntu-latest

needs: build

env:
ruby_version: ${{ github.event.inputs.ruby_version || github.event.client_payload.ruby_version || 'master' }}

steps:
- uses: actions/checkout@v4

- name: Store parameters to environmental variables
run: |
echo "RUBY_VERSION=${{ github.event.inputs.RUBY_VERSION || github.event.client_payload.ruby_version }}" >> $GITHUB_ENV
echo "ARCH=${{ github.event.inputs.ARCH || github.event.client_payload.arch }}" >> $GITHUB_ENV
echo "LATEST=${{ github.event.inputs.LATEST || github.event.client_payload.latest }}" >> $GITHUB_ENV

- name: Show parameters
run: |
echo $RUBY_VERSION
echo $ARCH
echo $LATEST

- name: Build image
run: |
rake docker:build arch=${{ env.ARCH }} ruby_version=${{ env.RUBY_VERSION }} ubuntu_version=${{ matrix.ubuntu_version }} latest_tag=${{ env.LATEST }}

- name: Check image
run: |
docker images

if [[ "${{ env.ARCH }}" != "amd64" ]]; then
ARCH_SUFFIX=-${{ env.ARCH }}
fi
docker run rubylang/ruby:${{ env.RUBY_VERSION }}-${{ matrix.ubuntu_version }}${ARCH_SUFFIX} ruby -v

- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASS }}

- name: Push images to DockerHub
run: docker push rubylang/ruby --all-tags

- name: Renaming images
run: |
docker images rubylang/ruby --format='docker tag {{.Repository}}:{{.Tag}} ghcr.io/ruby/ruby:{{.Tag}}' | sh -ex

- name: Login GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ secrets.GHCR_USER }}
password: ${{ secrets.GHCR_ACCESS_TOKEN }}

- name: Push image to GitHub Container Registry
run: docker push ghcr.io/${{ github.repository_owner }}/ruby --all-tags
- uses: actions/[email protected]

- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PASS }}
if: ${{ matrix.registry_name == 'rubylang' }}

- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ secrets.GHCR_USER }}
password: ${{ secrets.GHCR_ACCESS_TOKEN }}
if: ${{ matrix.registry_name == 'ghcr.io/ruby' }}

- name: Create manifest for ${{ matrix.registry_name }}
run: |-
rake docker:manifest:create \
registry_name="${{ matrix.registry_name }}" \
ruby_version="${{ env.ruby_version }}" \
ubuntu_version="${{ matrix.ubuntu_version }}" \
architectures="amd64 arm64" \
manifest_suffix=${{ github.sha }} \
image_version_suffix=${{ matrix.image_version_suffix }}

- name: Push manifest to ${{ matrix.registry_name }}
run: |-
rake docker:manifest:push \
registry_name="${{ matrix.registry_name }}" \
ruby_version="${{ env.ruby_version }}" \
ubuntu_version="${{ matrix.ubuntu_version }}" \
image_version_suffix=${{ matrix.image_version_suffix }}

- uses: ruby/[email protected]
with:
payload: |
{
"attachments": [{
"text": "${{ job.status }}: ${{ matrix.registry_name }} <https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>",
"color": "danger"
}]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: failure()
Loading