Laravel + Docker + Gitlab 从哪里开始

我通常总是没有docker,并认为只有大型公司中的大型项目才需要docker。但是有一天,我看到了码头工人如何与朋友的gitlab协同工作,并意识到我仍然应该研究它。但是,通常情况下,我找不到合适的文章-它们太复杂或不完整,或暗示大家都知道。我不得不长期寻找各种资源,将它们放在一起,最后我设法为其编写了一个简单的项目和CI / CD。

所有工作可以分为三个部分:在本地计算机上,在hitlab上和在服务器上。

因此,对于项目的实施,我们需要一个gitlab帐户和一个具有KVM或XEN虚拟化功能的远程服务器。

第1部分。本地计算机


在本地计算机上,您需要安装docker。

评论
. Docker Linux ( Ubuntu, ), Windows MacOS. macos , Windows . - , linux . - , . VirtualBox. Ubuntu

要在Linux环境中安装,必须运行以下命令。

删除旧容器:

sudo apt-get remove docker docker-engine docker.io containerd runc

更新apt:

sudo apt-get update

安装以下软件包,以便您可以通过https从存储库下载docker:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

添加官方GPG Docker密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

确保打印正确:

sudo apt-key fingerprint 0EBFCD88

回答:

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

下载稳定版:

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

再次更新apt:

sudo apt-get update

安装最新的docker引擎:

sudo apt-get install docker-ce docker-ce-cli containerd.io

检查docker操作:

sudo docker run hello-world

如果一切正确,将开始下载Hello World图像。

Docker官方文档中的完整说明

我们还需要安装docker-compose。官方说明在这里

要安装它,请在终端中执行命令。

从资源库下载:

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

添加行使权:

sudo chmod +x /usr/local/bin/docker-compose

版本检查:

sudo docker-compose --version

我们安装了泊坞窗,现在有必要收集映像。为此,我使用了digitalocean网站上的文章:www.digitalocean.com/community/tutorials/how-to-set-up-laravel-nginx-and-mysql-with-docker-compose-ru本文将重印。

下载Laravel并安装依赖项

第一步,我们下载最新版本的Laravel并安装项目依赖项,包括应用程序级PHP包管理器Composer。我们将使用Docker安装这些依赖项,以免执行Composer的全局安装。

转到主目录,并将最新版本的Laravel克隆到名为laravel-app的目录中:

cd ~
git clone https://github.com/laravel/laravel.git laravel-app

进入laravel-app目录:

cd ~/laravel-app

然后将Docker中的composer映像挂载到Laravel项目所需的目录中,以避免全局安装Composer的开销:

docker run --rm -v $(pwd):/app composer install

docker run命令的-v和--rm标志创建一个虚拟容器,该虚拟容器绑定到当前目录,直到将其删除。〜/ laravel-app目录的内容将被复制到容器,并且在供应商文件夹容器内创建的Composer的内容将被复制到当前目录。

最后,在项目目录中设置权限级别,以使其由没有root特权的用户拥有:

sudo chown -R $USER:$USER ~/laravel-app

当您为应用程序的映像编写Dockerfile时,这将很重要,因为它将允许您使用应用程序代码并在没有root特权的情况下启动容器中的进程。

现在,您已经放置了应用程序代码,并且可以使用Docker Compose进行服务的定义。

使用Docker Compose创建Docker Compose File

Building应用程序可简化基础架构中的配置和版本控制过程。为了自定义我们的Laravel应用程序,我们将创建一个docker-compose文件,其中包含Web服务器服务,数据库和应用程序的定义。

打开文件:

nano ~/laravel-app/docker-compose.yml

在docker-compose文件中定义了三个服务:app,webserver和db。将以下代码添加到文件中,同时用您选择的密码替换定义为db服务环境变量的MYSQL_ROOT_PASSWORD的根密码:

~/laravel-app/docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

这里包括以下服务:

  • 应用程序:此服务定义包含Laravel应用程序,并启动个性化的Docker映像digitalocean.com/php。还将容器中的working_dir参数设置为/ var / www。
  • 网络服务器:此服务定义从Docker获取nginx:alpine映像,并打开端口80和443。
  • db:此服务定义从Docker检索mysql:5.7.22映像,并定义新的环境变量,包括应用程序的laravel数据库和该数据库的root密码。您可以使用所需的任何数据库名称,还应使用自己的强密码替换your_mysql_root_password。此服务定义还将主机端口3306映射到容器端口3306。

每个container_name属性定义一个与服务名称相对应的容器名称。如果您未定义此属性,则Docker将为每个容器提供由历史人物的名称和随机单词组成的名称,并用下划线分隔。

