# 代码部署

# SVN部署

注意

如果应用的代码管理方式是SVN才可以使用SVN部署,否则请选择相应的代码管理方式文档查询如何部署。

# 获取仓库地址

  1. 登陆云应用的管理系统https://sae.sinacloud.com (opens new window)
  2. 从操作点击“管理”进入应用的管理中心 进入应用的管理中心
  3. 左侧导航选择“运行环境管理”,点击“代码管理”,选择“SVN仓库信息” SVN仓库地址

# 仓库的用户名密码

  • 用户名是安全邮箱
  • 密码是安全密码

安全邮箱和密码说明

# 修改仓库密码

如果忘记可以从 http://www.sinacloud.com/ucenter/profile.html?from=sidebar (opens new window) 重置。

# Windows系统安装客户端

Windows系统推荐使用TortoiseSVN客户端,可以去官网下载TortoiseSVN客户端 (opens new window),也可以直接从国内的镜像下载:

说明

如果使用TortoiseSVN 1.8.x部署代码发生问题,请尝试更新至最新版本或者使用1.8以下的版本。

# Mac系统安装客户端

MacOS默认已经安装了svn客户端,如果没有推荐使用brewhttps://brew.sh/ (opens new window))安装,依次执行:

brew update
brew install subversion18
echo 'export PATH="/usr/local/opt/subversion@1.8/bin:$PATH"' >> ~/.zshrc

安装完成后,可以执行svn --version查询到SVN版本:

svn, version 1.8.16 (r1740329)
   compiled Apr  2 2017, 22:11:44 on x86_64-apple-darwin16.5.0

Copyright (C) 2016 The Apache Software Foundation.
This software consists of contributions made by many people;
see the NOTICE file for more information.
Subversion is open source software, see http://subversion.apache.org/ 

# Ubuntu系统安装客户端

apt-get update
apt-get install subversion 

安装完成后,执行svn --version可以查询SVN的版本。

root@8ae1a18089b3:/# svn --version
svn, version 1.10.0 (r1827917)
   compiled Jul 29 2018, 02:58:30 on x86_64-pc-linux-gnu
Copyright (C) 2018 The Apache Software Foundation.
This software consists of contributions made by many people;
see the NOTICE file for more information.
Subversion is open source software, see http://subversion.apache.org/
The following repository access (RA) modules are available:
* ra_svn : Module for accessing a repository using the svn network protocol.
  - with Cyrus SASL authentication
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme
* ra_serf : Module for accessing a repository via WebDAV protocol using serf.
  - using serf 1.3.9 (compiled with 1.3.9)
  - handles 'http' scheme
  - handles 'https' scheme
The following authentication credential caches are available:
* Plaintext cache in /.subversion
* GPG-Agent
* KWallet (KDE) 

# Windows克隆仓库

说明

请在操作前在管理平台创建一个版本。

请参考以下步骤克隆代码:

  1. 在一个空的文件夹下点击鼠标右键,选择“SVN Checkout...” 选择SVN checkout

  2. 输入应用的仓库地址 输入svn仓库地址

  3. 输入用户名密码

  • 用户名是安全邮箱
  • 密码是安全密码

安全邮箱和密码说明

  1. 下载仓库的代码成功 下载仓库代码成功

  2. 查看本地的文件结构

    打开本地的文件夹,可以看到所有的代码都在以版本号为文件夹的目录中:

    本地的文件列表

    和在线看到的版本是一致的:

    在线查看版本列表

    从上面就可以看出,每个版本的代码在以版本号为文件夹名称的文件夹下。

    说明

    如果你直接checkout仓库,但是没有没有创建任何版本,checkout代码后本地的文件夹会是空的。在这种情况下,如果需要提交代码,需要在当前目录下创建一个数字目录,然后将所有的文件放到数字目录下再提交。

# MacOS、Ubuntu克隆仓库

MacOS、Ubuntu下都使用svn客户端下载代码,因此合并介绍。

执行命令:

svn checkout 'https://svn.sinacloud.com/YOUR_APP_NAME' . 

出现

Error validating server certificate for 'https://svn.sinacloud.com:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: *.sinacloud.com
 - Valid: from Feb  5 00:00:00 2018 GMT until Jun 19 12:00:00 2020 GMT
 - Issuer: GeoTrust RSA CA 2018, www.digicert.com, DigiCert Inc, US
 - Fingerprint: 79:63:A9:F4:45:62:7C:25:CF:5F:49:5D:37:E0:1A:0C:E4:15:FF:B6
(R)eject, accept (t)emporarily or accept (p)ermanently?  

输入p接收,接下来按图示的提示输入即可:

在命令行下checkout代码

执行ls -al可以看到本地的文件结构和应用的数字版本也是一致的:

本地文件列表

在线看到的版本列表为:

在线查看版本列表

# Windows下提交修改后的代码

