Gitlab CI 常用语法
.开头的任务不会执行- 缓存常用 key
- CI_COMMIT_REF_SLUG
 - CI_BUILD_REF_NAME
 
 
Hello World
stage:
  - build
Hello CI:
  stage: build
  script:
    - echo Hello Gitlab CI !
kaniko 镜像构建
如果不需要依赖 docker engine 则可以直接使用 kaniko
publish:
  stage: publish
  image:
    #name: registry.cn-hongkong.aliyuncs.com/cmi/kaniko-project_executor:v1.6.0-debug
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: ['']
  script:
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile ./Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  dependencies:
    - build
  only:
    - master
docker 构建
Build in Docker:
  image: wener/go:win
  stage: build
  services:
    - docker:dind
  script:
    - go env
Docker DinD
Build Image:
  stage: build
  services:
    - name: docker:dind
      # 可以修改镜像
      # command: ["--registry-mirror", "https://registry-mirror.example.com"]
  variables:
    DOCKER_HOST: tcp://docker:2375/
    DOCKER_DRIVER: overlay2
    # See https://github.com/docker-library/docker/pull/166
    DOCKER_TLS_CERTDIR: ''
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    # - yarn
    # - yarn build
    - echo Building image "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
    - docker build --pull -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
    # tagged as v20200601121212
    - CI_REGISTRY_IMAGE_DATA_VER="$CI_REGISTRY_IMAGE:v`date +"%Y%m%d%H%M%S"`"
    - docker tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" "$CI_REGISTRY_IMAGE_DATA_VER"
    - docker push "$CI_REGISTRY_IMAGE_DATA_VER"
Golang
- 缓存 GOPATH
 - 启动之前修改 GOPATH 使其能被缓存
 
default:
  cache:
    untracked: true
    key: '$CI_COMMIT_REF_SLUG'
    paths:
      - .cache
  before_script:
    - mkdir -p .cache
    # - export GOPATH="$CI_PROJECT_DIR/.cache"
    - export GOPATH="$PWD/.cache"
    - export PATH="$PWD/.cache/bin:$PATH"
    - export GO111MODULE=on
    - export GOPROXY=https://goproxy.io
代码仓库中版本更新
deploy-dev:
  stage: deploy-dev
  image: alpine:3.8
  before_script:
    - apk add --no-cache git curl bash
    - curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
    - mv kustomize /usr/local/bin/
    - git remote set-url origin https://${CI_USERNAME}:${CI_PUSH_TOKEN}@gitlab.com/andrew.kaczynski/gitops-webapp.git
    - git config --global user.email "gitlab@gitlab.com"
    - git config --global user.name "GitLab CI/CD"
  script:
    - git checkout -B master
    - cd deployment/dev
    - kustomize edit set image $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - cat kustomization.yaml
    - git commit -am '[skip ci] DEV image update'
    - git push origin master
  only:
    - master
deploy-prod:
  stage: deploy-prod
  image: alpine:3.8
  before_script:
    - apk add --no-cache git curl bash
    - curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash
    - mv kustomize /usr/local/bin/
    - git remote set-url origin https://${CI_USERNAME}:${CI_PUSH_TOKEN}@gitlab.com/andrew.kaczynski/gitops-webapp.git
    - git config --global user.email "gitlab@gitlab.com"
    - git config --global user.name "GitLab CI/CD"
  script:
    - git checkout -B master
    - git pull origin master
    - cd deployment/prod
    - kustomize edit set image $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - cat kustomization.yaml
    - git commit -am '[skip ci] PROD image update'
    - git push origin master
  only:
    - master
  when: manual
生成
构建之间传递变量
build:
  stage: build
  script: echo 'FOO=BAR' > build.env
  artifacts:
    report:
      dotenv: build.env
test:
  stage: test
  script: echo $FOO # "BAR"
  needs: [build]
继承
include:
  # 模板继承
  template: Serverless.gitlab-ci.yml
functions:build:
  extends: .serverless:build:functions
  # 设置环境信息
  environment: production
functions:deploy:
  extends: .serverless:deploy:functions
  environment: production
产出
Build Windows:
  stage: build
  tags:
    - windows
    - bash
  script:
    - make ci-windows
  artifacts:
    paths:
      - dist
    expire_in: 1 week
计划运行和非计划运行
job:on-schedule:
  only:
    - schedules
  script:
    - make world
job:
  except:
    - schedules
  script:
    - make build
Page
pages:
  script:
    - yarn
    - yarn build:public
  artifacts:
    # 路径必须 public
    paths:
      - public
  only:
    - master
Node
Publish NPM
Publish NPM:
  stage: deploy
  script:
    - echo '//gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}'>.npmrc
    - yarn lerna publish from-git --yes --registry "https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/"
  only:
    - tags