为了简化容器之间的交互,服务连接到名为app-network的连接网络。连接网络使用软件桥接器,该软件桥接器允许连接到该网络的容器相互通信。桥驱动程序会自动设置主机规则,以使不同连接网络上的容器无法直接相互通信。因为只有相关的服务才能相互通信,所以可以提高应用程序的安全性。这也意味着您可以指定连接到相关功能的不同网络和服务:例如,客户端应用程序服务可以使用前端网络,而服务器服务可以使用后端网络。

现在,让我们看一下如何添加卷并将绑定的映像绑定到服务定义以永久保存应用程序数据。

持久数据存储

Docker具有强大而便捷的持久数据存储方式。在我们的应用程序中,我们将使用卷和装入的映像永久保存数据库文件,应用程序和配置。卷在容器的生命周期终止时提供了备份灵活性和保存性,可安装的可安装映像通过立即反映容器中的主机文件或目录的更改,简化了开发过程中的代码更改。我们同时使用这两种选择。

警告!
, , . , Docker . .

在db服务定义的docker-compose文件中定义名为dbdata的卷,以保留MySQL数据库:

~/laravel-app/docker-compose.yml

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network
  ...

名为dbdata的卷用于将/ var / lib / mysql文件夹的内容永久保存在容器内。这使您可以停止并重新启动数据库服务,而不会丢失数据。
在文件末尾添加dbdata卷定义:

~/laravel-app/docker-compose.yml

...
#Volumes
volumes:
  dbdata:
    driver: local

使用此定义,您可以将此卷用于不同的服务。

然后将安装映像绑定添加到MySQL配置文件的db服务:

~/laravel-app/docker-compose.yml

...
#MySQL Service
db:
  ...
    volumes:
      - dbdata:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
  ...

该挂载的映像将〜/ laravel-app / mysql / my.cnf文件绑定到容器中的/etc/mysql/my.cnf目录。

然后将安装的映像添加到Web服务器服务。将有两个:一个用于应用程序代码,另一个用于确定Nginx配置

~/laravel-app/docker-compose.yml

#Nginx Service
webserver:
  ...
  volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
  networks:
      - app-network

第一个安装的映像将〜/ laravel-app目录中的应用程序代码绑定到容器内的/ var / www目录。添加到〜/ laravel-app / nginx / conf.d /中的配置文件也安装在容器中的/etc/nginx/conf.d/中,该文件允许您根据需要添加和更改配置目录的内容。

总之,将以下已安装的映像安装添加到应用程序服务中的应用程序代码和配置文件:

~/laravel-app/docker-compose.yml

#PHP Service
app:
  ...
  volumes:
       - ./:/var/www
       - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
  networks:
      - app-network

应用程序服务将包含应用程序代码的〜/ laravel-app文件夹的安装映像绑定到/ var / www文件夹。这将加速开发过程,因为本地应用程序目录中的任何更改都将立即反映在容器中。您还可以将PHP配置文件〜/ laravel-app / php / local.ini链接到容器中的/usr/local/etc/php/conf.d/local.ini文件。稍后,您将创建本地PHP配置文件。

您的docker-compose文件现在将如下所示:

~/laravel-app/docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.22
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: your_mysql_root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql/
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

创建Dockerfile

Docker允许您使用Dockerfile在单个容器内定义环境。Dockerfile允许您创建个性化映像。可以用来安装所需的应用程序软件并根据需要更改设置。您可以将创建的映像传输到Docker Hub或任何私有注册表。

Dockerfile将位于〜/ laravel-app目录中。创建一个文件:

nano ~/laravel-app/Dockerfile

该Dockerfile将指定基本映像以及构建Laravel应用程序映像所需的命令和说明。将以下代码添加到文件中:

~/laravel-app/php/Dockerfile

FROM php:7.2-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    mysql-client \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

首先,Dockerfile在php之上创建映像:7.2-fpm Docker映像。这是基于已安装的PHP FastCGI PHP-FPM实例的映像。该文件还会安装Laravel所需的软件包:带有composer的mcrypt,pdo_mysql,mbstring和imagick。

RUN指令指定用于更新,安装和配置容器内部参数的命令,这些命令包括专用用户和名为www的组。 WORKDIR语句将目录/ var / www设置为应用程序的工作目录。

创建具有受限访问权限的单独用户和组可减少启动Docker容器时的漏洞,默认情况下,该容器以root特权运行。我们没有以root用户权限运行此容器,而是使用带有--chown标志的COPY命令创建了一个对/ var / www文件夹具有读写权限的www用户,以复制应用程序文件夹的权限。