可以使用任何编辑器修改本地的代码,修改后在SVN的文件夹目录下点击右键,选择“SVN Commit...”,具体的步骤如下:

  1. 在SVN的代码目录点击“右键”,选择“SVN Commit..”

    选择svn commit
  2. 选择需要提交的文件,写入本次提交需要提交的commit信息,点击确认:

    选择需要提交的文件和信息
  3. 提交成功后,将回显本次提交的版本号:

    提交成功显示版本号

# MacOS、Ubuntu下提交修改后的代码

通过vim或者其他编辑器修改代码后,需要将本地修改的文件提交到svn仓库,需要通过两个步骤达成目标:

  1. svn add 添加需要提交的文件

比如我们在本地创建了一个新的文件c.txt

touch c.txt 

通过svn status 或者 svn st可以看到本地的文件改动状态:

root@8ae1a18089b3:/tmp/svn# touch c.txt
root@8ae1a18089b3:/tmp/svn# svn status
?       c.txt
root@8ae1a18089b3:/tmp/svn# 

通过 svn add 文件路径 添加需要改动的文件:

root@8ae1a18089b3:/tmp/svn# svn add c.txt 
A         c.txt

这时再看本地的文件改动状态:

root@8ae1a18089b3:/tmp/svn# svn status
A       c.txt 

可以看到c.txt已经时A增加的状态了。

  1. 增加commit信息并提交
root@8ae1a18089b3:/tmp/svn/1# svn commit -m 'commit info'
Adding         c.txt
Transmitting file data .done
Committing transaction...
Committed revision 93. 

关于commit信息

commit info是本次提交的备注部分,建议不要留空,详细描述本地的文件和功能改动,方便审计和回滚。

# Windows下更新代码

如果在多人协作时,在修改代码前,应该执行SVN Update操作更新本地的代码,执行步骤如下:

  1. 在版本的文件夹空白处点击右键,选择“SVN Update”
执行SVN update操作
  1. 执行完可以看到本地改动的文件列表
执行SVN update结果

# MacOS、Ubuntu下更新代码

如果在多人协作时,在修改代码前,应该执行svn up更新本地的代码,执行效果:

更新本地代码

# Windows下冲突合并

在多人协作时,或者在不同的地方同时编辑了一个文件,且在改动前没有执行svn update更新本地的代码,则在提交时会出现冲突。

代码出现冲突是很正常的时候,这时候需要执行手工合并冲突操作,以下将演示如何合并冲突。

  1. 从Ubuntu的环境下修改一个文件,正常提交:
root@8ae1a18089b3:/tmp/svn/1# echo "11223344" > c.txt 
root@8ae1a18089b3:/tmp/svn/1# svn st
M       c.txt
root@8ae1a18089b3:/tmp/svn/1# svn commit -m 'update c.txt'
Sending        c.txt
Transmitting file data .done
Committing transaction...
Committed revision 94. 
  1. 在Windows下先不执行svn update操作,也修改c.txt文件:
在Windows下修改文件
  1. 在Windows的文件夹,右键“SVN Commit..”提交改动,就会发现冲突
出现冲突
  1. 点击弹框的确认,系统会弹出一个需要“Update”的提示
需要合并
  1. 点击“Update”完成更新,会出现提示
冲突后的update操作
  1. 这时候再看c.txt文件的内容
<<<<<<< .mine
这里是Windows下的修改||||||| .r93
=======
11223344
>>>>>>> .r94 

注意

  • <<<<<<< .mine||||||| .r93表示本地的93版本的内容
  • =======>>>>>>> .r94 表示远程仓库的94版本的内容

这时候就需要自己手工去掉不需要的部分了,例如继续使用93版本的内容,去掉94的内容,改为

这里是Windows下的修改 
  1. 在本地的目录下解决冲突

点击右键,选择svn,选择Resolve..解决冲突

svn-resolve
  1. 选择已经解决冲突的文件
选择已经解决冲突的文件

点击确认后,系统会弹出已经解决冲突的提示:

冲突已经解决
  1. 再次提交到远程仓库

再次提交到远程,这时发现已经成功了。

再次提交到远程

# MacOS、Ubuntu下冲突合并

因为MacOS、Ubuntu下都是使用svn命令实现,因此合并介绍。

  1. 在Windows下修改c.txt内容,并提交。
在Windows下修改文件

提交改动:

提交改动
  1. 在Ubuntu下也修改同样的文件,但是不要先执行svn update

通过vim修改文件:

root@8ae1a18089b3:/tmp/svn/1# vim c.txt 
root@8ae1a18089b3:/tmp/svn/1# cat c.txt 
helllllllllll 
  1. 提交时会出现冲突
root@8ae1a18089b3:/tmp/svn/1# svn commit -m 'add files'
Sending        c.txt
svn: E155011: Commit failed (details follow):
svn: E155011: File '/tmp/svn/1/c.txt' is out of date
svn: E160024: resource out of date; try updating 
  1. 解决冲突

先按系统的提示执行update操作:

root@8ae1a18089b3:/tmp/svn/1# svn update
Updating '.':
C    c.txt
Updated to revision 96.
Summary of conflicts:
  Text conflicts: 1
