Hosted Gitlabを使用してGitリポジトリをホストしています。最近では、これを使用してビルド/デプロイPHPおよびJavaアプリケーションをサーバーに。
ビルドが完了したら、SSHを使用してアプリケーションを展開します。これは、最終ビルドのコンテンツ(PHPファイル)をSSH経由でサーバーにアップロードする場合もあれば、コンパイルされた.jarファイルをアップロードし、リモートサーバーでコマンドを実行してサービスを再起動する場合もあります。
ビルド環境として独自のDockerコンテナーをセットアップしました。これには、ビルドを完了するために必要なJava、PHP、Composer、Mavenなどが含まれます。このイメージを使用してビルドを実行しています。
私が知りたいのは、gitlab-ci.yamlファイルで指定できる展開コマンドを実行するために他の外部サーバーにSSHで接続するにはどうすればよいですか?
ちょうど例として、要件がすでにインストールされているサーバーがあり、sshを使用してそのサーバーにデプロイしたいとします。
image: ubuntu:latest
stages:
- deploy
deploy_QA:
stage: deploy
environment:
name: Staging
url: "$QA_URL"
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- ssh-add <(echo "$PRIVATE_KEY")
- ssh -o StrictHostKeyChecking=no user@"$QA_SERVER" 'rm -rf /var/www/html/*'
- scp -P22 -r . ubuntu@"$QA_SERVER":/var/www/html
まず、この例では、ubuntuイメージを使用しています。また、gitlabシークレット変数を使用していることにも注意してください。 $ QA_URL、$ PRIVATE_KEY、$ DB_CONNECTION、$ QA_SERVER。重要なのは$ PRIVATE_KEYとQA_SERVERです。秘密鍵は、QA_SERVERで認証する必要があるものです(秘密鍵を使用している場合)。そして明らかに、QA_SERVERはコードをデプロイするアドレスです。
新しい変数アクセスを作成するには、gitlab-> settings-> CI/CDにアクセスします。
before_script内では、sshキーの作成と追加を行っていますが、コマンドラインを無効にしてパスワードを要求しています。 'StrictHostKeyChecking no'
ssh-add <(echo "$PRIVATE_KEY")
Sshキーをエージェントに追加します。
ssh -o StrictHostKeyChecking=no user@"$QA_SERVER" 'rm -rf /var/www/html/*'
必須ではありません:この行は/ var/www/html scp -P22 -r内のファイルを削除するためにsshを使用します。 ubuntu @ "$ QA_SERVER":/ var/www/html最後に、ファイルは現在のディレクトリから/ var/www/htmlにコピーされます。
パーミッションに注意してください、それはコピーしたいディレクトリに依存します。
Gitlab.comでsshを扱うのは簡単ではありません。
それが、.gitlab-ci.ymlのSSHヘルパーを書いた理由です。
こちらで確認できます https://gitlab.com/x4v13r/gitlab-ci
ちょうどinclude:それを.gitlab-ci.ymlに追加すると、次のようになります:
ssh_runroot myhostname $ MYHOST_PKEY "touch foo; cp foo bar; ls -al; rm foo bar; ls -al"