ããã¯ããªã«ãããããŠæžãããã®ïŒ
åã«ãGitLab RunnerãGitLabã«ç»é²ããŠãžã§ããåãããããã«ããŠã¿ãŸããã
Ubuntu Linux 24.04 LTSにGitLab Runnerをインストールして、TerraformでGitLabに登録する - CLOVER🍀
ä»åã¯ããžã§ããå®è¡ããæ¡ä»¶ãèšå®ããŠã¿ãããšæããŸãã
GitLab CI/CDã§ãžã§ããå®è¡ããæ¡ä»¶ãèšå®ãã
ããã¥ã¡ã³ããšããŠã¯ãã¡ãã§ãã
Specify when jobs run with `rules` | GitLab Docs
ãã€ãã©ã€ã³ã«ãžã§ããå«ãããé€å€ããããå¶åŸ¡ããã«ã¯ãrulesã䜿ããŸãã
CI/CD YAML syntax reference / rules
ãžã§ãã®å¶åŸ¡ãã®ãã®ã¯ãããã¥ã¡ã³ãã®ä»¥äžã®é ã§èŠãŠãããšããã§ãããã
Control how jobs run | GitLab Docs
Specify when jobs run with `rules` | GitLab Docs
Troubleshooting jobs | GitLab Docs
ãžã§ããå®è¡ãããã±ãŒã¹ãšããŠã¯ã以äžã®ãããªãã¿ãŒã³ãèããããŸãã
- Merge Requestãäœæã»æŽæ°ãããæã«å®è¡ãã
- Protectedãã©ã³ããæŽæ°ãããæã«å®è¡ãã
- 宿çã«å®è¡ãã
- ç¹å®ã®ãã¡ã€ã«ã倿Žãããæã«ããžã§ããå®è¡ãã
ãžã§ãã®å®è¡æ¡ä»¶ãçµããããªãã®ã¯ããããŠãã®å Žåã¯ãžã§ããå®è¡ãããªãœãŒã¹ã®ç¯çŽã§ããã
æãããããªãŠãŒã¹ã±ãŒã¹ã«è¿ãäŸã¯ã以äžã«æžãããŠããŸãã
Specify when jobs run with rules / rules examples
ãšããã§ãããã¥ã¡ã³ããèŠãŠãããšãã€ãã©ã€ã³ãšãžã§ãã®éããæŒãããŠãããæ¹ãããããã§ããã
GitLab CI/CDã®ãžã§ããšãã€ãã©ã€ã³ã®å®çŸ©ã確èªãã
ãžã§ã
ãžã§ãã¯ãGitLab CI/CDãã€ãã©ã€ã³ã®åºæ¬èŠçŽ ã§ãã
CI/CD jobs are the fundamental elements of a GitLab CI/CD pipeline.
ãžã§ãã¯.gitlab-ci.ymlãã¡ã€ã«å
ã§ããã«ãããã¹ãããããã€ãªã©ãè¡ãã³ãã³ãã®ãªã¹ãã§æ§æãããŸãã
Jobs are configured in the .gitlab-ci.yml file with a list of commands to execute to accomplish tasks like building, testing, or deploying code.
å®éãjobãšããããŒã¯ãŒãã§.gitlab-ci.ymlã§æžãããŸããããã
CI/CD YAML syntax reference / Job keywords
ãã€ãã©ã€ã³
ïŒCI/CDïŒãã€ãã©ã€ã³ã¯GitLab CI/CDã®åºæ¬èŠçŽ ã§ãã
CI/CD pipelines are the fundamental component of GitLab CI/CD.
ãã€ãã©ã€ã³ã¯ã以äžã®èŠçŽ ããæ§æãããŸãã
- ã°ããŒãã«ãªYAMLããŒã¯ãŒã
- ãžã§ã
- ã¹ããŒãž
- ãžã§ããã°ã«ãŒãåãããã®
- CI/CD YAML syntax reference / stage
å°ããªãã€ãã©ã€ã³ã ãšãå°ãªãã¹ããŒãžãšãã®äžã«å«ãŸãããžã§ãã ãã§æ§æããããã§ããã
å¹³ããèšããšã.gitlab-ci.ymlã§å®çŸ©ãããå
容ãã®ãã®ã§ããã
ãã€ãã©ã€ã³ã«ã¯ãããã€ãçš®é¡ããããŸãããŸãèªåã§å®è¡ããããšãã§ããã°ãæåã§å®è¡ããããšãã§ããŸãã
- åºæ¬çãªãã€ãã©ã€ã³
- åºæ¬çãªãã€ãã©ã€ã³
- needsã䜿çšããŠããžã§ãéã®äŸåé¢ä¿ãå®çŸ©ãããã€ãã©ã€ã³
- 芪åãã€ãã©ã€ã³
- Pipeline architecture | GitLab Docs
- ããŒãžãªã¯ãšã¹ãã®ãã€ãã©ã€ã³ã¿ãã«è¡šç€ºããããã€ãã©ã€ã³
- ãã©ã³ããã€ãã©ã€ã³
- ã¿ã°ãã€ãã©ã€ã³
- ããŒãžãªã¯ãšã¹ããã€ãã©ã€ã³
- ããŒãžçµæãã€ãã©ã€ã³
- ããŒãžãã¬ã€ã³
- Types of pipelines | GitLab Docs
- ã¹ã±ãžã¥ãŒã«ããããã€ãã©ã€ã³
GitLab CI/CDã§ãžã§ããå®è¡ããæ¡ä»¶ãèšå®ããããšã¯ïŒ
ãããŸã§èŠããšãä»åã®ãé¡ã§ããããžã§ããå®è¡ããæ¡ä»¶ãèšå®ããããšããã®ã¯ãããããžã§ããå®è¡ããããšããã€ãã©ã€ã³ã®
å®è¡å¯Ÿè±¡ã«å ãããã©ããã®æ¡ä»¶ãèšå®ããããšèšãããã§ãã
ããããç®ç·ã§èŠããšãrulesã®äŸã§ããžã§ããããŒãžãªã¯ãšã¹ããã€ãã©ã€ã³ã«è¿œå ãããããšãã£ã衚çŸã®æå³ããããããã«
ãªããŸãã
If the pipeline is for a merge request, the first rule matches, and the job is added to the merge request pipeline with attributes of:
Specify when jobs run with rules / rules examples
ããšã¯äŸã.gitlab-ci.ymlãèŠãŠæ
£ããŠãããŸãããã
ç°å¢ã¯Terraformã§æ§ç¯ããããšã«ããŸãã
ç°å¢
ä»åã®ç°å¢ã¯ãã¡ããGitLabã¯ãã§ã«æ§ç¯æžã¿ã§ã192.168.0.6ã§åäœããŠãããã®ãšããŸãã
$ sudo gitlab-rake gitlab:env:info System information System: Ubuntu 24.04 Current User: git Using RVM: no Ruby Version: 3.2.5 Gem Version: 3.6.7 Bundler Version:2.6.5 Rake Version: 13.0.6 Redis Version: 7.2.7 Sidekiq Version:7.3.9 Go Version: unknown GitLab information Version: 18.0.0 Revision: c481e1bd1b8 Directory: /opt/gitlab/embedded/service/gitlab-rails DB Adapter: PostgreSQL DB Version: 16.8 URL: http://192.168.0.6 HTTP Clone URL: http://192.168.0.6/some-group/some-project.git SSH Clone URL: git@192.168.0.6:some-group/some-project.git Using LDAP: no Using Omniauth: yes Omniauth Providers: GitLab Shell Version: 14.41.0 Repository storages: - default: unix:/var/opt/gitlab/gitaly/gitaly.socket GitLab Shell path: /opt/gitlab/embedded/service/gitlab-shell Gitaly - default Address: unix:/var/opt/gitlab/gitaly/gitaly.socket - default Version: 18.0.0 - default Git Version: 2.49.0.gl2
GitLab Runnderã
$ gitlab-runner --version Version: 18.0.1 Git revision: 3e653c4e Git branch: 18-0-stable GO version: go1.23.6 X:cacheprog Built: 2025-05-16T17:25:38Z OS/Arch: linux/amd64
Terraformã
$ terraform version Terraform v1.12.0 on linux_amd64
GitLabãããžã§ã¯ããäœæãã
æåã«ãGitLabãããžã§ã¯ããäœæããŸãã
Terraformã§ã®ãªãœãŒã¹å®çŸ©ã
terraform.tf
terraform { required_version = "1.12.0" required_providers { gitlab = { source = "gitlabhq/gitlab" version = "18.0.0" } } }
main.tf
variable "root_access_token" { type = string ephemeral = true } provider "gitlab" { token = var.root_access_token base_url = "http://192.168.0.6/" } resource "gitlab_group" "sample_group" { name = "sample group" path = "sample-group" } resource "gitlab_project" "sample_app" { name = "sample-app" namespace_id = gitlab_group.sample_group.id default_branch = "main" visibility_level = "private" auto_devops_enabled = false only_allow_merge_if_pipeline_succeeds = true only_allow_merge_if_all_discussions_are_resolved = true } resource "gitlab_branch_protection" "main_branch" { project = gitlab_project.sample_app.id branch = "main" allow_force_push = false merge_access_level = "maintainer" push_access_level = "no one" unprotect_access_level = "maintainer" } resource "gitlab_group_membership" "sample_owner" { group_id = gitlab_group.sample_group.id user_id = gitlab_user.sample_user.id access_level = "owner" } resource "gitlab_user" "sample_user" { name = "sample-user" username = "sample-user" password = "P@ssw0rd" email = "sample-user@example.com" } resource "gitlab_user_runner" "group_runner" { runner_type = "group_type" group_id = gitlab_group.sample_group.id description = "sample group runner" untagged = true } output "runner_authentication_token" { value = gitlab_user_runner.group_runner.token sensitive = true }
Protectedãã©ã³ãã¯ãã®æç¹ã§ã¯mainã®ã¿ã«ããŠãããŸãã
ã¢ã¯ã»ã¹ããŒã¯ã³ã¯ç°å¢å€æ°ã§å®çŸ©ã
$ export TF_VAR_root_access_token=...
ãªãœãŒã¹äœæã
$ terraform init $ terraform apply
GitLab Runnerã®authentication tokenã確èªããŠ
$ terraform output runner_authentication_token "glrt-xxxxxxxxxx"
GitLabã«GitLab Runnerãç»é²ããŸãã
$ RUNNER_TOKEN=... $ sudo gitlab-runner register \ --non-interactive \ --url "http://192.168.0.6/" \ --token "$RUNNER_TOKEN" \ --executor "docker" \ --docker-image ubuntu:24.04 \ --description "sample group runner"
GitLabãããžã§ã¯ãã«ç»é²ãããµã³ãã«ã³ãŒããçšæããŸãã
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.littlewings</groupId> <artifactId>sample-app</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <maven.compiler.release>21</maven.compiler.release> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.12.2</version> <scope>test</scope> </dependency> </dependencies> </project>
src/main/java/org/littlewings/gitlab/CalcService.java
package org.littlewings.gitlab; public class CalcService { public int plus(int a, int b) { return a + b; } }
src/test/java/org/littlewings/gitlab/CalcServiceTest.java
package org.littlewings.gitlab; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; class CalcServiceTest { @Test void plus() { CalcService sut = new CalcService(); Assertions.assertEquals(5, sut.plus(2, 3)); } }
GitLabã«ç»é²ã
$ git init --initial-branch=main $ git remote add origin http://192.168.0.6/sample-group/sample-app.git $ git config --local user.name "sample-user" $ git config --local user.email "sample-user@example.com" $ git add pom.xml src $ git commit -m "initial commit" $ git push origin HEAD
developãã©ã³ããäœæããŸãã
$ git switch -c develop $ git push origin HEAD
ããã§ãããã©ã«ããã©ã³ããdevelopã«ãdevelopãã©ã³ããProtectedãã©ã³ãã«ããŸãã
resource "gitlab_project" "sample_app" {
name = "sample-app"
namespace_id = gitlab_group.sample_group.id
#default_branch = "main"
default_branch = "develop"
visibility_level = "private"
auto_devops_enabled = false
only_allow_merge_if_pipeline_succeeds = true
only_allow_merge_if_all_discussions_are_resolved = true
}
...
resource "gitlab_branch_protection" "develop_branch" {
project = gitlab_project.sample_app.id
branch = "develop"
allow_force_push = false
merge_access_level = "maintainer"
push_access_level = "no one"
unprotect_access_level = "maintainer"
}
é©çšã
$ terraform apply
ããã§æºåå®äºã§ãã
.gitlab-ci.ymlã远å ããŠãããããèšå®ãã
ããã§ã¯ãããããã¯.gitlab-ci.ymlã远å ããŠãèšå®å€æŽããŠãã£ãŠã¿ãŸãããã
æ°ãããã©ã³ããäœæã
$ git switch -c add-cicd-pipeline
ãããª.gitlab-ci.ymlãäœæããŠ
.gitlab-ci.yml
stages: - build - test - deploy default: image: maven:3.9.9-eclipse-temurin-21 compile: stage: build script: - mvn compile test: stage: test script: - mvn test packaging: stage: deploy script: - mvn package -DskipTests
ãªããžããªãŒã«è¿œå ããŠãGitLabã«ãã©ã³ããpushããŸãã
$ git add .gitlab-ci.yml $ git commit -m 'add, ci/cd pipeline' $ git push origin HEAD
ãããšããã€ãã©ã€ã³ãåãåºããŸãã

