🙌

GitLab CI でマルチ CPU アーキテクチャ対応 PHP イメージを登録してみる

2021/09/15に公開

はじめに

マルチ CPU アーキテクチャ対応イメージを GitLab CE へ直接出力してみる
手動で出来ることは分かったので、GitLab CI で実行できるようにしてみる。
ついでに、PHP のイメージを使ってみる。

前提

  • PHP のイメージ上で、ややこしいことはやらない。
    • phpinfio()が実行されるだけ。
  • 以下のタグを打った時だけ、イメージをプッシュ出来るようにする。
    • vX.X.X (例: v1.12.3)
    • XXXXXXXX (例: 20210914)
    • XXXXXXXX-X (例: 20210914-02)

ディレクトリ構成

├── .gitlab-ci.yml
└── php
    └── Dockerfile

ソース

Dockerfile
FROM php:8.0-apache

RUN { \
        echo '<?php'; \
        echo 'phpinfo();'; \
    } > /var/www/html/index.php
.gitlab-ci.yml
---
stages:
  - build
  - push

image: docker:20.10

variables:
  IMAGE_NAME: php-webserver-sample

.condition:
  rules:
    - if: $CI_COMMIT_TAG =~ /^v(\d+\.)?(\d+\.)?(\*|\d+)$/
    - if: $CI_COMMIT_TAG =~ /^\d{8}(-\d+)?$/

buildx:
  stage: build
  extends: .condition
  variables:
    GIT_STRATEGY: none
  artifacts:
    paths:
      - buildx
    expire_in: 1 hour
  script:
    - export DOCKER_BUILDKIT=1
    - docker build --platform=local -o . https://github.com/docker/buildx.git

.push:
  stage: push 
  extends: .condition 
  before_script:
    - mkdir -p ~/.docker/cli-plugins
    - cp buildx ~/.docker/cli-plugins/docker-buildx
  script:
    - echo "${CI_REGISTRY_PASSWORD}" | docker login -u ${CI_REGISTRY_USER} --password-stdin ${CI_REGISTRY}
    - docker buildx create --use --name mybuilder
    - docker buildx inspect --bootstrap
    - docker buildx build -t "${IMAGE_TAG}"
      --platform linux/amd64,linux/arm64
      --push
      ./php

push_latest_image:
  extends: .push
  variables:
    IMAGE_TAG: "${CI_REGISTRY}/${CI_PROJECT_PATH}/${IMAGE_NAME}"

push_tagged_image:
  extends: .push
  variables:
    IMAGE_TAG: "${CI_REGISTRY}/${CI_PROJECT_PATH}/${IMAGE_NAME}:${CI_COMMIT_TAG}"

補足

${CI_REGISTRY}/${CI_PROJECT_PATH}/${IMAGE_NAME}をグローバルな variables で使用した場合

.gitlag-ci.yml
variables:
  IMAGE_NAME: php-webserver-sample
  IMAGE_PATH: "${CI_REGISTRY}/${CI_PROJECT_PATH}/${IMAGE_NAME}"

# (ry

push_latest_image:
  extends: .push
  variables:
    IMAGE_TAG: "${IMAGE_PATH}"

以下のエラーが起きて登録できなかった 😅

$ docker buildx build -t "${IMAGE_TAG}" --platform linux/amd64,linux/arm64 --push ./php
error: invalid tag "${CI_REGISTRY}/${CI_PROJECT_PATH}/php-webserver-sample": invalid reference format

環境

  • GitLab CE: 13.12.10
  • GitLab Runner versions: 13.4.0

Discussion