EXPOSE命令在php-fpm服务器的容器中打开端口9000。 CMD指示在创建容器后应运行的命令。在此,CMD表示启动服务器的php-fpm命令。

完成更改后,保存文件并关闭编辑器。

现在,您可以继续定义PHP配置。

PHP设置

您已经在docker-compose文件中定义了基础架构,现在您可以将PHP服务配置为充当传入Nginx请求的PHP处理器。

要配置PHP,您将在php文件夹中创建一个local.ini文件。这是您链接到上面容器中的/usr/local/etc/php/conf.d/local.ini文件的文件。创建此文件将使您可以忽略PHP在启动时读取的默认php.ini文件。

创建一个php目录:

mkdir ~/laravel-app/php

然后打开local.ini文件:

nano ~/laravel-app/php/local.ini

为了演示PHP的设置,我们将添加以下代码来设置文件上传大小限制:

~/laravel-app/php/local.ini

upload_max_filesize=40M
post_max_size=40M

upload_max_filesize和post_max_size指令设置了上载文件的最大允许大小,并显示了如何从local.ini文件设置php.ini配置。您可以在local.ini文件中插入要忽略的任何PHP配置参数。

配置Nginx

配置PHP服务时,可以修改Nginx服务以将PHP-FPM用作FastCGI服务器来提供动态内容。 FastCGI服务器基于二进制协议,用于交互程序与Web服务器的交互。在文章“在Nginx中理解和实现FastCGI代理”中可以找到更多信息。
要配置Nginx,您将使用〜/ laravel-app / nginx / conf.d /文件夹中的服务配置创建一个app.conf文件。

首先创建nginx / conf.d /目录:

mkdir -p ~/laravel-app/nginx/conf.d

然后创建app.conf配置文件:

nano ~/laravel-app/nginx/conf.d/app.conf

将以下代码添加到文件中以配置Nginx:

~/laravel-app/nginx/conf.d/app.conf

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

服务器块使用以下指令配置Nginx Web服务器:

  • listen:此伪指令定义服务器侦听传入请求的端口。
  • error_log和access_log:这些指令定义用于记录的文件。
  • root:此伪指令将路径设置为根文件夹,从而形成本地文件系统中任何请求的文件的完整路径。

在php location块中,fastcgi_pass指令指示该应用服务正在侦听端口9000上的TCP套接字。使用它,PHP-FPM服务器将在网络上侦听,而不是在Unix套接字上侦听。尽管Unix套接字比TCP套接字在速度上有一点优势,但它没有网络协议,并且会跳过网络堆栈。如果主机位于同一系统上,则可以使用Unix套接字,但是如果服务在不同的主机上运行,​​则TCP套接字通过允许您连接到分布式服务而具有优势。由于我们的应用程序和Web服务器容器在不同的主机上运行,​​因此在我们的配置中使用TCP套接字效率更高。

完成更改后,保存文件并关闭编辑器。

由于先前创建的绑定,nginx / conf.d /文件夹中的任何更改都直接反映在webserver容器中。

现在让我们看一下MySQL参数。

设置MySQL

设置PHP和Nginx之后,您可以将MySQL激活为应用程序的数据库。

要配置MySQL,您需要在mysql文件夹中创建my.cnf文件。这是您在数据库配置步骤中附加到容器内的/etc/mysql/my.cnf文件的文件。如果需要,在需要时,通过挂载挂载的映像,您可以忽略任何my.cnf选项。

为了演示它是如何工作的,我们将在my.cnf中添加包括常规请求日志的设置并设置日志文件。

创建一个mysql目录:

mkdir ~/laravel-app/mysql

创建my.cnf文件:

nano ~/laravel-app/mysql/my.cnf

将以下代码添加到文件中以激活查询日志并设置日志文件的位置:

~/laravel-app/mysql/my.cnf

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

my.cnf文件通过将general_log参数设置为1(启用常规日志)来支持日志。general_log_file参数指定日志的存储位置。

启动容器并更改环境设置

您已在docker-compose文件中定义了所有服务,并为这些服务创建了配置文件。现在您可以运行容器。总之,我们将创建Laravel默认包含的.env.example文件的副本,并将其命名为.env,因为Laravel使用此类文件来确定环境:

cp .env.example .env

启动容器后,我们将在此文件中配置特定的安装参数。

现在,所有服务都在docker-compose文件中定义,您只需要运行一个命令即可启动所有容器,创建卷以及配置和连接网络:

docker-compose up -d

