GitLab CI, DockerイメージをビルドしてContainer Registryにpushする(2023年版)

前回の記事(2021年版)から、以下の内容でアップデートしました。 Docker Engine 24.0 BuildKit レイヤーキャッシュ(Registry cache) タグによるバージョン付け 注意:Self Hosted GitLab RunnerでのDockerデーモンを使ったイメージビルドは推奨しません DinDでのビルドのため、ホストOSのroot権限が取得可能な、コンテナの特権実行(--privileged)、またはDockerソケットのマウント(DooD)が要求されます。 GitLab.comのShared Runnerは使い捨てのGCPインスタンスで提供されるため、コンテナブレイクアウト等によりホストのroot権限が取得されても、 Dockerエンジンのホストである仮想マシンごと破棄されますが、そのような工夫をしていないRunner(VPSやベアメタル)では、 CIジョブの実行により、ホストのroot権限で悪意ある操作が実行され、また、その影響が持続する危険性があります。 Dockerデーモンを必要としない、代替ソフトウェアによるDockerイメージビルドを検討してください。 リポジトリ構造 .gitlab-ci.yml Dockerfile .gitlab-ci.yml # License: CC0-1.0 stages: - build build: stage: build image: docker:24.0 services: - docker:dind rules: # Release - if: $CI_COMMIT_TAG variables: DOCKER_IMAGE_NAME_AND_TAG: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}" DOCKER_CACHE_FROM: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache" DOCKER_CACHE_TO: "" # Default branch - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH variables: DOCKER_IMAGE_NAME_AND_TAG: "${CI_REGISTRY_IMAGE}:latest" DOCKER_CACHE_FROM: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache" DOCKER_CACHE_TO: "type=registry,ref=${CI_REGISTRY_IMAGE}:latest-buildcache,mode=max" script: - apk add --no-cache git - docker buildx create --use - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" - > docker buildx build . -t "${DOCKER_IMAGE_NAME_AND_TAG}" --cache-from "${DOCKER_CACHE_FROM}" --cache-to "${DOCKER_CACHE_TO}" --push ※ docker buildx buildのコマンドは複数行になっていますが、2行目以降を1行目と異なるインデント数にしないでください。2行目以降が別のコマンド扱いになり、動作しなくなります。 docker buildx create --use docker buildx build実行時に、以下のようなエラーが出るため追加しています。 ...

2023年5月18日 · aoirint

Self-hosted GitLab Runnerで安全にdockerを扱えるようにするためにどうしたらいいかわからない

適当に検索すると、ホストへの特権昇格を許す設定ばかり見かける。 自分だけしか使わないならば構わないかもしれないけれど、なんらかのCIを実行する権限さえあれば、ホストのroot権限をとれるというのは危険だと思う。 (コードレビュー必須でPRではマージ済みのCIが実行されるならいいのか…?) GitLabの公式Shared Runnerがやっているように、docker-machineを使うのがいいはず。 おそらくdocker入りの仮想マシンをCIジョブごとに立てて、privilegedなコンテナからブレイクアウトしても仮想マシンの外に出られないようになっていると思う。 GitLabはいろいろオープンなので、実際のShared Runnerの構成・設定が公開されている。たいへん助かる。 https://docs.gitlab.com/ee/ci/runners/saas/linux_saas_runner.html のだけれども、GCPでこれを稼働させるのはちょっと費用面がよくわからない…。 ツリー https://twitter.com/aoirint/status/1523826104343343105 https://twitter.com/aoirint/status/1524426103615500288

2022年5月10日 · aoirint

GitLab CI, GitLab PagesにビルドしたHTMLを公開する

https://docs.gitlab.com/ee/user/project/pages/ リポジトリのGitLab Pages機能を有効化したあと、 GitLab CI上でpagesというジョブにpublicというパスのArtifactがあるとき、 自動的にpages:deployというジョブが実行され、GitLab Pagesへのデプロイが行われる。 リポジトリがプライベートリポジトリのとき、 デプロイされたGitLab Pagesは、GitLabアカウントで認証が行われる。 .gitlab-ci.yml https://docs.gitlab.com/ee/user/project/pages/getting_started/pages_from_scratch.html#specify-a-stage-to-deploy image: ruby:2.7 workflow: rules: - if: '$CI_COMMIT_BRANCH' pages: stage: deploy script: - gem install bundler - bundle install - bundle exec jekyll build -d public artifacts: paths: - public rules: - if: '$CI_COMMIT_BRANCH == "main"'

2021年11月6日 · aoirint

GitLab CI, DockerイメージをビルドしてContainer Registryにpushする

2023-05-18 追記:この記事には、改訂版(2023年版)があります。 リポジトリ構造 .gitlab-ci.yml app/ Dockerfile .gitlab-ci.yml stages: - build build: stage: build image: docker:20.10 services: - docker:dind rules: - if: $CI_COMMIT_BRANCH == "main" script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build ./app -t $CI_REGISTRY_IMAGE:latest - docker push $CI_REGISTRY_IMAGE:latest

2021年5月29日 · aoirint