将docker与gitlab-ci集成-如何构建和使用docker映像?

时间:2018-07-05 15:12:00

标签: docker gitlab gitlab-ci gitlab-ci-runner

我以前是使用gitlab运行程序的外壳来构建项目的。到目前为止,我已经设置了管道,该管道将运行我在gitlab-ci.yml文件中设置的任何命令,如下所示:

gitlab-ci.yml使用外壳运行器

before_script:
  - npm install
  - npm install --save @angular/material @angular/cdk

cache:
  paths:
    - node_modules/

stages:
  - dev
  - staging
  - production

build_dev:
  stage: dev

  script:
    - rm ./package-lock.json
    - npm run build 
    - ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false

现在,我想切换到docker映像。我已将跑步者重新配置为使用docker映像,并且在新的gitlab-ci.yml文件中指定了该映像,如下所示。我遵循了gitlab-ci码头工人教程,这是它停下来的地方,所以我不确定要从哪里去:

gitlab-ci.yml使用dockerRunner

image: node:8.10.0

before_script:
  - npm install
  - npm install --save @angular/material @angular/cdk

cache:
  paths:
    - node_modules/

stages:
  - dev
  - staging
  - production

build_dev:
  stage: dev

  script:
    - rm ./package-lock.json
    - npm run build 
    - ./node_modules/@angular/cli/bin/ng test --browsers PhantomJS --watch false

问题:

  1. 使用我当前的gitlab-ci.yml文件,它如何构建一个docker映像/甚至可以构建一个?如果有,那是什么意思?当前管道通过了,但是我不知道它是否在docker镜像中进行(我应该能够告诉我吗?)。

    另外,假设创建了docker镜像,运行了测试,并且管道通过了;它应该将代码推送到新的存储库(尚未包含在yml文件中)。从我收集到的信息来看,图像没有被推送,只是代码,对吧?那么如何处理这个创建的docker映像?

  2. 如何使用Dockerfile?我看不到gitlab-ci.yml文件和Dockerfile之间的链接。

  3. 我是否需要在docker run <commands>docker exec <commands>中的gitlab-ci.yml文件中包含所有命令?如果不包括这两个命令之一,它似乎只会在服务器上运行,而不是在Docker映像中运行。

  4. 我已经看到人们在gitlab-ci.yml文件和Dockerfile中都指定了一个图像。我有一个有角度的项目,并且指定了一个image: node:8.10.0的图像。在Dockerfile中,我应该指定相同的映像吗?我见过一些项目,它们完全不同,我想知道这两个图像的用途//如果在另一个图像上选择一个图像会严重影响我的构建。

1 个答案:

答案 0 :(得分:2)

如果要完全使用docker化,则必须采用其他方法来构建应用。将有角度的东西导出到Dockerfile中,并在.gitlab-ci中获取docker操作,而不是像这里这样的有角度的东西:

stages:
  - build
#  - release
#  - deploy

.build_template: &build_definition
  stage: build
  image: docker:17.06
  services:
    - docker:17.06-dind
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker pull $CONTAINER_RELEASE_IMAGE || true
    - docker build --cache-from $CONTAINER_RELEASE_IMAGE -t $CONTAINER_IMAGE -f $DOCKERFILE ./
    - docker push $CONTAINER_IMAGE

build_app_job:
  <<: *build_definition
  variables:
    CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/app:$CI_COMMIT_REF_SLUG
    CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/app:latest
    DOCKERFILE: ./Dockerfile.app

build_nginx_job:
  <<: *build_definition
  variables:
    CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/nginx:$CI_COMMIT_REF_SLUG
    CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/nginx:latest
    DOCKERFILE: ./Dockerfile

您可以设置一些构建作业-用于生产,开发,登台等。 在您的.gitlab-ci.yaml旁边,您可以放置​​DockerfileDockerfile.app-Dockerfile.app代表您构建角度应用程序:

FROM node:10.5.0-stretch
RUN mkdir -p /usr/src/app
RUN mkdir -p /usr/src/remote
WORKDIR /usr/src/app
COPY . .
# do your commands here

现在,您的应用程序已构建,可以通过网络服务器进行服务-这是您的选择,并且每个选择都具有不同的配置-甚至无法在此处刮擦表面。可以在Dockerfile中实现-我们通常在公司中使用Nginx。

从这里开始,它是有关释放映像并部署它们的。我只指定了如何在docker中构建它们,因为这似乎是问题所在。

如果您想部署映像并将其运行在某个地方-选择一个提供程序-AWS,Heroku,自己的基础架构-随心所欲,但这实在无法涵盖所有​​内容,因此我将离开当您指定要将新生成的映像部署到何处以及如何为其提供服务时,它就会成为另一个问题。在我们的公司中,我们与Rancher一起安排事务,但是市场上有很多很棒的竞争性选择。


编辑以自定义注册表

上面的.gitlab-ci配置仅适用于Gitlab的“内部”注册表,如果您想利用自己的注册表,请相应地更改值:

#previous configs
script:
        - docker login -u mysecretlogin -p mysecretpasswd registry.local.com
        # further configs
  • -u gitlab-ci-token到您在注册表中的登录名,
  • $CI_JOB_TOKEN到您的密码
  • $CI_REGISTRY到您的注册地址

这些值应存储在Gitlab的CI secret variables中,并通过env变量进行引用,以使它们不会保存在存储库中。

最后,如果您决定保护这些值,则脚本可能如下所示。请参阅Gitlab的official docs on how to add secret CI variables-超级简单的任务。

#previous configs
script:
        - docker login -u $registrylogin -p $registrypasswd $registryaddress
        # further configs