首次启动docker-compose up时,将下载所有必要的Docker映像,这可能需要一些时间。下载图像并将其保存在本地计算机上之后,Compose将创建您的容器。-d标志将进程转换为守护程序,容器将继续在后台运行。

该过程完成后,使用以下命令列出所有正在运行的容器:
docker ps


您将在应用程序,Web服务器和数据库容器上看到以下结果以及数据:

Output
CONTAINER ID        NAMES               IMAGE                             STATUS              PORTS
c31b7b3251e0        db                  mysql:5.7.22                      Up 2 seconds        0.0.0.0:3306->3306/tcp
ed5a69704580        app                 digitalocean.com/php              Up 2 seconds        9000/tcp
5ce4ee31d7c0        webserver           nginx:alpine                      Up 2 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

在这些结果中,CONTAINER ID是每个容器的唯一标识符,并且NAMES列出了每个容器的服务名称。您可以使用这两个标识符来访问容器。IMAGE定义每个容器的映像名称,STATUS提供有关容器状态的信息:启动,重新启动或停止。

现在,您可以修改应用容器中的.env文件,以将特定参数添加到系统中。

使用docker-compose exec打开文件,这使您可以在容器中运行特定命令。在这种情况下,您可以打开文件进行编辑:

docker-compose exec app nano .env

找到指定DB_CONNECTION的块并进行更新以反映您的系统设置。您将更改以下字段:

  1. DB_HOST将是您的数据库数据库容器。
  2. DB_DATABASE将是laravel数据库。
  3. DB_USERNAME将是您的数据库的用户名。在这种情况下,我们将使用laraveluser。
  4. DB_PASSWORD将是为此用户帐户保护的密码。

/var/www/.env

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

还需要更正.env.example文件中的相同变量,因为稍后将在部署到服务器时使用它。

然后使用php artisan键为Laravel配置应用程序键:generate命令。此命令将生成一个密钥并将其复制到.env文件,该文件将保护用户会话和加密的数据:

docker-compose exec app php artisan key:generate

现在,您具有运行该应用程序所需的所有必要环境设置。要将这些设置缓存在可以加快应用程序加载速度的文件中,请运行以下命令:

docker-compose exec app php artisan config:cache

配置设置将被加载到容器中的/var/www/bootstrap/cache/config.php文件中。

最后,在浏览器中打开localhost站点Laravel应用程序的主页打开。

创建MySQL用户

安装MySQL时,默认情况下,仅创建一个具有无限特权的管理根帐户来访问数据库服务器。通常,在使用数据库时,最好避免使用管理根帐户。相反,我们将为应用程序的Laravel数据库创建一个特殊的数据库用户。
要创建新用户,请使用docker-compose exec命令在db容器中启动bash交互式shell:

docker-compose exec db bash

在容器内,登录到MySQL根管理帐户:

mysql -u root -p

安装在docker-compose文件中时,系统将提示您输入为MySQL根帐户指定的密码。

首先,检查docker-compose文件中定义的laravel数据库。
运行show database命令以验证现有数据库:

show databases;

在结果中,您应该看到laravel数据库:

Output
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

然后创建一个将被允许访问该数据库的用户帐户。
我们使用laraveluser用户名,但您可以将其替换为任何首选名称。只要确保用户名和密码与上一步中的.env文件中的用户名和密码匹配即可:

GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';

更新特权以通知MySQL服务器更改:

FLUSH PRIVILEGES;

关闭MySQL:

EXIT;

退出容器:

exit

现在,您可以进行迁移以测试数据库:

docker-compose exec app php artisan migrate

迁移确认的结果如下:

Output

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

第2部分。Gitlab


在Hitlab中,您需要创建一个新项目。

现在我们需要将项目保存在hitlab存储库中。为此,请从本地计算机上的项目文件夹中调用以下命令:

git init
git remote add origin git@gitlab.com:<>/<>  
git remote add origin https://gitlab.com/<>/<>      SSH
git add .
git commit -m "Initial commit"
git push -u origin master

该项目应该出现在“项目概述->详细信息”中,
为了方便立即获得完成的环境,我们将环境的docker映像保存在命中列表注册表中。

为此,您必须执行以下操作:

docker login registry.gitlab.com

并将图像扔到gitlab上:

docker build -t registry.gitlab.com/<>/<> .
docker push registry.gitlab.com/<>/<>

该图像位于Packages-> Container Registry。

要完成gitlab,我们立即获得gitlab-runner的密钥。为此,请转至设置-> CI / CD->运行器。密钥位于“手动配置”部分(手动设置特定的运行器)的第3步中。

