simple gitlab-ci

 simple gitlab-ci

Server

Deploy

Tạo một cặp key (trên bất cứ máy nào có thể chạy ssh-keygen)

ssh-keygen -t ecdsa -b 521 -f foo-gitlab-deploy -C foo.gitlab.deploy

Bỏ cặp key vào ~/.ssh và đổi ~/.ssh/config để dùng private-key này là key deploy cho gitlab

Host gitlab.com
        HostName gitlab.com
        IdentityFile ~/.ssh/foo-gitlab-deploy
        IdentitiesOnly yes

Xem phụ lục để set lại quyền trên thư mục .ssh

Nếu deploy vào thư mục www

  • Thêm user có sẵn vào group www : gpasswd -a*user www*
  • Chỉnh sửa quyền cho group www để user của chúng ta có thể ghi vào được thư mục www hoặc wwwroot
    • chmod g=wxr wwwroot
  • Clone code:
    • git clone git@repo.com/foo.git
    • chown -R www: wwwroot

CI

Tạo một cặp key (trên bất cứ máy nào có thể chạy ssh-keygen)

ssh-keygen -t ecdsa -b 521 -f foo-gitlab-ci -C foo.gitlab.ci

public-key chúng ta sẽ thêm vào ~/.ssh/authorized_keys của user có quyền pull code (nếu user ko có home folder thì coi phần phụ lục). Sau khi thêm xong nhớ

chmod 400 ~/.ssh/authorized_keys

Chú ý: Khi cần chỉnh sửa thì chmod 600 ~/.ssh/authorized_keys và dùng vi, vim, nano để sửa và nhớ trả về 400 sau khi hoàn thành

private-key chúng ta sẽ thêm vào biến SSH_PRIVATE_KEY trên gitlab settings

Tạo shell script để deploy như bên dưới, sửa lại các biến cho phù hợp. Lưu lại thành [foo-deploy.sh](<http://foo-deploy.sh>) chẳng hạn và thêm quyền thực thi cho nó chmod +x foo-deploy.sh

#!/bin/sh
    CURRENTDATE=`date +"%Y-%m-%d %T"`
    SRC_DIR="/home/foo/bar"
    DEPLOY_BRANCH="master"
    DEPLOY_LOG_FILE="/home/foo/nhanhoa-deploy.log"
    
    cd ${SRC_DIR} &&
    #git checkout ${DEPLOY_BRANCH} &&
    git fetch --all &&
    echo "[${CURRENTDATE}] done fetching" >> ${DEPLOY_LOG_FILE}
    git reset --hard origin/${DEPLOY_BRANCH} &&
    echo "[${CURRENTDATE}] successful" >> ${DEPLOY_LOG_FILE}
    chown -R www: .

Gitlab

Deploy

Dùng public-key cho deploy add vào SettingsRepositoryDeploy Keys

CI

Commit .gitlab-ci.yml vào mã nguồn, nội dung tương tự ví dụ bên dưới

Chú ý: thay [foo.bar](<http://foo.bar>) bằng domain của server

# vim: ts=2:sw=2
image: alpine
before_script:
  - apk add --update openssh-client bash
  - eval $(ssh-agent -s)
  - bash -c 'ssh-add <(echo "$SSH_PRIVATE_KEY")'
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan nhathuocnhanhoa.com >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
deploy_prod:
  type: deploy
  script:
    - ssh $DEPLOY_USER@$DEPLOY_HOST -C "$DEPLOY_COMMAND"
  only:
    - master

Chỉnh sửa một số tùy chỉnh cho phù hợp

SettingsCI / CDVariables

  • SSH_PRIVATE_KEY – private chúng ta khởi tạo lúc đầu
  • DEPLOY_USER – user có quyền với thu mục mã nguồn trên server
  • DEPLOY_HOST – domain
  • DEPLOY_COMMAND – thực thi shell script chúng ta đã chuẩn bị trên server
    • sh /home/foo/foo-deploy.sh

Phụ lục

SSH cho user không có home folder

~/.ssh/ is just the default location that sshd uses to look for incoming user’s public keys. You can configure the location and the file that sshd looks for by modifying the AuthorizedKeysFile directive in /etc/ssh/sshd_config. Mine currently looks like:

AuthorizedKeysFile     %h/.ssh/authorized_keys

The sshd_config man page provides a little more detail:

AuthorizedKeysFile
     Specifies the file that contains the public keys that can be used for user authentication.  The format is
     described in the AUTHORIZED_KEYS FILE FORMAT section of sshd(8).  AuthorizedKeysFile may contain tokens of
     the form %T which are substituted during connection setup.  The following tokens are defined: %% is
     replaced by a literal '%', %h is replaced by the home directory of the user being authenticated, and %u is
     replaced by the username of that user.  After expansion, AuthorizedKeysFile is taken to be an absolute
     path or one relative to the user's home directory.  Multiple files may be listed, separated by whitespace.
     The default is “.ssh/authorized_keys .ssh/authorized_keys2”.

Just be aware that sshd is very particular about the permissions of a user’s authorized_key file. You’ll want to keep a close eye on your logs if you set this up and run into problems logging in.

Chỉnh lại quyền cho thư mục .ssh

$ chmod go-w ~
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/*
$ chown -R $USER ~/.ssh

hoainguyen