summaryrefslogtreecommitdiff
path: root/.gitlab-ci.yml
blob: c7ff22293605749f145dc4334a5ee901dc88d9b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
image: php

variables:
  DOCKER_DRIVER: overlay2
  TEST_IMAGE: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}
  RELEASE_IMAGE: ${CI_REGISTRY_IMAGE}:latest
  MYSQL_DATABASE: engelsystem
  MYSQL_USER: engel
  MYSQL_PASSWORD: engelsystem
  MYSQL_HOST: mariadb
  MYSQL_RANDOM_ROOT_PASSWORD: "yes"
  MYSQL_INITDB_SKIP_TZINFO: "yes"
  DOCROOT: /var/www/

stages:
  - build
  - test
  - release
  - deploy

.docker_template: &docker_definition
  image: docker:18
  services:
    - docker:18-dind
  tags:
    - dind
  before_script:
    - docker login -u gitlab-ci-token -p "${CI_JOB_TOKEN}" "${CI_REGISTRY}"

build-image.nginx:
  <<: *docker_definition
  stage: build
  artifacts:
    name: "${CI_JOB_NAME}_${CI_JOB_ID}_assets"
    expire_in: 1 day
    paths:
      - ./public/assets
  script:
    - docker build --pull -t "${TEST_IMAGE}-nginx" -f docker/nginx/Dockerfile .
    - docker push "${TEST_IMAGE}-nginx"
    - instance=$(docker create "${TEST_IMAGE}-nginx")
    - docker cp "${instance}:/var/www/public/assets" public/
    - docker rm "${instance}"

build-image:
  <<: *docker_definition
  stage: build
  script:
    - apk -q add git
    - VERSION="$(git describe --abbrev=0 --tags)-${CI_COMMIT_REF_NAME}+${CI_PIPELINE_ID}.${CI_COMMIT_SHORT_SHA}"
    - docker build --pull --build-arg VERSION="${VERSION}" -t "${TEST_IMAGE}" -f docker/Dockerfile .
    - docker push "${TEST_IMAGE}"

test:
  image: ${TEST_IMAGE}
  stage: test
  services:
    - mariadb:10.2
  artifacts:
    name: "${CI_JOB_NAME}_${CI_JOB_ID}"
    expire_in: 1 week
    when: always
    paths:
      - ./coverage/
      - ./unittests.xml
    reports:
      junit: ./unittests.xml
  coverage: '/^\s*Lines:\s*(\d+(?:\.\d+)?%)/'
  before_script:
    - apk add -q ${PHPIZE_DEPS} && pecl install pcov > /dev/null && docker-php-ext-enable pcov
    - curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer
    - cp -R tests/ phpunit.xml "${DOCROOT}"
    - HOMEDIR=$PWD
    - cd "${DOCROOT}"
    - composer --no-ansi install
    - ./bin/migrate
  script:
    - php -d pcov.enabled=1 vendor/bin/phpunit -vvv --colors=never --coverage-text --coverage-html "${HOMEDIR}/coverage/" --log-junit "${HOMEDIR}/unittests.xml"
    - ./bin/migrate down

check-style:
  image: ${TEST_IMAGE}
  stage: test
  before_script:
    - curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer
    - cp -R tests/ "${DOCROOT}"
    - cd "${DOCROOT}"
    - composer --no-ansi install
  script:
    - ./vendor/bin/phpcs --no-colors --basepath="$PWD" -p --standard=PSR12 config/ db/ public/index.php src/ tests/

release-image:
  <<: *docker_definition
  stage: release
  script:
    - docker pull "${TEST_IMAGE}"
    - docker tag "${TEST_IMAGE}" "${RELEASE_IMAGE}"
    - docker push "${RELEASE_IMAGE}"
  only:
    - master

release-image.nginx:
  <<: *docker_definition
  stage: release
  script:
    - docker pull "${TEST_IMAGE}-nginx"
    - docker tag "${TEST_IMAGE}-nginx" "${RELEASE_IMAGE}-nginx"
    - docker push "${RELEASE_IMAGE}-nginx"
  only:
    - master

.deploy_template: &deploy_definition
  stage: deploy
  image: ${TEST_IMAGE}
  before_script:
    - apk add bash rsync openssh-client

.deploy_template_script:
  # Configure SSH
  - &deploy_template_script |-
    mkdir -p ~/.ssh
    echo "${SSH_PRIVATE_KEY}" | sed -e 's/\r//g' > ~/.ssh/id_ed25519
    chmod 600 ~/.ssh/id_ed25519
    rsync -vAax public/assets ${DOCROOT}/public/
    cd "${DOCROOT}"

build-release-file:
  <<: *deploy_definition
  stage: deploy
  artifacts:
    name: "release_${CI_COMMIT_REF_SLUG}_${CI_JOB_ID}_${CI_COMMIT_SHA}"
    expire_in: 1 week
    paths:
      - ./release/
  script:
    - rsync -vAax "${DOCROOT}" "${DOCROOT}/.babelrc" "${DOCROOT}/.browserslistrc" release/
    - rsync -vAax public/assets release/public/

deploy-staging:
  <<: *deploy_definition
  environment:
    name: staging
  only:
    - master
  script:
    # Check if deployment variables where set
    - |-
      if [ -z "${SSH_PRIVATE_KEY}" ] || [ -z "${STAGING_REMOTE}" ] || [ -z "${STAGING_REMOTE_PATH}" ]; then
        echo "Skipping deployment";
        exit
      fi
    - *deploy_template_script
    # Deploy to server
    - ./bin/deploy.sh -r "${STAGING_REMOTE}" -p "${STAGING_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"

deploy-production:
  <<: *deploy_definition
  environment:
    name: production
  when: manual
  only:
    - master
  script:
    # Check if deployment variables where set
    - |-
      if [ -z "${SSH_PRIVATE_KEY}" ] || [ -z "${PRODUCTION_REMOTE}" ] || [ -z "${PRODUCTION_REMOTE_PATH}" ]; then
        echo "Skipping deployment";
        exit
      fi
    - *deploy_template_script
    # Deploy to server
    - ./bin/deploy.sh -r "${PRODUCTION_REMOTE}" -p "${PRODUCTION_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"