TIP

github的Pags服务在国内访问速度太慢了,因此我就想着在部署的时候就往码云上也提交一份代码,但是码云却并不会自动部署代码到Pags服务中,本片就是为解决这个。

# 简述

码云在国内的访问速度很快,缺点就是自动部署是会员服务,一年得要99,但是我想要免费的,爬虫 + github actions正好可以帮助我做到这一点。

# 代码编写

昨天刚刚学会了怎么登录网站,这可以帮助我拿到网站得Cookie,有了这个我就有权限对仓库进行操作了。

第二步,要找到部署的实际地址,这个也很简单,打开gitee Pages服务页面,然后再打开调试页面,放到Network那一栏,点击更新(实际就是重新部署的作用),最后我找到了rebuild这个请求,这个不就是重新构建的意思,再看看里面包含有Form Data这个就是提交的form表单,就是它没错了。

接着我就尝试着模拟这个请求,但最开始按照往常的方法总是请求失败,后来随着添加的参数越来越多,终于是可以请求成功了,后来测试了一下这个请求时有效的,可以实现部署的作用。

import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
public class autoBuild {
	public static void main(String[] args) {
		try {
			Connection.Response res = Jsoup.connect("https://gitee.com/srcrs/srcrs/pages/rebuild")
					.ignoreContentType(true)
					.followRedirects(true)
					.referrer("https://gitee.com/srcrs/srcrs/pages")
					.header("x-csrf-token", "F85hxpxjSlddp6kfpewaa1h+zonyI/W4SB5JB/urBNY=")
					.header("x-requested-with", "XMLHttpRequest")
					.data("branch","master")
					.data("build_directory","")
					.data("force_https","true")
					.header("authority", "gitee.com")
					.header("path", "/srcrs/srcrs/pages/rebuild")
					.header("scheme", "https")
					.header("accept", "*/*")
					.header("dnt", "1")
					.method(Method.POST)
					.cookie("cookie", "oschina_new_user=false; user_locale=zh-CN; remove_bulletin=gitee-maintain-1582772523; remote_way=http; Serve_State=true; remember_user_token=BAhbB1sGaQP9m1dJIiIkMmEkMTAkUFkxdGZvMmVlaDZHb1VaV00zL3BSZQY6BkVU--f5eecf67bdfe9126a0bd2760cb0e6e80063d4139; tz=Asia%2FShanghai; Hm_lvt_24f17767262929947cc3631f99bfd274=1583204132,1583295272,1583435853,1583472926; Hm_lpvt_24f17767262929947cc3631f99bfd274=1583472940; gitee-session-n=BAh7CUkiD3Nlc3Npb25faWQGOgZFVEkiJTRlMDdhYmEyN2JiMGZmYjY0MGQ4NWJjY2ZlZWFjNTc2BjsAVEkiGXdhcmRlbi51c2VyLnVzZXIua2V5BjsAVFsHWwZpA%2F2bV0kiIiQyYSQxMCRQWTF0Zm8yZWVoNkdvVVpXTTMvcFJlBjsAVEkiHXdhcmRlbi51c2VyLnVzZXIuc2Vzc2lvbgY7AFR7BkkiFGxhc3RfcmVxdWVzdF9hdAY7AFRJdToJVGltZQ3FCB7AO8uqkQk6DW5hbm9fbnVtaQJ0AjoNbmFub19kZW5pBjoNc3VibWljcm8iB2KAOgl6b25lSSIIVVRDBjsARkkiEF9jc3JmX3Rva2VuBjsARkkiMUY4NWh4cHhqU2xkZHA2a2ZwZXdhYTFoK3pvbnlJL1c0U0I1SkIvdXJCTlk9BjsARg%3D%3D--69cf92f5308eaf529cd0a7018877e1bda1278de7")
					.userAgent("Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Mobile Safari/537.36")
					.execute();
            System.out.println("srcrs");
			//Map<String,String> map = res.cookies();
			//for(String s : map.keySet()) {
			//	System.out.println(s + " : " + map.get(s));
			//}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

这个Cookie时手动获取的,由于不知道Cookie什么时候会过期,所以代码存在着不稳定性,随时可能面临身份验证失败,所以下面将会实现自动获取Cookie并部署。

可以登录成功并且获取到了Cookie,但是Cookie获取到的值并不完整导致请求一直失败,暂时先看看这个有效期时多久时间,再做打算。

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class autoBuild {
	public static void main(String[] args) {
		try {
			Connection.Response res = Jsoup.connect("https://gitee.com/login")
					.userAgent("Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Mobile Safari/537.36")
					.execute();
			Map<String,String> datas = new HashMap<>();
			Document doc = Jsoup.parse(res.body());
			List<Element> list = doc.select("form");
			for(int i = 0;i < list.size(); i++) {
				for(Element e : list.get(i).getAllElements()) {
					if(e.attr("name").equals("user[login]")) {
						e.attr("value","账户名");
					}
					if(e.attr("name").equals("user[password]")) {
						e.attr("value","密码");
					}
					if(e.attr("name").length() > 0) {
						datas.put(e.attr("name"), e.attr("value"));
					}
				}
			}
			Connection.Response login = Jsoup.connect("https://gitee.com/login")
					.userAgent("Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Mobile Safari/537.36")
					.followRedirects(true)
					.ignoreContentType(true)
					.referrer("https://gitee.com/login")
					.method(Method.POST)
					.maxBodySize(Integer.MAX_VALUE)
					.data(datas)
					.cookies(res.cookies())
					.maxBodySize(0)
					.execute();
			Map<String,String> map = login.cookies();
			System.out.println(map.size());
			for(String s : map.keySet()) {
				System.out.println(s + " : " + map.get(s));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

# 代码运行

有了自动部署的代码以后,还是不行啊,总不能每次提交完一次代码就要,就要手动运行一次代码,这还不如网页上操作呢,复杂不了多少。这显然不是我的初衷。

我想的是,让这个代码在github actions里面运行,当上面的自动化流程结束之后,相当于代码已经自动提交了,但是gitee的Pages还没有更新,这个时候在运行这段java代码就可以,完成自动部署的功能了。

只需要在文件中再添加一项任务就可以了,重要的时要配置好环境,以及如何在命令行中带jar包运行java代码。

前提将jar包和源文件放到一个文件夹里,注意源文件不要带包名。

在windows中

javac -cp jsoup-1.12.2.jar; autoBuild.java
java -cp jsoup-1.12.2.jar; autoBuild

在linux中

javac -cp ./jsoup-1.12.2.jar autoBuild.java
java -cp $CLASSPATH:jsoup-1.12.2.jar autoBuild

然后再提供一下我的github actions自动化代码。

name: scrrs deployer # Actions 名字
on: 
  push:
    branches:
      - vue
jobs:
  build: 
    name: Build and publish
    runs-on: ubuntu-latest 
    steps:
      - uses: actions/checkout@v1
      - name: Use Node.js 10.x
        uses: actions/setup-node@v1
        with:
          node-version: 10.x
      - name: Setup Environmental Science 
        run: |
           npm install -g vuepress
           npm install
      - name: Generate public files 
        run: |
          npm run build 
      - name: Deploy
        env: 
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          GE_TOKEN: ${{ secrets.GE_TOKEN }}
          GH_REP: ${{ secrets.GH_REP }}
          GE_REP: ${{ secrets.GE_REP }}
        run: |
          cd ./public
          git init
          git config user.name "srcrs"
          git config user.email "531238678@qq.com"
          git add .
          git commit -m "自动部署"
          git push --force --quiet "https://${GH_TOKEN}@${GH_REP}" master:master
          git push --force --quiet "https://${GE_TOKEN}@${GE_REP}" master:master
  auto:
    needs: build
    name: auto deploy gitee
    runs-on: ubuntu-latest 
    steps:
      - uses: actions/checkout@v1
      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Build with gitee
        run: |
          cd ./gitee
          javac -cp ./jsoup-1.12.2.jar autoBuild.java
          java -cp $CLASSPATH:jsoup-1.12.2.jar autoBuild

在build任务完成之后,然后再执行auto deploy gitee任务,就可以达到自己的要求了。

还是有些不甘心,怕Cookie哪天过期了不能用了,又得再修改,先看看吧,假如一个月都不用修改,这也是个不错的方式。