Merge conflict discovered in file 'c.txt'.
Select: (p) Postpone, (df) Show diff, (e) Edit file, (m) Merge,
        (s) Show all options:

可以按提示执行各种操作,例如输入df查看文件改动:

root@8ae1a18089b3:/tmp/svn/1# svn update
Updating '.':
C    c.txt
Updated to revision 96.
Summary of conflicts:
  Text conflicts: 1
Merge conflict discovered in file 'c.txt'.
Select: (p) Postpone, (df) Show diff, (e) Edit file, (m) Merge,
        (s) Show all options: df
--- c.txt.r96   - THEIRS
+++ c.txt       - MERGED
@@ -1 +1,5 @@
-这里是Windows下的修改2222222
\ No newline at end of file
+<<<<<<< .mine
+helllllllllll
+||||||| .r95
+这里是Windows下的修改=======
+这里是Windows下的修改2222222>>>>>>> .r96

其中:

-这里是Windows下的修改2222222
\ No newline at end of file

是现在仓库中版本96的内容。

+<<<<<<< .mine+||||||| .r95是本地的文件内容。

输入e指令编辑本地的文件:

root@8ae1a18089b3:/tmp/svn/1# svn update
Updating '.':
C    c.txt
Updated to revision 96.
Summary of conflicts:
  Text conflicts: 1
Merge conflict discovered in file 'c.txt'.
Select: (p) Postpone, (df) Show diff, (e) Edit file, (m) Merge,
        (s) Show all options: df
--- c.txt.r96   - THEIRS
+++ c.txt       - MERGED
@@ -1 +1,5 @@
-这里是Windows下的修改2222222
\ No newline at end of file
+<<<<<<< .mine
+helllllllllll
+||||||| .r95
+这里是Windows下的修改=======
+这里是Windows下的修改2222222>>>>>>> .r96
Select: (p) Postpone, (df) Show diff, (e) Edit file, (m) Merge,
        (r) Mark as resolved, (s) Show all options: e
Select: (p) Postpone, (df) Show diff, (e) Edit file, (m) Merge,
        (r) Mark as resolved, (s) Show all options: m
Merging 'c.txt'.
Conflicting section found during merge:
(1) their version (at line 0)         |(2) your version (at line 1)          
--------------------------------------+--------------------------------------
这里是Windows下的修改2222222          |helllllllllll                         
--------------------------------------+--------------------------------------
Select: (1) use their version, (2) use your version,
        (12) their version first, then yours,
        (21) your version first, then theirs,
        (e1) edit their version and use the result,
        (e2) edit your version and use the result,
        (eb) edit both versions and use the result,
        (p) postpone this conflicting section leaving conflict markers,
        (a) abort file merge and return to main menu: 2
Merge of 'c.txt' completed.
Select: (p) Postpone, (df) Show diff, (e) Edit file, (m) Merge,
        (r) Mark as resolved, (s) Show all options: p
Summary of conflicts:
  Text conflicts: 1 

删除本地无用的文件c.txt.mine、c.txt.r95、c.txt.r96等

root@8ae1a18089b3:/tmp/svn/1# ls -al
total 560
drwxr-xr-x 4 root root  4096 Sep 20 05:58 .
drwxr-xr-x 6 root root    46 Sep 20 02:43 ..
drwxr-xr-x 3 root root   123 Sep 20 02:14 .idea
-rw-r--r-- 1 root root 52095 Sep 19 11:54 Destiny.jpg
-rw-r--r-- 1 root root 11087 Sep 19 11:54 bg.jpg
-rw-r--r-- 1 root root    14 Sep 20 05:58 c.txt
-rw-r--r-- 1 root root    14 Sep 20 05:50 c.txt.mine
-rw-r--r-- 1 root root    28 Sep 20 05:50 c.txt.r95
-rw-r--r-- 1 root root    35 Sep 20 05:50 c.txt.r96
-rw-r--r-- 1 root root   918 Sep 19 11:54 callback.php
-rw-r--r-- 1 root root  8711 Sep 19 11:54 cg_result.php
-rw-r--r-- 1 root root    35 Sep 19 11:54 config.yaml
-rw-r--r-- 1 root root   109 Sep 19 11:54 config_weibo.php
-rw-r--r-- 1 root root  1028 Sep 20 02:14 dataImport.php
-rw-r--r-- 1 root root 35233 Sep 19 11:54 hehun_result.php
drwxr-xr-x 2 root root   128 Sep 19 11:54 hello
-rw-r--r-- 1 root root  3110 Sep 20 02:14 index.php
-rw-r--r-- 1 root root  2822 Sep 19 11:54 index__test.html
-rw-r--r-- 1 root root 31449 Sep 19 11:54 logo.jpeg
-rw-r--r-- 1 root root 20720 Sep 19 11:54 logo.jpg
-rw-r--r-- 1 root root 11894 Sep 19 11:54 logo_small.jpg
-rw-r--r-- 1 root root   179 Sep 19 11:54 mysql.php
-rw-r--r-- 1 root root   302 Sep 19 11:54 nosql.php
-rw-r--r-- 1 root root   258 Sep 19 11:54 nosql_get.php
-rw-r--r-- 1 root root 10056 Sep 19 11:54 number.php
-rw-r--r-- 1 root root 31192 Sep 19 11:54 sae_selfchk_oz41l5ow40.php
-rw-r--r-- 1 root root  3357 Sep 19 11:54 send.php
-rw-r--r-- 1 root root  1255 Sep 19 11:54 test.php
-rw-r--r-- 1 root root 34825 Sep 19 11:54 total.html
-rw-r--r-- 1 root root 35204 Sep 19 11:54 total.php
-rw-r--r-- 1 root root  9978 Sep 19 11:54 wb.png
-rw-r--r-- 1 root root 16128 Sep 19 11:54 weibo_login.png
-rw-r--r-- 1 root root 80252 Sep 19 11:54 weibooauth.php
-rw-r--r-- 1 root root 92622 Sep 19 11:54 xf_result.php
root@8ae1a18089b3:/tmp/svn/1# rm -rf c.txt.* 