ããã§ãrulesã远å ããŠã¿ãŸãã
.gitlab-ci.yml
stages: - build - test - deploy default: image: maven:3.9.9-eclipse-temurin-21 compile: stage: build script: - mvn compile rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never test: stage: test script: - mvn test rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never packaging: stage: deploy script: - mvn package -DskipTests rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never
æåŸã®when: neverã¯æç€ºçã«æžããŠããã ãã§ããªããŠãæå³ã¯å€ãããŸããããŸãä»åã¯ããã©ã«ããã©ã³ããš
Protectedãã©ã³ãã®æ±ããæç¢ºã«åããŠããŸãããéåžžã¯ããã©ã«ããã©ã³ããProtectedãã©ã³ãã§ããããšãå€ããš
æããŸãã®ã§ã$CI_COMMIT_REF_PROTECTED == "true"ã ãã§ãããã§ãããã
ãããããšãããŒãžãªã¯ãšã¹ãã«ã ãåå¿ããããã«ãªããŸãã

ãããŠdevelopã«ããŒãžãããšããã€ãã©ã€ã³ãå®è¡ãããŸãã

mainãã©ã³ãã«ããŒãžããŠããã€ãã©ã€ã³ãå®è¡ãããŸãã

ãã®ãããã®èšå®ã¯ãäºåå®çŸ©æžã¿ã®å€æ°ãå©çšããŠããŸãã
Predefined CI/CD variables reference | GitLab Docs
倿°ã«ã¯ä»¥äžã®3çš®é¡ããããŸãã
- Pre-pipeline ⊠ãã€ãã©ã€ã³ã®äœæåã«äœ¿ãã倿°ã§ã
include:rulesã§ã®ã¿å©çšå¯èœïŒrulesã§ã䜿ãããïŒ - Pipeline ⊠ãã€ãã©ã€ã³äœæäžã«äœ¿ãã倿°ã§ã
rulesã䜿ã£ããžã§ãå®çŸ©ã§äœ¿çšãããã€ãã©ã€ã³ã«ãžã§ãã远å ãããã©ããã«å©çšã§ãã - Job-only ⊠GitLab Runnerããžã§ããååŸããŠå®è¡ããå Žåã«ã®ã¿å©çšã§ãã倿°
ä»å䜿çšããã®ã¯ãã¹ãŠPre-pipelineãªå€æ°ã§ããã
ãšããã§ãä»åã¯ãã¹ãŠã®ãžã§ãã«åãrulesãæžããŠããŸãããããé¢åã ãªãšæãå Žåã¯ãã¯ãŒã¯ãããŒã䜿ã£ãŠã
ããã§ãããã
GitLab CI/CD `workflow` keyword | GitLab Docs
ãããªæãã«ãªããŸãã
.gitlab-ci.yml
stages: - build - test - deploy default: image: maven:3.9.9-eclipse-temurin-21 workflow: rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never compile: stage: build script: - mvn compile test: stage: test script: - mvn test packaging: stage: deploy script: - mvn package -DskipTests
ãžã§ãã®æ¹ã«ã¯rulesããªããªããŸããããçµæã¯å€ãããŸããã
ãããã¯ããžã§ããç¶æ¿ããŠããããããããŸããããžã§ãã®ååã.ã§å§ãããšãç¡å¹ãªãžã§ããå®çŸ©ããããšãã§ããŸãã
ãã®ãããªãžã§ãã¯ãã€ãã©ã€ã³å
ã§å®è¡ã¯ãããŸããããä»ã®ãžã§ãã®ç¶æ¿ãYAMLã¢ã³ã«ãŒãšããŠå©çšã§ããŸãã
CI/CD Jobs / Add a job to a pipeline / Hide a job
Optimize GitLab CI/CD configuration files / Anchors
extendsã䜿ã£ãäŸã
.gitlab-ci.yml
stages: - build - test - deploy default: image: maven:3.9.9-eclipse-temurin-21 .trigger_job_rule: rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never compile: extends: .trigger_job_rule stage: build script: - mvn compile test: extends: .trigger_job_rule stage: test script: - mvn test packaging: extends: .trigger_job_rule stage: deploy script: - mvn package -DskipTests
ãããçµæã¯åãã§ãã
æåŸã«ãrules:changesã䜿ã£ãŠã¿ãŸããããrules:changesã䜿ãããšã§ãæ¡ä»¶åå²ã«å€æŽãããã¡ã€ã«ãå ããããšã
ã§ããŸãã
Specify when jobs run with rules / Complex rules
CI/CD YAML syntax reference / rules / rules:changes
倿ŽäŸã
.gitlab-ci.yml
stages: - build - test - deploy default: image: maven:3.9.9-eclipse-temurin-21 compile: stage: build script: - mvn compile rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - pom.xml - src/main/**/* # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never test: stage: test script: - mvn test rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - pom.xml - src/main/**/* - src/test/**/* # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never packaging: stage: deploy script: - mvn package -DskipTests rules: # Merge Requestã察象 - if: $CI_PIPELINE_SOURCE == "merge_request_event" # ããã©ã«ããã©ã³ãã察象 - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Protectedãã©ã³ãã察象 - if: $CI_COMMIT_REF_PROTECTED == "true" # ãã以å€ã¯å®è¡ããªã - when: never
Merge Requestã®æã«pom.xmlãŸãã¯src/mainé
äžãå€ãã£ãŠããã°mvn compileãå®è¡ããããã«ããŠã
- if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - pom.xml - src/main/**/*
Merge Requestã®æã«pom.xmlãŸãã¯src/mainé
äžãsrc/testé
äžãå€ãã£ãŠããã°mvn testãå®è¡ããããã«ããŠããŸãã
- if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: - pom.xml - src/main/**/* - src/test/**/*
ãããªãšããã§ããããã
ãããã«
GitLab CI/CDã§ãžã§ããå®è¡ããæ¡ä»¶ãèšå®ããŠã¿ãŸããã
ã¡ãã£ãšèšå®ããã ããªãããæžãã®ã§ããããããªãã«ããã¥ã¡ã³ãã«ç®ãéããŠçšèªã®æå³ãçè§£ããããåäœç¢ºèªã
ããŠãããšãã£ããæéãããããŸããã
CIïŒCDã®èšå®ãããŠããæã®å®¿åœã¿ãããªãã®ã®æ°ãããŸããã
ã²ãšãŸããæ¡ä»¶åå²ã®åºç€ã¿ãããªãšããã¯æŒãããããæ°ã¯ããã®ã§ä»åŸäœ¿ã£ãŠãã£ãŠã¿ãŸãããã