本次配置全部都是基于docker的環(huán)境進(jìn)行杯活。
其中使用了gitlab
匆帚、gitlib-ci
、docker
旁钧、spring boot
吸重、maven
等技術(shù)互拾。
請(qǐng)首先安裝docker
。
背景
使用spring boot 開(kāi)發(fā) 短信發(fā)送程序嚎幸,并自建gitlab作為代碼版本管理颜矿,使用gitlab-ci作為持續(xù)CI/CD工具。
所有工具運(yùn)行在docker之上嫉晶。
下面提到的
- git.sdibt.com是我配置的gitlab域名骑疆,請(qǐng)自行替換。
- sms 是maven project name替废,請(qǐng)自行替換箍铭。
一、Gitlab 配置
docker stop gitlab && docker rm gitlab
docker run --detach \
--hostname git.sdibt.com \
--publish 443:443 \
--publish 80:80 \
--publish 22:22 \
--name gitlab \
--restart always \
--env 'GITLAB_TIMEZONE=Beijing' \
--volume "$PWD"/srv/gitlab/config:/etc/gitlab \
--volume "$PWD"/srv/gitlab/logs:/var/log/gitlab \
--volume "$PWD"/srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
其中GITLAB_TIMEZONE=Beijing 使用了 ruby on rails 的時(shí)區(qū)設(shè)置椎镣。通過(guò)--volume 將配置放在容器外诈火,便于以后升級(jí)。
二状答、GitlabRunner配置
從project中獲取注冊(cè)Runner的token
請(qǐng)用上圖所示的url、token 替換下面提到的url惊科、token
1拍摇、啟動(dòng)runner
docker run -d --name gitlab-runner-dockersock \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD"/srv/gitlab-runner/config:/etc/gitlab-runner \
gitlab/gitlab-runner:alpine
將docker.sock掛載到Runner中,將配置文件保存在"$PWD"/srv/gitlab-runner/config
2译断、注冊(cè)runner
docker exec -it gitlab-runner-dockersock gitlab-runner register -n \
--url http://gitlab.8dat.com/ci \
--registration-token bfab7e07b5e57c1e0ac2dc37ff4475 \
--tag-list=dockersock,docker \
--description "dockersock" \
--docker-privileged=true \
--docker-pull-policy="if-not-present" \
--docker-image "docker:latest" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /root/m2:/root/.m2 \
--executor docker
給runner設(shè)置了tag后授翻,可以在.gitlab-ci.yml中指定job運(yùn)行的runner。tag一般是用來(lái)區(qū)分不同類型的runner孙咪,或標(biāo)志特定配置的runner堪唐。
生成的配置文件 cat /etc/gitlab-runner/config.toml
,如下所示:
[[runners]]
name = "dockersock"
url = "http://git.sdibt.com/ci"
token = "bfab7e07b5e57c1e0ac2dc37ff4475"
executor = "docker"
[runners.docker]
tls_verify = false
image = "docker:latest"
privileged = true
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/root/m2:/root/.m2"]
pull_policy = "if-not-present"
[runners.cache]
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/root/m2:/root/.m2"]
中增加了/root/m2:/root/.m2
翎蹈,避免maven每次都下載jar包淮菠,提高效率。pull_policy = "if-not-present"
避免docker 鏡像每次都pull
3荤堪、可以運(yùn)行docker的maven鏡像
dockerhub
上的maven鏡像并不能執(zhí)行docker命令合陵,導(dǎo)致我們無(wú)法使用docker build 等命令。所以我們自己制作一個(gè)docker_maven鏡像澄阳。
FROM maven:alpine
RUN apk add --no-cache \
ca-certificates \
curl \
openssl
ENV DOCKER_BUCKET get.docker.com
ENV DOCKER_VERSION 1.12.5
ENV DOCKER_SHA256 0058867ac46a1eba283e2441b1bb5455df846144f9d9ba079e97655399d4a2c6
RUN set -x \
&& curl -fSL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
&& echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - \
&& tar -xzvf docker.tgz \
&& mv docker/* /usr/local/bin/ \
&& rmdir docker \
&& rm docker.tgz \
&& docker -v
docker build -t docker-maven:alpine .
得到鏡像文件拥知。
三、項(xiàng)目配置
pom.xml配置
<build>
<finalName>sms</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件碎赢,官網(wǎng):https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.12</version>
<configuration>
<!-- 注意imageName一定要是符合正則[a-z0-9-_.]的低剔,否則構(gòu)建不會(huì)成功 -->
<!-- 詳見(jiàn):https://github.com/spotify/docker-maven-plugin Invalid repository name ... only [a-z0-9-_.] are allowed-->
<imageName>${project.build.finalName}</imageName>
<baseImage>openjdk:alpine</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
.gitlab-ci.yml配置
image: docker-maven:alpine
services:
- redis:3-alpine
#Maven 阿里云鏡像
before_script:
- rm -rf /root/.m2/settings.xml
- echo -e "<?xml version=\""1.0\"" encoding=\""UTF-8\""?><settings xmlns=\""http://maven.apache.org/SETTINGS/1.0.0\"" xmlns:xsi=\""http://www.w3.org/2001/XMLSchema-instance\"" xsi:schemaLocation=\""http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd\""><mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors></settings>" > /root/.m2/settings.xml
# 定義 stages
stages:
- test
- build
# 定義 jobs
test app:
stage: test
script:
- echo "I am test job"
- mvn test
# 定義 job
build app:
stage: build
tags:
- dockersock
script:
- mvn -Dmaven.test.skip=true clean package docker:build
查看鏡像
docker images | grep sms
鏡像已經(jīng)躺好了。