输入svn st查看本地的状态

root@8ae1a18089b3:/tmp/svn/1# svn st
M       c.txt 

再次提交改动:

root@8ae1a18089b3:/tmp/svn/1# svn st
M       c.txt
root@8ae1a18089b3:/tmp/svn/1# svn commit -m 'merge confit'
Sending        c.txt
Transmitting file data .done
Committing transaction...
Committed revision 97. 

到此冲突已经解决。

# Git部署

说明

请确认应用的代码管理方式是Git时再使用Git客户端部署代码,否则请参考其他的部署方式。

# Windows客户端命令行安装

Windows下推荐使用git-scm安装git客户端,git-scm官网 (opens new window),请选择你的操作系统后下载软件。

新浪云分流下载:

说明

如果操作系统是64位,就选择64位的软件安装;如果系统是32位,就选择32位的软件安装。

下载后,一路按系统的推荐配置安装,安装完成后,从任意文件夹下空白处点击右键,都会出现Git bash here,点击进入命令行:

Git bash here

执行git --version可以查询当前安装的git客户端版本。

Git version windows

# MacOS客户端安装

Mac推荐使用brewhttps://brew.sh/ (opens new window))安装,依次执行:

brew install git

安装完成后可以执行 git --version查看安装的git版本:

Git version mac

# Ubuntu客户端安装

执行命令:

apt-get install git

安装完成后执行 git version查询安装的git版本:

Git version ubuntu

# 获取标准环境的git仓库地址

  1. 登陆云应用的管理系统https://sae.sinacloud.com (opens new window)
  2. 从操作点击“管理”进入应用的管理中心 进入应用的管理中心
  3. 左侧导航选择“运行环境管理”,点击“代码管理”,选择“Git仓库信息” 获取标准环境的git仓库地址

# 获取容器环境的git仓库地址

  1. 登陆云应用的管理系统https://sae.sinacloud.com (opens new window)
  2. 从操作点击“管理”进入应用的管理中心 进入应用的管理中心
  3. 左侧导航选择“运行环境管理”,点击“代码管理” 获取容器环境的git仓库地址

# PHP标准环境Git管理示例

# 创建应用

以PHP运行环境为例,创建应用时,选择“PHP”语言,运行环境选择“标准”,代码管理方式选择“Git”,即可创建一个Git管理的标准环境应用。

  1. 登录云应用管理平台 https://sae.sinacloud.com (opens new window)
  2. 点击“+创建应用”进入应用的创建功能
  3. 按以下图示选择,语言选择“PHP”,运行环境选择“标准环境”,代码管理方式选择“Git” 创建一个git管理的标准环境应用

# 创建版本

创建完成后,从应用的管理中心,选择左侧导航“运行环境管理” - “代码管理”进入代码管理功能,点击“+创建新版本”:

Git在线创建新版本

输入版本号1,点击确认创建版本。

创建版本1

# 本地clone仓库代码

在命令行执行 git clone '仓库地址' .将仓库中的代码下载到本地:

root@8ae1a18089b3:/tmp/git# git clone 'https://git.sinacloud.com/gitexample' .
Cloning into '.'...
Username for 'https://git.sinacloud.com': hfutming@gmail.com
Password for 'https://hfutming@gmail.com@git.sinacloud.com': 
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.

下载后的本地文件列表:

root@8ae1a18089b3:/tmp/git# ls -al
total 4
drwxr-xr-x 3 root root  30 Sep 20 08:51 .
drwxrwxrwt 4 root root  28 Sep 20 08:51 ..
drwxr-xr-x 8 root root 163 Sep 20 08:51 .git
-rw-r--r-- 1 root root  15 Sep 20 08:51 .sae

# 添加一个文件

在根目录下添加一个文件index.php

<?php
phpinfo();

执行git status查看状态:

root@8ae1a18089b3:/tmp/git# git status
On branch 1
Your branch is up to date with 'origin/1'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        index.php
nothing added to commit but untracked files present (use "git add" to track)