第3部分。服务器配置


VPS服务器必须采用虚拟化类型KVM或XEN。像OpenVZ这样的虚拟化在所有用户之间共享系统的核心,因此它无法更改内核参数。为了进行测试,我选择了预先安装了Docker的KVM服务器。但是,服务器上可能没有泊坞窗。在这种情况下,您必须手动安装它。该算法与在本地计算机上安装时的算法相同。还需要检查php版本。对于Laravel,您至少需要7.2。我还必须单独安装php ext-mbstring的扩展名(以我的php 7.3为例):

sudo apt-get update
sudo apt-get install php7.3-mbstring

接下来,我们需要安装gitlab-runner。Runner是一项服务,当接收到新版本时,它将接受来自hitlab的webhook,并将所有内容部署在我们的服务器上。

要安装gitlab-runner,您需要执行以下操作:

curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

下载后,设置执行权限:

sudo chmod +x /usr/local/bin/gitlab-runner

接下来,创建gitlab-runner用户并运行gitlabRunner服务:

sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

注册跑步者。为此,我们需要本文第2部分中的令牌:

sudo gitlab-runner register

作为回应,他们会要求您提供Hitlab的地址。

指定gitlab.com

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com

接下来,您需要输入令牌。输入第2部分中的令牌。

Please enter the gitlab-ci token for this runner
xxx

接下来,指定描述和以逗号分隔的标签。然后我们被提供选择执行者。在这里,您需要选择一个外壳:


Please enter the executor:
shell

据我了解,执行器是一个环境,在其中执行.gitlab-ci.yml文件中的代码。有bash,ssh,docker,parallels,virtualbox和kubernets供您选择。该文档建议,如果您不知道使用什么,请使用bash。这是在服务器上的命令行上运行的通用选项。

然后,我们需要将gitlab-runner用户添加到docker用户组。

sudo usermod -aG docker gitlab-runner

为避免访问错误,请添加到sudoers

sudo nano /etc/sudoers

线

gitlab-runner ALL=(ALL) NOPASSWD: ALL

现在我们可以创建.gitlab-ci.yml文件。执行所谓的管道是必需的:用于部署项目的一系列命令。

为此,请转到命中列表上的项目存储库,然后单击“创建新文件”。Gitlab本人将提供文件模板,您必须在其中选择.gitlab-ci.yml。在gitlab中创建文件后,可以为文件内容选择模板。我选择了laravel并为自己重做一点:


# This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/php
# .    ,        
image: registry.gitlab.com/<>/<>:latest

# Pick zero or more services to be used on all builds.
# Only needed when using a docker container to run your tests in.
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-a-service
services:
  - mysql:latest
#    
variables:
  MYSQL_DATABASE: laravel
  MYSQL_ROOT_PASSWORD: ***********

# This folder is cached between builds
# ,      
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
cache:
  paths:
    - vendor/
    - node_modules/

# This is a basic example for a gem or script which doesn't use
# services such as redis or postgres
#     
before_script:
  #   
  - sudo apt-get update -yqq
  #    nodejs
  - sudo apt-get install gnupg -yqq
  #  Node   12
  - curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
  #  
  - sudo apt-get install git nodejs libcurl4-gnutls-dev libicu-dev libmcrypt-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libpq-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev -yqq
  #  composer
  - curl -sS https://getcomposer.org/installer | php
  - php composer.phar install
  - composer install
  #   Node
  - npm install
  # Copy over testing configuration.
  # Don't forget to set the database config in .env.testing correctly
  - DB_HOST=mysql
  - DB_DATABASE=laravel
  - DB_USERNAME=root
  - DB_PASSWORD=*********
  #  .env.example    .env
  - cp .env.example .env
  #  npm build
  - npm run dev
  #       laravel
  - php artisan key:generate
  - php artisan config:cache
  - php artisan route:clear
  - php artisan config:clear
  - php artisan cache:clear
  #  .
  - docker-compose exec app php artisan migrate
  #   
  #- docker-compose exec app php artisan db:seed

#
test:
  script:
    #  
    - php vendor/bin/phpunit --coverage-text --colors=never
    #  npm
    - npm test

#       
deploying:
  stage: deploy
  script:
    - echo "Deployed"
    - docker-compose stop
    - docker-compose up -d

在服务器的IP地址成功执行管道(CI / CD->管道)后,您应该看到laravel页面。

要配置CI / CD,我使用了Sean Bradley的说明:


medium.com/@sean_bradley/auto-devops-with-gitlab-ci-and-docker-compose-f931233f080f

All Articles