DevOPS實(shí)戰(zhàn):從0到1搭建基于Docker的Gitlab CI/CD

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框架胰耗。

  1. 創(chuàng)建項(xiàng)目結(jié)構(gòu)

*nix系統(tǒng)下:mkdir -p src/main/java/hello

  1. 生成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>
  1. 編輯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
  1. 容器化

添加Dockerfile

FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
  1. 添加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
  1. 運(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生效宪郊,需要干下面兩件事情

  1. 在你的項(xiàng)目根目錄添加.gitlab-ci.yml文件
  2. 設(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ù)部署了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叹誉,一起剝皮案震驚了整個(gè)濱河市鸯两,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌长豁,老刑警劉巖钧唐,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匠襟,居然都是意外死亡钝侠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門酸舍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帅韧,“玉大人,你說我怎么就攤上這事啃勉『鲋郏” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵淮阐,是天一觀的道長叮阅。 經(jīng)常有香客問我,道長枝嘶,這世上最難降的妖魔是什么帘饶? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任哑诊,我火速辦了婚禮群扶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己竞阐,他們只是感情好缴饭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骆莹,像睡著了一般颗搂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幕垦,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天丢氢,我揣著相機(jī)與錄音,去河邊找鬼先改。 笑死疚察,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仇奶。 我是一名探鬼主播貌嫡,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼该溯!你這毒婦竟也來了岛抄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤狈茉,失蹤者是張志新(化名)和其女友劉穎夫椭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氯庆,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡益楼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了点晴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片感凤。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粒督,靈堂內(nèi)的尸體忽然破棺而出陪竿,到底是詐尸還是另有隱情,我是刑警寧澤屠橄,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布族跛,位于F島的核電站,受9級(jí)特大地震影響锐墙,放射性物質(zhì)發(fā)生泄漏礁哄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一溪北、第九天 我趴在偏房一處隱蔽的房頂上張望桐绒。 院中可真熱鬧夺脾,春花似錦、人聲如沸茉继。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烁竭。三九已至菲茬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間派撕,已是汗流浹背婉弹。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留终吼,地道東北人马胧。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像衔峰,于是被迫代替她去往敵國和親佩脊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這是阿里內(nèi)網(wǎng)的一篇文章垫卤,感有用威彰,故轉(zhuǎn)載來了,自己實(shí)際搭建了歇盼,故記錄一下: 背景在日常工作中慨代,我們往往會(huì)搭建基于je...
    新強(qiáng)吖閱讀 5,957評(píng)論 0 4
  • 安裝docker for windows 下載 docker官方下載注意,docker for windows需要...
    廢貓終末旅行閱讀 13,890評(píng)論 3 6
  • 陽臺(tái)互婿,是購房者在購房時(shí)所不可或缺的要求懂牧,而帶有入戶花園的陽臺(tái)元扔,倍受購房者搶購擅羞,為何會(huì)如此呢娃承? 首先入戶花園的存在不...
    夜黑Y閱讀 510評(píng)論 0 0
  • 我娘說張阿姨家的狗,第一只邊牧被偷了竖共。又養(yǎng)了一只哈士奇。然后又有人來偷狗淌铐,這次因?yàn)樵鹤拥墓犯C上了鎖肺然,沒有偷的那么順...
    鼴鼠閱讀 226評(píng)論 1 0
  • 熙熙攘攘的人群,密密麻麻如蟻腿准。都有各自的生活际起,穿梭在這高樓林立的城市。有時(shí)駐足觀望吐葱,麻木淡漠的表情街望,像機(jī)器人一般...
    簡曉愛閱讀 450評(píng)論 3 0