可以看到index.php还没有加到版本管理中,执行git add index.php添加到版本管理中

root@8ae1a18089b3:/tmp/git# git add index.php 
root@8ae1a18089b3:/tmp/git# git status
On branch 1
Your branch is up to date with 'origin/1'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        new file:   index.php

批量添加文件

可以使用 git add --all 添加所有文件

这时候文件的状态已经变为“new file”。

# 设置提交者的邮箱和昵称

在commit操作前,需要设定提交的邮箱和昵称,依次执行。

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

请注意

请把“you@example.com”换成你的邮箱,“Your Name”换成你的昵称。

# 添加commit信息

执行

git commit -m '本次提交的信息'

例如

root@8ae1a18089b3:/tmp/git# git commit -m 'first upload'
[1 98dcf6b] first upload
 1 file changed, 2 insertions(+)
 create mode 100644 index.php

# 推送到远程仓库

执行git push origin 1将本地的改动提交到远程的git仓库,请注意这里的1是应用的版本,也是当前的分支名称,查询当前分支:

root@8ae1a18089b3:/tmp/git# git branch
* 1

因此,这里的分支名称和版本号是一一对应的,开始推送:

root@8ae1a18089b3:/tmp/git# git push origin 1
Username for 'https://git.sinacloud.com': hfutming@gmail.com
Password for 'https://hfutming@gmail.com@git.sinacloud.com': 
Counting objects: 3, done.
Delta compression using up to 16 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes | 281.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git.sinacloud.com/gitexample
   3ce3ffc..98dcf6b  1 -> 1

可以看到本次提交已经成功了,hash值为98dcf6b

# 查询修改记录

执行git log可以查询当前版本的修改记录,例如:

root@8ae1a18089b3:/tmp/git# git log 
commit 98dcf6b75e2b9ac10b6febe57d805cd99ca61879 (HEAD -> 1, origin/HEAD, origin/1)
Author: hfutming <hfutming@gmail.com>
Date:   Thu Sep 20 09:22:41 2018 +0000
    first upload
commit 3ce3ffcc4c31528715c8b87dfa938805cf435bca
Author: Nobody <nobody@yq230.onlinemgr>
Date:   Thu Sep 20 16:48:09 2018 +0800
    create new version: 1 from online manager platform

可以查询到提交的人、上传的时间及commit的log。

# 验证访问

此时可以访问二级域名查询是否提交成功,直接访问域名http://你的应用名.applinzi.com/ (opens new window),可以看到已经输出了PHP Info的页面:

验证index.php上传是否成功

# 删除文件

参考添加文件的步骤,再添加一个2.txt文件,增加后的文件目录为:

root@8ae1a18089b3:/tmp/git# ls -al
total 12
drwxr-xr-x 3 root root  60 Sep 20 09:43 .
drwxrwxrwt 4 root root  28 Sep 20 09:42 ..
drwxr-xr-x 8 root root 185 Sep 20 09:43 .git
-rw-r--r-- 1 root root  15 Sep 20 09:43 .sae
-rw-r--r-- 1 root root   2 Sep 20 09:43 2.txt
-rw-r--r-- 1 root root  17 Sep 20 09:43 index.php

接下来演示如何删除文件2.txt

root@8ae1a18089b3:/tmp/git# git rm 2.txt 
rm '2.txt'
root@8ae1a18089b3:/tmp/git# git commit -m 'delete 2.txt'
[1 60f8782] delete 2.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 2.txt
root@8ae1a18089b3:/tmp/git# git push origin 1
Username for 'https://git.sinacloud.com': hfutming@gmail.com
Password for 'https://hfutming@gmail.com@git.sinacloud.com': 
Counting objects: 2, done.
Delta compression using up to 16 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 215 bytes | 215.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To https://git.sinacloud.com/gitexample
   025c101..60f8782  1 -> 1

# 代码回滚

执行git revert可以撤销刚才的改动,例如将上述的删除2.txt文件撤销:

root@8ae1a18089b3:/tmp/git# git revert HEAD
[1 c386dd3] Revert "delete 2.txt"
 1 file changed, 1 insertion(+)
 create mode 100644 2.txt
root@8ae1a18089b3:/tmp/git# ls
2.txt  index.php
root@8ae1a18089b3:/tmp/git# git push origin 1     
Username for 'https://git.sinacloud.com': hfutming@gmail.com
Password for 'https://hfutming@gmail.com@git.sinacloud.com': 
Counting objects: 3, done.
Delta compression using up to 16 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 324 bytes | 324.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git.sinacloud.com/gitexample
   60f8782..c386dd3  1 -> 1

# 容器环境Git管理示例

容器环境Node.js、Python独享环境、Golang等环境使用Git管理代码,示例以Node.js为例。

# 创建Node.js应用

  1. 登录云应用管理平台 https://sae.sinacloud.com (opens new window)
  2. 点击“+创建应用”进入应用的创建功能
  3. 按以下图示选择,语言选择“NodeJS”,选择一个应用的二级域名,点击创建应用 创建Nodejs应用

# 查询Git仓库地址

