DevOPS逐漸成為行業(yè)標(biāo)準(zhǔn)煮落,被越來越多的人所接受,提到DevOPS很難不說起Docker咱士,本文通過使用Gitlab CI及 Docker進(jìn)行CI/CD
DevOps(Development和Operations的組合詞)是一種重視“軟件開發(fā)人員(Dev)”和“IT運(yùn)維技術(shù)人員(Ops)”之間溝通合作的文化、運(yùn)動(dòng)或慣例轧钓。透過自動(dòng)化“軟件交付”和“架構(gòu)變更”的流程序厉,來使得構(gòu)建、測試毕箍、發(fā)布軟件能夠更加地快捷弛房、頻繁和可靠。
你將學(xué)習(xí)到的:
- Docker安裝
- 將Spring Boot容器化
- Gitlab安裝
- Gitlab CI的設(shè)置
Docker安裝
下面以CentOS系統(tǒng)為例而柑,其它系統(tǒng)可參考官方文檔
安裝依賴包
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
設(shè)置安裝源
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安裝Docker-CE
$ sudo yum install docker-ce
啟動(dòng)Docker-CE并測試
$ sudo systemctl start docker
$ sudo docker run hello-world
設(shè)置加速器
我們使用Docker的第一步文捶,應(yīng)該是獲取一個(gè)官方的鏡像,例如mysql媒咳、wordpress粹排,基于這些基礎(chǔ)鏡像我們可以開發(fā)自己個(gè)性化的應(yīng)用。我們可以使用Docker命令行工具來下載官方鏡像涩澡。
但是因?yàn)榫W(wǎng)絡(luò)原因顽耳,我們下載一個(gè)300M的鏡像需要很長的時(shí)間,甚至下載失敗。因?yàn)檫@個(gè)原因射富,阿里云容器Hub服務(wù)提供了官方的鏡像站點(diǎn)加速官方鏡像的下載速度膝迎。
文章地址:https://yq.aliyun.com/articles/29941
通過修改daemon配置文件/etc/docker/daemon.json
來使用加速器:
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://7u8fl13h.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload # 刷新daemon
$ sudo systemctl restart docker # 重啟docker
容器化Spring Boot
這里我們假設(shè)我們的開發(fā)語言是Java的,使用了SpringBoot框架胰耗。
- 創(chuàng)建項(xiàng)目結(jié)構(gòu)
*nix系統(tǒng)下:mkdir -p src/main/java/hello
- 生成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.springframework</groupId>
<artifactId>gs-spring-boot-docker</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 編輯
src/main/java/hello/Application.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello Docker World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
測試:
$ mvn package && java -jar target/gs-spring-boot-docker-0.1.0.jar
- 容器化
添加Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
- 添加Maven支持
編輯pom.xml
<properties>
<docker.image.prefix>springio</docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
$ mvn install dockerfile:build
- 運(yùn)行
$ docker run -p 8080:8080 -t springio/gs-spring-boot-docker
總結(jié)
現(xiàn)在我們已經(jīng)將我們的項(xiàng)目Docker化弄抬,我們將項(xiàng)目上傳到我們的Gitlab就完成了開發(fā)項(xiàng)目的準(zhǔn)備
Gitlab安裝
我們通過Docker可以一鍵安裝Gitlab,官方文檔提供的安裝命令如下:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
簡化版
docker run --detach \
--hostname git.1programmer.com \
--publish 17880:80 \
--name gitlab \
--restart always \
gitlab/gitlab-ce:latest
Gitlab CI
我們希望能讓CI生效宪郊,需要干下面兩件事情
- 在你的項(xiàng)目根目錄添加
.gitlab-ci.yml
文件 - 設(shè)置Runner
.gitlab-ci.yml的簡單編寫
最簡單的CI文件掂恕,構(gòu)建Docker鏡像
build:
stage: build
script: mvn install dockerfile:build
dev:
stage: deploy
script:
- docker rm -f springio/gs-spring-boot-docker || true
- docker run -d -p 11080:8080 -t springio/gs-spring-boot-docker
Gitlab Runner安裝
## 設(shè)置源
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
## 安裝
$ sudo yum install gitlab-runner
Gitlab Runner配置
$ gitlab-runner gitlab-runner register
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
# 這里設(shè)置目標(biāo)Gitlab地址,例如:http://git.1programmer.com/
Please enter the gitlab-ci token for this runner:
# token需要從項(xiàng)目中的配置中獲取
Please enter the gitlab-ci description for this runner:
# 描述
Please enter the gitlab-ci tags for this runner (comma separated):
# 標(biāo)簽弛槐,可跳過
Whether to lock the Runner to current project [true/false]:
# 是否鎖定到當(dāng)前項(xiàng)目蚌父,如果是通用Runner可以多項(xiàng)目共用知牌,安全考慮每個(gè)項(xiàng)目一個(gè)Runner
Please enter the executor: docker, shell, ssh, docker+machine, kubernetes, docker-ssh, parallels, virtualbox, docker-ssh+machine:
# 這里我們選shell
添加gitlab-runner
用戶到docker
組耕餐,以實(shí)現(xiàn)gitlab-runner
用戶操作docker
$ usermod -a -G docker gitlab-runner
總結(jié)
以上就是整個(gè)基于Gitlab CI的自動(dòng)化構(gòu)建流程了买置,經(jīng)過設(shè)置我們就可以對(duì)我們的項(xiàng)目做持續(xù)部署了。