进入应用的管理中心,点击左侧导航“运行环境管理”,选择“代码管理”:

查询Node.js仓库信息

说明

以下示例在Linux环境下执行。

# Git clone仓库

执行:

git clone 'https://git.sinacloud.com/你的应用名' .

示例:

root@8ae1a18089b3:/tmp/node.js# git clone 'https://git.sinacloud.com/nodejsexample' .
Cloning into '.'...
Username for 'https://git.sinacloud.com': hfutming@gmail.com
Password for 'https://hfutming@gmail.com@git.sinacloud.com': 
warning: You appear to have cloned an empty repository.

# 下载示例代码

依次执行:

wget 'https://codeload.github.com/sinacloud/nodejs-getting-started/zip/master'
unzip master
cp -rp nodejs-getting-started-master/* .
rm -rf nodejs-getting-started-master/

示例输出:

root@8ae1a18089b3:/tmp/node.js# wget 'https://codeload.github.com/sinacloud/nodejs-getting-started/zip/master'
--2018-09-20 11:08:38--  https://codeload.github.com/sinacloud/nodejs-getting-started/zip/master
Resolving codeload.github.com (codeload.github.com)... 192.30.253.121, 192.30.253.120
Connecting to codeload.github.com (codeload.github.com)|192.30.253.121|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: 'master'
master                                                          [ <=>                                                                                                                                     ]   2.02K  --.-KB/s    in 0.002s  
2018-09-20 11:08:40 (1.20 MB/s) - 'master' saved [2073]
root@8ae1a18089b3:/tmp/node.js# unzip master 
Archive:  master
ed9e0af8d1fb884aabb36eac76c8bfa6c0de5227
   creating: nodejs-getting-started-master/
 extracting: nodejs-getting-started-master/.gitignore  
  inflating: nodejs-getting-started-master/README.md  
  inflating: nodejs-getting-started-master/config.yaml  
  inflating: nodejs-getting-started-master/index.js  
  inflating: nodejs-getting-started-master/package.json  
root@8ae1a18089b3:/tmp/node.js# cp -rp nodejs-getting-started-master/* .
root@8ae1a18089b3:/tmp/node.js# rm -rf nodejs-getting-started-master/
root@8ae1a18089b3:/tmp/node.js# ls -al
total 20
drwxr-xr-x 3 root root  104 Sep 20 11:08 .
drwxrwxrwt 5 root root   43 Sep 20 11:08 ..
drwxr-xr-x 7 root root  119 Sep 20 11:05 .git
-rw-r--r-- 1 root root  849 Sep 14 10:43 README.md
-rw-r--r-- 1 root root   75 Sep 14 10:43 config.yaml
-rw-r--r-- 1 root root  156 Sep 14 10:43 index.js
-rw-r--r-- 1 root root 2073 Sep 20 11:08 master
-rw-r--r-- 1 root root  360 Sep 14 10:43 package.json
root@8ae1a18089b3:/tmp/node.js# 

# git add 文件

git add --all

# git commit增加日志信息

执行

git commit -m 'first init'

输出如下:

root@8ae1a18089b3:/tmp/node.js# git commit -m 'first init'
[master (root-commit) ac93113] first init
 5 files changed, 64 insertions(+)
 create mode 100644 README.md
 create mode 100644 config.yaml
 create mode 100644 index.js
 create mode 100644 master
 create mode 100644 package.json

# git push到远程

执行:

git push origin master

输出如下:

root@8ae1a18089b3:/tmp/node.js# git push origin master
Username for 'https://git.sinacloud.com': hfutming@gmail.com
Password for 'https://hfutming@gmail.com@git.sinacloud.com': 
Counting objects: 7, done.
Delta compression using up to 16 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 2.66 KiB | 908.00 KiB/s, done.
Total 7 (delta 0), reused 0 (delta 0)
remote: 导出 Git 代码中...
remote: 构建程序中...
-----> Node.js app detected
-----> Network Connection Success
       
-----> Creating runtime environment
       
       NPM_CONFIG_LOGLEVEL=error
       NPM_CONFIG_PRODUCTION=true
       NODE_ENV=production
       NODE_MODULES_CACHE=true
       
-----> Installing binaries
       engines.node (package.json):  10.10.0
       engines.npm (package.json):   unspecified (use default)
       
       Downloading and installing node 10.10.0...
       Using default npm version: 6.4.1
       
-----> Restoring cache
       Skipping cache restore (new runtime signature)
       
-----> Building dependencies
       Pruning any extraneous modules
       up to date in 0.494s
       Installing node modules (package.json)
       registry
       http://registry.npm.taobao.org/
       added 50 packages from 47 contributors in 4.329s
       
-----> Caching build
       Clearing previous node cache
       Saving 2 cacheDirectories (default):
       - node_modules
       - bower_components (nothing to cache)
       - nodegyp_lib (nothing to cache)
       
-----> Build succeeded!
       `-- express@4.16.3
       
-----> Discovering process types
       Default types for  -> web
-----> Compiled slug size is 19M
remote: Generating docker image...
remote: Pushing image registry.docker.sae.sina.com.cn/nodejsexample:ac93113 ....
remote: 部署程序中 ...........
To https://git.sinacloud.com/nodejsexample
 * [new branch]      master -> master

请注意

容器运行环境的分类只支持一个分支,分支的名称是master

# 验证访问

访问域名可以看到应用已经部署完成:

NodeJS应用访问效果

# FTP部署

请注意

说明只针对代码管理方式为FTP的运行环境,如果你的运行环境代码管理方式不是FTP,请查阅其他的部分的说明文档。

# 下载FTP客户端

推荐使用FileZilla (opens new window)客户端,客户端支持Windows、Mac和Linux,请访问下载页面选择程序下载安装。

# 获取FTP连接信息

当前仅PHP的云空间运行环境使用FTP部署代码,创建一个该环境的应用后,从“运行环境管理”的“代码管理”功能处可以查询到应用的FTP连接信息。

  1. 登录云应用管理平台 https://sae.sinacloud.com (opens new window)

  2. 选择需要查询的应用,点击“操作”中的“管理”进入应用的管理主页

  3. 选择左侧导航的“运行环境管理”,“代码管理”进入代码管理页面即可查询FTP的连接信息:

    查询FTP的连接信息

# 新建一个站点并连接

  1. 打开FileZilla客户端,点击菜单中的“文件”,选择“站点管理器”:
站点管理器
  1. 点击新站点,输入FTP的连接信息
输入FTP连接信息

请注意

  • 加密方式需要选择“只使用普通FTP”
  • 登录类型选择“正常”
  1. 添加完成后,点击“连接”,连接到FTP服务端器

连接成功后,会列出服务端的文件列表:

FTP服务端的文件列表

# 设置FTP的编码

如果在Windows下上传带中文的文件或者文件夹,因为新浪云的服务端运行在Linux环境下,文件和文件夹的编码为utf-8,Windows文件的默认编码为GB2312

因此如果设置上传时的编码,上传中文的文件后看到的服务端编码将会是乱码。

打开“站点管理器”,选择刚添加的站点,选择“字符集”选项,勾选“强制 UTF-8”,如图所示:

FTP强制使用UTF-8编码

# 设置连接模式

连接模式说明

目前FTP服务端只支持被动模式,请确保您的客户端支持被动模式。

打开“站点管理器”,选择刚添加的站点,选择“传输设置”选择,选择“被动”,如图所示:

FTP强制使用被动模式

# 上传一个文件

从本地站点选择代码的存储路径,在需要上传的文件上点击右键,选择“上传”,就可以把文件加到上传的队列中:

FTP上传文件

上传成功后,从“远程站点”下就可以看到上传的文件:

FTP上传文件成功

# 修改FTP密码

可以从在线管理平台修改FTP的密码,修改FTP密码后立即生效。

从应用的管理中心,选择左侧“运行环境管理”,进入“代码管理”进入管理中心,选择“FTP”标签可以看到修改密码的入口。

修改FTP密码

关于FTP密码

FTP的密码请尽量使用包含数字、及大小写字符的组合,不要使用常用密码及弱口令,FTP密码泄露会导致网站源码泄露,存在极大的安全风险。

# FTP IP校验

FTP的协议设计时有两个通道,一个是命令通道,另外一个是数据通道,通常情况下,这两个通道使用同一个客户端IP但是使用不同的客户端端口。

新浪云提供的FTP服务器默认校验这两个IP是否一致,如果不一致会报425 Rejected data connection from foreign address错误,出现这个错误是因为两个通道的IP不一致。

如果不在极端的网络环境下,请不要关闭这个特性,如果需要开启,请从FTP的设置页面关闭,从应用的管理中心,选择左侧“运行环境管理”,进入“代码管理”进入管理中心,选择“FTP”标签可以看到修改配置的入口。

修改FTP IP校验

# War包上传

说明

War包部署仅适用于Java运行环境,如果应用不是Java运行环境,请选择其他类型的代码部署方式查看。

进入应用的管理中心,左侧导航选择“运行环境管理”,再选择“war包管理”即可进入war包上传的功能,在本地导出项目的war包(war包需要包含项目需要的所有jar包),上传war包没有大小限制。

War包部署

上传war包后的部署将由系统异步完成,可以关闭浏览器或者在本页面继续等待查看导入的任务状态,部署中原来的容器实例将会逐个重新部署。

# SSH客户端

说明

容器虚拟机支持SSH登录,其他的运行环境暂时不支持通过SSH管理,如果代码的运行环境不是容器虚拟机,请参考其他章节的代码部署说明。

# Windows环境

新浪云自定义运行环境支持证书通过SSH登录到启动的容器虚拟机,如果你使用的是Windows环境,在完成以下步骤后可以登录。

# 生成SSH证书

  1. 下载Git for Windows

使用Git for Windows的ssh-keygen命令,从https://git-for-windows.github.io (opens new window)下载并完成安装。

  1. 使用ssh-keygen.exe命令

在任意文件下空白处点击右键,选择Git Bash,如下图所示:

使用ssh-keygen.exe命令

输入命令ssh-keygen.exe,一路回车,如下图所示: 使用ssh-keygen.exe命令

3、查看生成的公钥

输入命令notepad.exe 文件路径使用记事本直接打开生成的公钥文件,文件路径在第二步有输出,例如/c/Users/37708/.ssh/id_rsa.pub,如图所示:

查看密钥

# 上传公钥到新浪云

  1. 进入新浪云用户中心,选择左侧“用户信息”,进入“SSH密钥管理”上传,如图所示: 如何上传密钥

  2. 点击“+创建SSH密钥”,输入一个标题(可以任意,起标记作用),内容处填写上述用记事本打开的文件公钥文件内容,如图所示:

输入密钥

点击“确定”完成上传。

# 通过SSH客户端登录到容器

Windows下SSH客户端我们推荐你使用Xshell(也可以使用其他的客户端,我们教程中仅以Xshell为例),Xshell下载地址:https://www.netsarang.com/products/xsh_overview.html (opens new window),请下载并完成安装。

  1. 从容器的管理页面获取SSH登录信息

进入应用的管理中心,左侧导航选择“运行环境管理” - “容器管理”进入容器管理页面,点击“SSH登录”查询登录信息,如图所示:

查询SSH登录信息
  • 端口为:60022
  • 用户名为:应用名(例如douyu1
  1. 通过Xshell登录

点击“文件” -> "新建会话",主机处填写“ssh.sinacloud.com”,端口处填写“60022”,如图所示:

在Xshell中输入信息

点击“用户身份验证”配置登录信息为:

  • 方法选择:Public key
  • 用户名为:应用的二级域名前缀
  • 用户密钥:选择刚生成的私钥文件,一般文件名叫id_rsa,通常路径在 C:\Users\你的windows用户名\.ssh\ 这个目录下,如下图所示:
在Xshell中选择私钥证书

点击确定即可登录容器,登录后如下:

SSH登录后

# Linux环境

新浪云自定义运行环境支持证书通过SSH登录到启动的容器虚拟机,如果你使用的是Linux环境,在完成以下步骤后可以登录。

# 生成SSH证书

执行命令ssh-keygen一路回车,如下图所示:

Linux生成ID RSA

生成的公钥和私钥文件默认都存在~/.ssh/目录下,查看公钥文件并上传:

Linux下查看IDRSA文件内容

# 上传公钥到新浪云

  1. 进入新浪云用户中心,选择左侧“用户信息”,进入“SSH密钥管理”上传,如图所示: 如何上传密钥

  2. 点击“+创建SSH密钥”,输入一个标题(可以任意,起标记作用),内容处填写上述用记事本打开的文件公钥文件内容,如图所示:

输入密钥

点击“确定”完成上传。

# 通过SSH客户端登录到容器

  1. 从容器的管理页面获取SSH登录信息

进入应用的管理中心,左侧导航选择“运行环境管理” - “容器管理”进入容器管理页面,点击“SSH登录”查询登录信息,如图所示:

查询SSH登录信息
  • 端口为:60022
  • 用户名为:应用名(例如douyu1
  1. 通过SSH客户端登录

从终端执行:

ssh -p 60022 你的应用名@ssh.sinacloud.com 
SSH登录后

请注意

如果你的私钥文件不在默认的路径下,可以通过 -i 指定证书位置,如:ssh -i ~/.ssh/id_rsa -p 60022 你的应用名@ssh.sinacloud.com

# Mac环境

新浪云自定义运行环境支持证书通过SSH登录到启动的容器虚拟机,如果你使用的是Linux环境,在完成以下步骤后可以登录。

# 生成SSH证书

执行命令ssh-keygen一路回车,如下图所示:

Mac执行ssh-keygen

生成的公钥和私钥文件默认都存在~/.ssh/目录下,查看公钥文件并上传:

mac获取本地的公钥文件内容

# 上传公钥到新浪云

  1. 进入新浪云用户中心,选择左侧“用户信息”,进入“SSH密钥管理”上传,如图所示: 如何上传密钥

  2. 点击“+创建SSH密钥”,输入一个标题(可以任意,起标记作用),内容处填写上述用记事本打开的文件公钥文件内容,如图所示:

输入密钥

点击“确定”完成上传。

# 通过SSH客户端登录到容器

  1. 从容器的管理页面获取SSH登录信息

进入应用的管理中心,左侧导航选择“运行环境管理” - “容器管理”进入容器管理页面,点击“SSH登录”查询登录信息,如图所示:

查询SSH登录信息
  • 端口为:60022
  • 用户名为:应用名(例如douyu1
  1. 通过SSH客户端登录

从终端执行:

ssh -p 60022 你的应用名@ssh.sinacloud.com 
SSH登录后

请注意

如果你的私钥文件不在默认的路径下,可以通过 -i 指定证书位置,如:ssh -i ~/.ssh/id_rsa -p 60022 你的应用名@ssh.sinacloud.com